From 4acbc03b35f4cb989f8761ada00c32089305aac5 Mon Sep 17 00:00:00 2001 From: Joshua Oosthuizen Date: Thu, 3 Sep 2026 13:27:19 +0200 Subject: [PATCH] Initial commit: multi-company financial management system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root company app (src/, client/) — GL foundation, AR, and AP: - Segmented Chart of Accounts (Sage 300-style), double-entry PostingService with three-layer balance enforcement (app validation, CHECK constraints, deferred DB trigger), gap-free document numbering, RBAC with branch restrictions. - Accounts Receivable: Customers, Invoices, Credit Notes, Receipts with allocation, all posting through PostingService. - Accounts Payable: Suppliers, Supplier Invoices, Debit Notes, Payments with allocation, mirroring AR's posting pattern. - Tax Codes shared between AR and AP. - Company-app login is a token handoff from the Account Manager (RS256, single-use, company-scoped) rather than a local password. - Frontend reskinned to the approved mockup: navy sidebar, dashboard, tree-view Chart of Accounts, Customer/Supplier 360 pages. Account Manager (manager/, manager/client/) — central login gateway: - Password + TOTP 2FA + Google/Microsoft OAuth, company picker, and the RS256 handoff token issuance that the company app verifies. Covered by unit + integration tests against a real Postgres database (GL balance invariants, AR/AP posting correctness and allocation limits, the full handoff exchange including replay/cross-company/expiry/forgery rejection). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01Tq2DbEvzHzs13jDFhLaX44 --- .env.example | 10 + .eslintrc.json | 46 + .gitignore | 9 + PHASE_1.5_TEST_PLAN.md | 153 + PHASE_2_AR_TEST_PLAN.md | 113 + PHASE_3_AP_TEST_PLAN.md | 90 + SETUP.md | 46 + client/.env.example | 2 + client/.gitignore | 25 + client/.oxlintrc.json | 8 + client/README.md | 32 + client/index.html | 16 + client/package-lock.json | 2964 ++++++ client/package.json | 37 + client/public/favicon.svg | 1 + client/public/icons.svg | 24 + client/src/App.tsx | 15 + client/src/api/apDebitNotes.api.ts | 51 + client/src/api/apInvoices.api.ts | 46 + client/src/api/apPayments.api.ts | 43 + client/src/api/arCreditNotes.api.ts | 51 + client/src/api/arInvoices.api.ts | 46 + client/src/api/arReceipts.api.ts | 43 + client/src/api/auth.api.ts | 18 + client/src/api/client.ts | 53 + client/src/api/customers.api.ts | 37 + client/src/api/fiscalPeriods.api.ts | 12 + client/src/api/glAccounts.api.ts | 24 + client/src/api/journalEntries.api.ts | 40 + client/src/api/journals.api.ts | 19 + client/src/api/roles.api.ts | 17 + client/src/api/segments.api.ts | 37 + client/src/api/suppliers.api.ts | 36 + client/src/api/taxCodes.api.ts | 24 + client/src/api/users.api.ts | 24 + .../src/components/common/BranchSwitcher.tsx | 29 + .../src/components/common/ConfirmDialog.tsx | 30 + client/src/components/common/MoneyCell.tsx | 10 + client/src/components/common/StatusChip.tsx | 15 + .../admin/coa/AdminChartOfAccountsPage.tsx | 157 + .../features/admin/coa/GLAccountDialog.tsx | 138 + .../admin/fiscal/AdminFiscalYearsPage.tsx | 70 + .../admin/journals/AdminJournalsPage.tsx | 33 + .../features/admin/journals/JournalDialog.tsx | 71 + .../admin/segments/AdminSegmentsPage.tsx | 77 + .../segments/SegmentDefinitionDialog.tsx | 83 + .../admin/segments/SegmentValueDialog.tsx | 58 + .../features/admin/tax/AdminTaxCodesPage.tsx | 49 + .../src/features/admin/tax/TaxCodeDialog.tsx | 50 + .../features/admin/users/AdminUsersPage.tsx | 65 + .../admin/users/RolePermissionMatrix.tsx | 53 + .../src/features/admin/users/UserDialog.tsx | 100 + .../ap/debitNotes/DebitNoteDetailPage.tsx | 186 + .../ap/debitNotes/DebitNoteFormPage.tsx | 153 + .../ap/invoices/InvoiceDetailPage.tsx | 224 + .../features/ap/invoices/InvoiceFormPage.tsx | 164 + .../features/ap/invoices/InvoicesListPage.tsx | 65 + .../ap/payments/PaymentDetailPage.tsx | 140 + .../features/ap/payments/PaymentFormPage.tsx | 105 + .../features/ap/payments/PaymentsListPage.tsx | 64 + .../features/ap/shared/APAllocationPanel.tsx | 126 + .../ap/shared/APDocumentLineEditor.tsx | 142 + .../ap/suppliers/SupplierDetailPage.tsx | 218 + .../features/ap/suppliers/SupplierDialog.tsx | 88 + .../ap/suppliers/SuppliersListPage.tsx | 57 + .../ar/creditNotes/CreditNoteDetailPage.tsx | 186 + .../ar/creditNotes/CreditNoteFormPage.tsx | 153 + .../ar/customers/CustomerDetailPage.tsx | 224 + .../features/ar/customers/CustomerDialog.tsx | 101 + .../ar/customers/CustomersListPage.tsx | 66 + .../ar/invoices/InvoiceDetailPage.tsx | 224 + .../features/ar/invoices/InvoiceFormPage.tsx | 178 + .../features/ar/invoices/InvoicesListPage.tsx | 65 + .../ar/receipts/ReceiptDetailPage.tsx | 140 + .../features/ar/receipts/ReceiptFormPage.tsx | 105 + .../features/ar/receipts/ReceiptsListPage.tsx | 64 + .../features/ar/shared/AllocationPanel.tsx | 126 + .../features/ar/shared/DocumentLineEditor.tsx | 142 + client/src/features/auth/HandoffPage.tsx | 42 + .../src/features/dashboard/DashboardPage.tsx | 197 + .../src/features/gl/GLAccountLedgerView.tsx | 129 + .../features/gl/JournalEntryDetailPage.tsx | 144 + .../src/features/gl/JournalEntryFormPage.tsx | 255 + .../src/features/gl/JournalEntryListPage.tsx | 78 + client/src/features/reports/ReportsPage.tsx | 88 + client/src/hooks/useAPDebitNotes.ts | 55 + client/src/hooks/useAPInvoices.ts | 37 + client/src/hooks/useAPPayments.ts | 48 + client/src/hooks/useARCreditNotes.ts | 55 + client/src/hooks/useARInvoices.ts | 37 + client/src/hooks/useARReceipts.ts | 48 + client/src/hooks/useAuth.ts | 22 + client/src/hooks/useBranchScope.ts | 22 + client/src/hooks/useCustomers.ts | 34 + client/src/hooks/useFiscalYears.ts | 14 + client/src/hooks/useGLAccounts.ts | 19 + client/src/hooks/useJournalEntries.ts | 37 + client/src/hooks/useJournals.ts | 14 + client/src/hooks/useRoles.ts | 19 + client/src/hooks/useSegments.ts | 29 + client/src/hooks/useSuppliers.ts | 34 + client/src/hooks/useTaxCodes.ts | 22 + client/src/hooks/useUsers.ts | 22 + client/src/index.css | 7 + client/src/layouts/MainLayout.tsx | 243 + client/src/main.tsx | 17 + client/src/routes/AppRouter.tsx | 111 + client/src/routes/ProtectedRoute.tsx | 36 + client/src/store/authStore.ts | 32 + client/src/store/branchStore.ts | 25 + client/src/theme.ts | 58 + client/src/types/api.ts | 379 + client/tsconfig.app.json | 26 + client/tsconfig.json | 7 + client/tsconfig.node.json | 23 + client/vite.config.ts | 7 + jest.config.js | 10 + jest.integration.config.js | 9 + manager/.env.example | 30 + manager/.eslintrc.json | 21 + manager/.gitignore | 8 + manager/SETUP.md | 38 + manager/client/.env.example | 1 + manager/client/.gitignore | 25 + manager/client/.oxlintrc.json | 8 + manager/client/README.md | 32 + manager/client/index.html | 13 + manager/client/package-lock.json | 2663 +++++ manager/client/package.json | 32 + manager/client/public/favicon.svg | 1 + manager/client/public/icons.svg | 24 + manager/client/src/App.tsx | 15 + manager/client/src/api/auth.api.ts | 39 + manager/client/src/api/client.ts | 53 + manager/client/src/api/companies.api.ts | 18 + .../client/src/features/auth/LoginPage.tsx | 66 + .../src/features/auth/OAuthCallbackPage.tsx | 59 + .../features/auth/SecuritySettingsPage.tsx | 75 + .../features/auth/TwoFactorChallengePage.tsx | 60 + .../features/companies/CompanyPickerPage.tsx | 123 + manager/client/src/hooks/useAuth.ts | 33 + manager/client/src/hooks/useCompanies.ts | 10 + manager/client/src/index.css | 7 + manager/client/src/main.tsx | 17 + manager/client/src/routes/AppRouter.tsx | 25 + manager/client/src/routes/ProtectedRoute.tsx | 10 + manager/client/src/store/authStore.ts | 28 + manager/client/src/theme.ts | 14 + manager/client/tsconfig.app.json | 26 + manager/client/tsconfig.json | 7 + manager/client/tsconfig.node.json | 23 + manager/client/vite.config.ts | 10 + manager/jest.config.js | 8 + manager/jest.integration.config.js | 8 + manager/package-lock.json | 7147 ++++++++++++++ manager/package.json | 53 + .../20260902134429_init/migration.sql | 155 + manager/prisma/migrations/migration_lock.toml | 3 + manager/prisma/schema.prisma | 129 + manager/prisma/seed.ts | 53 + manager/scripts/generateHandoffKeys.ts | 40 + manager/src/app.ts | 24 + manager/src/config/env.ts | 37 + manager/src/lib/asyncHandler.ts | 10 + manager/src/lib/handoffToken.ts | 39 + manager/src/lib/jwt.ts | 52 + manager/src/lib/oauth.ts | 102 + manager/src/lib/prisma.ts | 12 + manager/src/lib/totp.ts | 40 + manager/src/middleware/auth.ts | 31 + manager/src/middleware/errorHandler.ts | 20 + manager/src/middleware/requireOperator.ts | 13 + manager/src/middleware/validate.ts | 19 + manager/src/modules/auth/auth.controller.ts | 122 + manager/src/modules/auth/auth.routes.ts | 35 + manager/src/modules/auth/auth.service.ts | 145 + .../modules/companies/companies.controller.ts | 32 + .../src/modules/companies/companies.routes.ts | 11 + .../modules/companies/companies.service.ts | 60 + manager/src/server.ts | 9 + manager/src/types/express.d.ts | 14 + manager/tests/integration/handoff.spec.ts | 59 + manager/tests/unit/handoffToken.spec.ts | 52 + manager/tsconfig.json | 19 + package-lock.json | 8785 +++++++++++++++++ package.json | 54 + .../add_journal_balance_trigger.sql | 53 + .../20260901183415_init/migration.sql | 353 + .../migration.sql | 54 + .../migration.sql | 17 + .../migration.sql | 271 + .../migration.sql | 237 + prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 681 ++ prisma/seed.ts | 315 + scripts/smokeTest.ts | 95 + src/app.ts | 54 + src/config/env.ts | 34 + src/lib/asyncHandler.ts | 10 + src/lib/branchFilter.ts | 41 + src/lib/controlAccounts.ts | 35 + src/lib/handoffVerify.ts | 50 + src/lib/jwt.ts | 21 + src/lib/money.ts | 12 + src/lib/prisma.ts | 12 + src/lib/sequence.ts | 18 + src/middleware/auth.ts | 54 + src/middleware/branchScope.ts | 15 + src/middleware/errorHandler.ts | 43 + src/middleware/rbac.ts | 15 + src/middleware/validate.ts | 19 + src/modules/ap/ap.errors.ts | 13 + src/modules/ap/apAllocations.service.ts | 67 + src/modules/ap/apDebitNotes.controller.ts | 59 + src/modules/ap/apDebitNotes.routes.ts | 37 + src/modules/ap/apDebitNotes.service.ts | 119 + src/modules/ap/apInvoices.controller.ts | 49 + src/modules/ap/apInvoices.routes.ts | 24 + src/modules/ap/apInvoices.service.ts | 114 + src/modules/ap/apPayments.controller.ts | 51 + src/modules/ap/apPayments.routes.ts | 32 + src/modules/ap/apPayments.service.ts | 82 + src/modules/ap/apPosting.service.ts | 161 + src/modules/ap/suppliers.controller.ts | 39 + src/modules/ap/suppliers.routes.ts | 28 + src/modules/ap/suppliers.service.ts | 57 + src/modules/ar/ar.errors.ts | 13 + src/modules/ar/arAllocations.service.ts | 70 + src/modules/ar/arCreditNotes.controller.ts | 59 + src/modules/ar/arCreditNotes.routes.ts | 37 + src/modules/ar/arCreditNotes.service.ts | 119 + src/modules/ar/arInvoices.controller.ts | 49 + src/modules/ar/arInvoices.routes.ts | 24 + src/modules/ar/arInvoices.service.ts | 114 + src/modules/ar/arPosting.service.ts | 162 + src/modules/ar/arReceipts.controller.ts | 51 + src/modules/ar/arReceipts.routes.ts | 32 + src/modules/ar/arReceipts.service.ts | 82 + src/modules/ar/customers.controller.ts | 40 + src/modules/ar/customers.routes.ts | 28 + src/modules/ar/customers.service.ts | 58 + src/modules/auth/auth.controller.ts | 44 + src/modules/auth/auth.routes.ts | 11 + src/modules/auth/auth.service.ts | 52 + .../company/fiscalPeriods.controller.ts | 16 + src/modules/company/fiscalPeriods.routes.ts | 18 + src/modules/company/fiscalPeriods.service.ts | 30 + src/modules/company/segments.controller.ts | 36 + src/modules/company/segments.routes.ts | 32 + src/modules/company/segments.service.ts | 39 + src/modules/gl/glAccounts.controller.ts | 43 + src/modules/gl/glAccounts.routes.ts | 25 + src/modules/gl/glAccounts.service.ts | 102 + src/modules/gl/journalEntries.controller.ts | 47 + src/modules/gl/journalEntries.routes.ts | 33 + src/modules/gl/journalEntries.service.ts | 52 + src/modules/gl/journals.controller.ts | 19 + src/modules/gl/journals.routes.ts | 18 + src/modules/gl/journals.service.ts | 17 + src/modules/gl/posting.service.ts | 136 + src/modules/gl/posting.types.ts | 48 + src/modules/tax/taxCodes.controller.ts | 26 + src/modules/tax/taxCodes.routes.ts | 20 + src/modules/tax/taxCodes.service.ts | 20 + src/modules/users/roles.controller.ts | 20 + src/modules/users/roles.routes.ts | 19 + src/modules/users/roles.service.ts | 17 + src/modules/users/users.controller.ts | 28 + src/modules/users/users.routes.ts | 20 + src/modules/users/users.service.ts | 43 + src/server.ts | 9 + src/types/express.d.ts | 18 + .../mockups/Cross Financial Manage Mockup.png | Bin 0 -> 1488565 bytes tests/integration/ap.posting.spec.ts | 235 + tests/integration/ar.posting.spec.ts | 235 + tests/integration/handoff.spec.ts | 82 + tests/integration/posting.balance.spec.ts | 126 + tests/unit/posting.validation.spec.ts | 93 + tsconfig.json | 23 + 279 files changed, 38537 insertions(+) create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 PHASE_1.5_TEST_PLAN.md create mode 100644 PHASE_2_AR_TEST_PLAN.md create mode 100644 PHASE_3_AP_TEST_PLAN.md create mode 100644 SETUP.md create mode 100644 client/.env.example create mode 100644 client/.gitignore create mode 100644 client/.oxlintrc.json create mode 100644 client/README.md create mode 100644 client/index.html create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/public/favicon.svg create mode 100644 client/public/icons.svg create mode 100644 client/src/App.tsx create mode 100644 client/src/api/apDebitNotes.api.ts create mode 100644 client/src/api/apInvoices.api.ts create mode 100644 client/src/api/apPayments.api.ts create mode 100644 client/src/api/arCreditNotes.api.ts create mode 100644 client/src/api/arInvoices.api.ts create mode 100644 client/src/api/arReceipts.api.ts create mode 100644 client/src/api/auth.api.ts create mode 100644 client/src/api/client.ts create mode 100644 client/src/api/customers.api.ts create mode 100644 client/src/api/fiscalPeriods.api.ts create mode 100644 client/src/api/glAccounts.api.ts create mode 100644 client/src/api/journalEntries.api.ts create mode 100644 client/src/api/journals.api.ts create mode 100644 client/src/api/roles.api.ts create mode 100644 client/src/api/segments.api.ts create mode 100644 client/src/api/suppliers.api.ts create mode 100644 client/src/api/taxCodes.api.ts create mode 100644 client/src/api/users.api.ts create mode 100644 client/src/components/common/BranchSwitcher.tsx create mode 100644 client/src/components/common/ConfirmDialog.tsx create mode 100644 client/src/components/common/MoneyCell.tsx create mode 100644 client/src/components/common/StatusChip.tsx create mode 100644 client/src/features/admin/coa/AdminChartOfAccountsPage.tsx create mode 100644 client/src/features/admin/coa/GLAccountDialog.tsx create mode 100644 client/src/features/admin/fiscal/AdminFiscalYearsPage.tsx create mode 100644 client/src/features/admin/journals/AdminJournalsPage.tsx create mode 100644 client/src/features/admin/journals/JournalDialog.tsx create mode 100644 client/src/features/admin/segments/AdminSegmentsPage.tsx create mode 100644 client/src/features/admin/segments/SegmentDefinitionDialog.tsx create mode 100644 client/src/features/admin/segments/SegmentValueDialog.tsx create mode 100644 client/src/features/admin/tax/AdminTaxCodesPage.tsx create mode 100644 client/src/features/admin/tax/TaxCodeDialog.tsx create mode 100644 client/src/features/admin/users/AdminUsersPage.tsx create mode 100644 client/src/features/admin/users/RolePermissionMatrix.tsx create mode 100644 client/src/features/admin/users/UserDialog.tsx create mode 100644 client/src/features/ap/debitNotes/DebitNoteDetailPage.tsx create mode 100644 client/src/features/ap/debitNotes/DebitNoteFormPage.tsx create mode 100644 client/src/features/ap/invoices/InvoiceDetailPage.tsx create mode 100644 client/src/features/ap/invoices/InvoiceFormPage.tsx create mode 100644 client/src/features/ap/invoices/InvoicesListPage.tsx create mode 100644 client/src/features/ap/payments/PaymentDetailPage.tsx create mode 100644 client/src/features/ap/payments/PaymentFormPage.tsx create mode 100644 client/src/features/ap/payments/PaymentsListPage.tsx create mode 100644 client/src/features/ap/shared/APAllocationPanel.tsx create mode 100644 client/src/features/ap/shared/APDocumentLineEditor.tsx create mode 100644 client/src/features/ap/suppliers/SupplierDetailPage.tsx create mode 100644 client/src/features/ap/suppliers/SupplierDialog.tsx create mode 100644 client/src/features/ap/suppliers/SuppliersListPage.tsx create mode 100644 client/src/features/ar/creditNotes/CreditNoteDetailPage.tsx create mode 100644 client/src/features/ar/creditNotes/CreditNoteFormPage.tsx create mode 100644 client/src/features/ar/customers/CustomerDetailPage.tsx create mode 100644 client/src/features/ar/customers/CustomerDialog.tsx create mode 100644 client/src/features/ar/customers/CustomersListPage.tsx create mode 100644 client/src/features/ar/invoices/InvoiceDetailPage.tsx create mode 100644 client/src/features/ar/invoices/InvoiceFormPage.tsx create mode 100644 client/src/features/ar/invoices/InvoicesListPage.tsx create mode 100644 client/src/features/ar/receipts/ReceiptDetailPage.tsx create mode 100644 client/src/features/ar/receipts/ReceiptFormPage.tsx create mode 100644 client/src/features/ar/receipts/ReceiptsListPage.tsx create mode 100644 client/src/features/ar/shared/AllocationPanel.tsx create mode 100644 client/src/features/ar/shared/DocumentLineEditor.tsx create mode 100644 client/src/features/auth/HandoffPage.tsx create mode 100644 client/src/features/dashboard/DashboardPage.tsx create mode 100644 client/src/features/gl/GLAccountLedgerView.tsx create mode 100644 client/src/features/gl/JournalEntryDetailPage.tsx create mode 100644 client/src/features/gl/JournalEntryFormPage.tsx create mode 100644 client/src/features/gl/JournalEntryListPage.tsx create mode 100644 client/src/features/reports/ReportsPage.tsx create mode 100644 client/src/hooks/useAPDebitNotes.ts create mode 100644 client/src/hooks/useAPInvoices.ts create mode 100644 client/src/hooks/useAPPayments.ts create mode 100644 client/src/hooks/useARCreditNotes.ts create mode 100644 client/src/hooks/useARInvoices.ts create mode 100644 client/src/hooks/useARReceipts.ts create mode 100644 client/src/hooks/useAuth.ts create mode 100644 client/src/hooks/useBranchScope.ts create mode 100644 client/src/hooks/useCustomers.ts create mode 100644 client/src/hooks/useFiscalYears.ts create mode 100644 client/src/hooks/useGLAccounts.ts create mode 100644 client/src/hooks/useJournalEntries.ts create mode 100644 client/src/hooks/useJournals.ts create mode 100644 client/src/hooks/useRoles.ts create mode 100644 client/src/hooks/useSegments.ts create mode 100644 client/src/hooks/useSuppliers.ts create mode 100644 client/src/hooks/useTaxCodes.ts create mode 100644 client/src/hooks/useUsers.ts create mode 100644 client/src/index.css create mode 100644 client/src/layouts/MainLayout.tsx create mode 100644 client/src/main.tsx create mode 100644 client/src/routes/AppRouter.tsx create mode 100644 client/src/routes/ProtectedRoute.tsx create mode 100644 client/src/store/authStore.ts create mode 100644 client/src/store/branchStore.ts create mode 100644 client/src/theme.ts create mode 100644 client/src/types/api.ts create mode 100644 client/tsconfig.app.json create mode 100644 client/tsconfig.json create mode 100644 client/tsconfig.node.json create mode 100644 client/vite.config.ts create mode 100644 jest.config.js create mode 100644 jest.integration.config.js create mode 100644 manager/.env.example create mode 100644 manager/.eslintrc.json create mode 100644 manager/.gitignore create mode 100644 manager/SETUP.md create mode 100644 manager/client/.env.example create mode 100644 manager/client/.gitignore create mode 100644 manager/client/.oxlintrc.json create mode 100644 manager/client/README.md create mode 100644 manager/client/index.html create mode 100644 manager/client/package-lock.json create mode 100644 manager/client/package.json create mode 100644 manager/client/public/favicon.svg create mode 100644 manager/client/public/icons.svg create mode 100644 manager/client/src/App.tsx create mode 100644 manager/client/src/api/auth.api.ts create mode 100644 manager/client/src/api/client.ts create mode 100644 manager/client/src/api/companies.api.ts create mode 100644 manager/client/src/features/auth/LoginPage.tsx create mode 100644 manager/client/src/features/auth/OAuthCallbackPage.tsx create mode 100644 manager/client/src/features/auth/SecuritySettingsPage.tsx create mode 100644 manager/client/src/features/auth/TwoFactorChallengePage.tsx create mode 100644 manager/client/src/features/companies/CompanyPickerPage.tsx create mode 100644 manager/client/src/hooks/useAuth.ts create mode 100644 manager/client/src/hooks/useCompanies.ts create mode 100644 manager/client/src/index.css create mode 100644 manager/client/src/main.tsx create mode 100644 manager/client/src/routes/AppRouter.tsx create mode 100644 manager/client/src/routes/ProtectedRoute.tsx create mode 100644 manager/client/src/store/authStore.ts create mode 100644 manager/client/src/theme.ts create mode 100644 manager/client/tsconfig.app.json create mode 100644 manager/client/tsconfig.json create mode 100644 manager/client/tsconfig.node.json create mode 100644 manager/client/vite.config.ts create mode 100644 manager/jest.config.js create mode 100644 manager/jest.integration.config.js create mode 100644 manager/package-lock.json create mode 100644 manager/package.json create mode 100644 manager/prisma/migrations/20260902134429_init/migration.sql create mode 100644 manager/prisma/migrations/migration_lock.toml create mode 100644 manager/prisma/schema.prisma create mode 100644 manager/prisma/seed.ts create mode 100644 manager/scripts/generateHandoffKeys.ts create mode 100644 manager/src/app.ts create mode 100644 manager/src/config/env.ts create mode 100644 manager/src/lib/asyncHandler.ts create mode 100644 manager/src/lib/handoffToken.ts create mode 100644 manager/src/lib/jwt.ts create mode 100644 manager/src/lib/oauth.ts create mode 100644 manager/src/lib/prisma.ts create mode 100644 manager/src/lib/totp.ts create mode 100644 manager/src/middleware/auth.ts create mode 100644 manager/src/middleware/errorHandler.ts create mode 100644 manager/src/middleware/requireOperator.ts create mode 100644 manager/src/middleware/validate.ts create mode 100644 manager/src/modules/auth/auth.controller.ts create mode 100644 manager/src/modules/auth/auth.routes.ts create mode 100644 manager/src/modules/auth/auth.service.ts create mode 100644 manager/src/modules/companies/companies.controller.ts create mode 100644 manager/src/modules/companies/companies.routes.ts create mode 100644 manager/src/modules/companies/companies.service.ts create mode 100644 manager/src/server.ts create mode 100644 manager/src/types/express.d.ts create mode 100644 manager/tests/integration/handoff.spec.ts create mode 100644 manager/tests/unit/handoffToken.spec.ts create mode 100644 manager/tsconfig.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 prisma/manual-sql/add_journal_balance_trigger.sql create mode 100644 prisma/migrations/20260901183415_init/migration.sql create mode 100644 prisma/migrations/20260901183438_add_journal_balance_trigger/migration.sql create mode 100644 prisma/migrations/20260902134528_add_handoff_auth/migration.sql create mode 100644 prisma/migrations/20260903100927_add_ar_module/migration.sql create mode 100644 prisma/migrations/20260903104749_add_ap_module/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 prisma/seed.ts create mode 100644 scripts/smokeTest.ts create mode 100644 src/app.ts create mode 100644 src/config/env.ts create mode 100644 src/lib/asyncHandler.ts create mode 100644 src/lib/branchFilter.ts create mode 100644 src/lib/controlAccounts.ts create mode 100644 src/lib/handoffVerify.ts create mode 100644 src/lib/jwt.ts create mode 100644 src/lib/money.ts create mode 100644 src/lib/prisma.ts create mode 100644 src/lib/sequence.ts create mode 100644 src/middleware/auth.ts create mode 100644 src/middleware/branchScope.ts create mode 100644 src/middleware/errorHandler.ts create mode 100644 src/middleware/rbac.ts create mode 100644 src/middleware/validate.ts create mode 100644 src/modules/ap/ap.errors.ts create mode 100644 src/modules/ap/apAllocations.service.ts create mode 100644 src/modules/ap/apDebitNotes.controller.ts create mode 100644 src/modules/ap/apDebitNotes.routes.ts create mode 100644 src/modules/ap/apDebitNotes.service.ts create mode 100644 src/modules/ap/apInvoices.controller.ts create mode 100644 src/modules/ap/apInvoices.routes.ts create mode 100644 src/modules/ap/apInvoices.service.ts create mode 100644 src/modules/ap/apPayments.controller.ts create mode 100644 src/modules/ap/apPayments.routes.ts create mode 100644 src/modules/ap/apPayments.service.ts create mode 100644 src/modules/ap/apPosting.service.ts create mode 100644 src/modules/ap/suppliers.controller.ts create mode 100644 src/modules/ap/suppliers.routes.ts create mode 100644 src/modules/ap/suppliers.service.ts create mode 100644 src/modules/ar/ar.errors.ts create mode 100644 src/modules/ar/arAllocations.service.ts create mode 100644 src/modules/ar/arCreditNotes.controller.ts create mode 100644 src/modules/ar/arCreditNotes.routes.ts create mode 100644 src/modules/ar/arCreditNotes.service.ts create mode 100644 src/modules/ar/arInvoices.controller.ts create mode 100644 src/modules/ar/arInvoices.routes.ts create mode 100644 src/modules/ar/arInvoices.service.ts create mode 100644 src/modules/ar/arPosting.service.ts create mode 100644 src/modules/ar/arReceipts.controller.ts create mode 100644 src/modules/ar/arReceipts.routes.ts create mode 100644 src/modules/ar/arReceipts.service.ts create mode 100644 src/modules/ar/customers.controller.ts create mode 100644 src/modules/ar/customers.routes.ts create mode 100644 src/modules/ar/customers.service.ts create mode 100644 src/modules/auth/auth.controller.ts create mode 100644 src/modules/auth/auth.routes.ts create mode 100644 src/modules/auth/auth.service.ts create mode 100644 src/modules/company/fiscalPeriods.controller.ts create mode 100644 src/modules/company/fiscalPeriods.routes.ts create mode 100644 src/modules/company/fiscalPeriods.service.ts create mode 100644 src/modules/company/segments.controller.ts create mode 100644 src/modules/company/segments.routes.ts create mode 100644 src/modules/company/segments.service.ts create mode 100644 src/modules/gl/glAccounts.controller.ts create mode 100644 src/modules/gl/glAccounts.routes.ts create mode 100644 src/modules/gl/glAccounts.service.ts create mode 100644 src/modules/gl/journalEntries.controller.ts create mode 100644 src/modules/gl/journalEntries.routes.ts create mode 100644 src/modules/gl/journalEntries.service.ts create mode 100644 src/modules/gl/journals.controller.ts create mode 100644 src/modules/gl/journals.routes.ts create mode 100644 src/modules/gl/journals.service.ts create mode 100644 src/modules/gl/posting.service.ts create mode 100644 src/modules/gl/posting.types.ts create mode 100644 src/modules/tax/taxCodes.controller.ts create mode 100644 src/modules/tax/taxCodes.routes.ts create mode 100644 src/modules/tax/taxCodes.service.ts create mode 100644 src/modules/users/roles.controller.ts create mode 100644 src/modules/users/roles.routes.ts create mode 100644 src/modules/users/roles.service.ts create mode 100644 src/modules/users/users.controller.ts create mode 100644 src/modules/users/users.routes.ts create mode 100644 src/modules/users/users.service.ts create mode 100644 src/server.ts create mode 100644 src/types/express.d.ts create mode 100644 temp/mockups/Cross Financial Manage Mockup.png create mode 100644 tests/integration/ap.posting.spec.ts create mode 100644 tests/integration/ar.posting.spec.ts create mode 100644 tests/integration/handoff.spec.ts create mode 100644 tests/integration/posting.balance.spec.ts create mode 100644 tests/unit/posting.validation.spec.ts create mode 100644 tsconfig.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8ee5992 --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +DATABASE_URL="postgresql://USER:PASSWORD@localhost:5432/cfm?schema=public" +JWT_ACCESS_SECRET="change-me-access-secret" +JWT_REFRESH_SECRET="change-me-refresh-secret" +JWT_ACCESS_TTL="15m" +JWT_REFRESH_TTL="7d" +PORT="4000" +COMPANY_SLUG="demo" +# One or more (comma-separated) paths to public keys copied from the Account Manager's +# manager/keys/handoff-public.pem, used to verify incoming handoff tokens. +HANDOFF_PUBLIC_KEY_PATHS="./keys/handoff-public.pem" diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..110629d --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,46 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint", "import"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "env": { + "node": true, + "es2022": true, + "jest": true + }, + "rules": { + "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], + "no-restricted-syntax": [ + "error", + { + "selector": "CallExpression[callee.object.property.name='journalEntry'][callee.property.name=/^(create|createMany|createManyAndReturn|update|updateMany|upsert|delete|deleteMany)$/]", + "message": "Only src/modules/gl/posting.service.ts may write JournalEntry rows. Build a JournalEntryDraft and call PostingService.postEntry()/reverseEntry() instead." + }, + { + "selector": "CallExpression[callee.object.property.name='journalEntryLine'][callee.property.name=/^(create|createMany|createManyAndReturn|update|updateMany|upsert|delete|deleteMany)$/]", + "message": "Only src/modules/gl/posting.service.ts may write JournalEntryLine rows. Build a JournalEntryDraft and call PostingService.postEntry()/reverseEntry() instead." + } + ] + }, + "overrides": [ + { + "files": ["src/modules/gl/posting.service.ts"], + "rules": { + "no-restricted-syntax": "off" + } + }, + { + "files": ["tests/integration/posting.balance.spec.ts"], + "rules": { + "no-restricted-syntax": "off" + } + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6718574 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules/ +dist/ +.env +*.log +coverage/ +client/node_modules/ +client/dist/ +.idea/ +keys/ diff --git a/PHASE_1.5_TEST_PLAN.md b/PHASE_1.5_TEST_PLAN.md new file mode 100644 index 0000000..53ad407 --- /dev/null +++ b/PHASE_1.5_TEST_PLAN.md @@ -0,0 +1,153 @@ +# Phase 1.5 — Visual Redesign: Manual Test Checklist + +Reskinned the company-app frontend to match `temp/mockups/Cross Financial Manage Mockup.png` +(navy sidebar, blue accent, card-based content) and added three new screens (Dashboard, +Chart of Accounts tree view, Reports Centre shell, GL account drill-down). No backend or +schema changes in this phase — everything below should work against data you already have. + +Tick each box as you go. If something fails, note what you saw under it — that's what I'll fix. + +## 0. Start everything + +``` +# Terminal 1 — company API +cd D:\Webstorm\cross-financial-management +npm run dev # http://localhost:5000 + +# Terminal 2 — company frontend +cd D:\Webstorm\cross-financial-management\client +npm run dev # http://localhost:5173 + +# Terminal 3 — Manager API +cd D:\Webstorm\cross-financial-management\manager +npm run dev # http://localhost:5100 + +# Terminal 4 — Manager frontend +cd D:\Webstorm\cross-financial-management\manager\client +npm run dev # http://localhost:5174 +``` + +Manager login: `joosth2002@icloud.com` / `ChangeMe123!` (change this password once you're +through testing — see `manager/SETUP.md`). + +- [ ] All four `npm run dev` terminals started with no errors + +## 1. Sign-in / handoff flow (regression — not new, but the entry point to everything below) + +- [ ] Open `http://localhost:5174`, sign in with the Manager credentials above +- [ ] Company picker shows "Demo Company" +- [ ] Clicking it redirects to `http://localhost:5173` and you land **already signed in** — + no login form appears in the company app +- [ ] Refreshing the company app keeps you signed in (session persists) +- [ ] Signing out (avatar menu, top-right, in the company app) redirects you back to the + Manager rather than a dead `/login` page + +## 2. Sidebar & top bar (new look) + +- [ ] Left sidebar renders navy with the "Cross Financial / MANAGER" logo mark at the top +- [ ] Nav items are grouped under **General Ledger**, **Reports**, **Administration** with a + standalone **Dashboard** link above them +- [ ] Each nav item has an icon; the currently active page is highlighted (lighter navy pill, + blue icon, white text) +- [ ] Clicking every visible nav item navigates correctly and updates the highlight +- [ ] Top bar (white, right-aligned) shows the Branch switcher and your avatar with initials +- [ ] Avatar menu shows your name + email and a working **Sign out** +- [ ] Nav items you don't have permission for are hidden (test with a restricted user if you + have one, or trust that `hasPermission` filtering is unchanged from before) + +## 3. Dashboard (new — this is now the `/` landing page) + +- [ ] Landing on `http://localhost:5173/` after sign-in shows the new Dashboard, not the + journal entry list +- [ ] Four KPI tiles render: **Posted Entries**, **Draft Entries**, **Total Posted Movement**, + **Total Entries** — numbers should match what you'd expect from your seeded/test data +- [ ] "Posted Movement by Account Type" bar list appears once you have at least one posted + entry, with one bar per account type that has activity (ASSET/LIABILITY/etc.), and the + relative bar widths look proportionate to the amounts shown +- [ ] With **zero** posted entries (fresh DB), the panel shows "No posted entries yet." instead + of breaking +- [ ] "Quick Actions" only shows actions you have permission for, and each one navigates to the + right page (New Manual Entry / Chart of Accounts / Journals / Users & Roles) +- [ ] "Recent Activity" lists your most recent journal entries (any status) with date, entry + number, description, amount, and a status pill; clicking a row opens that entry's detail + page +- [ ] Switching the Branch switcher between "Main" and a specific branch updates the dashboard + figures to that branch's data + +## 4. Chart of Accounts (rebuilt as a grouped/collapsible tree) + +- [ ] Accounts are grouped under collapsible headers: ASSET, LIABILITY, EQUITY, INCOME, EXPENSE +- [ ] Clicking a group header collapses/expands its accounts, and the chevron icon flips + accordingly +- [ ] Each group header shows an account count chip (e.g. "12 accounts") +- [ ] Each account row shows: account code (monospace), account name, normal balance + (DEBIT/CREDIT), a control-account pill when applicable, and an Active/Closed status pill +- [ ] The search box filters accounts by code or name across all groups as you type +- [ ] "New Account" still opens the existing account-creation dialog and newly created accounts + appear in the correct group after saving +- [ ] Groups with zero matching accounts (e.g. after a narrow search) don't render or show + cleanly rather than looking broken + +## 5. General Ledger — "All Entries" tab (regression) + +- [ ] `Journal Entries` in the sidebar opens a page titled **General Ledger** with two tabs: + "All Entries" and "By Account" +- [ ] "All Entries" behaves exactly as before: same grid, same columns, sortable by date, + clicking a row opens the entry detail page +- [ ] "New Manual Entry" button still only shows if you have `gl.journal.post` + +## 6. General Ledger — "By Account" tab (new — account-centric drill-down) + +- [ ] Selecting an account from the dropdown loads its posted transaction history +- [ ] A running balance column updates correctly line by line (increases/decreases match the + account's normal balance direction — e.g. a debit-normal account's balance goes up on + debits, down on credits) +- [ ] Restricting the From/To date fields narrows the rows and the running balance still looks + correct for the restricted range +- [ ] An account with no posted activity shows "No posted transactions for this account in the + selected range." instead of an empty broken table +- [ ] Before selecting an account, you see a prompt to pick one rather than an empty table +- [ ] Switching the Branch switcher changes which entries are considered + +## 7. Journal Entry form (visual alignment + new static footer) + +- [ ] Form still works exactly as before: adding/removing lines, debit/credit mutual exclusion + per line, the live "Balanced ✓ / Not balanced" indicator, and Post Entry / Cancel +- [ ] Two new footer cards appear below the line table: **Attachments** ("+ Add Attachment") and + **Notes** ("+ Add Note") — these are intentionally disabled/inert placeholders for now, + just confirm they render without errors and don't block submission +- [ ] Posting a valid balanced entry still redirects to its detail page as before + +## 8. Reports Centre (new shell — no live reports yet) + +- [ ] `Reports Centre` in the sidebar opens a page with four categories: Financial, + Receivables, Payables, Management +- [ ] Each category shows report cards (e.g. Trial Balance, Profit & Loss, Aged Receivables) + with a name, short description, and a "Coming soon" chip +- [ ] Cards are visually disabled (dimmed, non-interactive) — this is expected; no report is + wired up to real data yet + +## 9. Other admin screens — style regression only (Segments, Journals, Fiscal Years, Users) + +These pages weren't rebuilt, but they now render on the new theme (cards instead of flat +panels, rounded corners, updated table header style). Confirm nothing looks broken: + +- [ ] Segments & Branches — page renders, "New Segment"/"Add Value" dialogs still work +- [ ] Journals — grid renders, "New Journal" dialog still works +- [ ] Fiscal Years — year buttons + period grid still work, "Create Year" still works +- [ ] Users & Roles — both tabs (Users / Role Permissions) still work, toggling a user's Active + switch still works + +## 10. General polish + +- [ ] Page titles, card borders, and table headers look consistent across every screen you + visited (uppercase gray table headers, light card borders, no harsh drop-shadows) +- [ ] No console errors in the browser dev tools on any page you visited +- [ ] Resizing the browser window narrower doesn't visibly break the layout (some horizontal + scroll on wide tables/grids is fine — full mobile responsiveness isn't a goal yet) + +--- + +Once everything above is ticked (or you've told me what's broken), the plan's next phase is +Accounts Receivable — customers, invoices, credit notes, receipts — built directly in this +visual language. diff --git a/PHASE_2_AR_TEST_PLAN.md b/PHASE_2_AR_TEST_PLAN.md new file mode 100644 index 0000000..2dde04b --- /dev/null +++ b/PHASE_2_AR_TEST_PLAN.md @@ -0,0 +1,113 @@ +# Phase 2 — Accounts Receivable: Manual Test Checklist + +Adds Customers, Tax Codes, AR Invoices, Credit Notes, and Receipts with allocation — all +posting through the existing `PostingService`, so every one of these creates a real, +balanced GL entry you can trace from the Journal Entries screen. Backend correctness +(balanced postings, tax calc, allocation limits) is already covered by +`tests/integration/ar.posting.spec.ts` (7 tests, passing) and was additionally verified by +hand over the real HTTP API end-to-end. This checklist is for the parts only a human can +judge: does the UI make sense, does the data look right, does it match how the business +actually invoices customers. + +Start the same four dev servers as Phase 1.5 (see `PHASE_1.5_TEST_PLAN.md` §0) and sign in +through the Manager. + +## 0. New nav items + +- [ ] Sidebar shows a new **Sales** section above General Ledger: Customers, Invoices, Receipts +- [ ] Administration section has a new **Tax Codes** item at the bottom +- [ ] Two tax codes are pre-seeded: STD (15%) and ZERO (0%) — visible at `/admin/tax-codes` + +## 1. Tax Codes + +- [ ] "New Tax Code" creates a code (e.g. `EXPORT`, `Zero-Rated Export`, `0`) and it appears in the grid +- [ ] Toggling a tax code's Active switch off, then back on, works +- [ ] A tax code is usable immediately on new invoice/credit note lines without a page refresh + +## 2. Customers + +- [ ] "New Customer" requires a branch selection; creating one without a branch shows an error +- [ ] A created customer appears in the Customers grid with the right code/name/credit limit/terms +- [ ] Switching the top-right Branch switcher to a single branch filters the Customers grid to + that branch only; switching back to Main shows all +- [ ] Clicking a customer row opens their Customer 360 page + +## 3. Customer 360 + +- [ ] Header shows the customer's name and an Active/Closed status pill +- [ ] Four summary tiles: Outstanding Balance, Overdue (30+ days), Credit Limit, Payment Terms +- [ ] A brand-new customer with no invoices shows R0.00 everywhere, not blank or broken +- [ ] Contact Details card shows code/email/phone/tax number (or "—" for anything empty) +- [ ] Three tabs — Invoices / Payments / Credit Notes — each show "No … yet." until you create one +- [ ] "New Invoice" and "Receive Payment" buttons only appear if you have the AR permissions + (test with a restricted role, or trust the code path — both gate on `ar.invoice.manage` / + `ar.receipt.manage`) + +## 4. Creating and posting an invoice + +- [ ] From Customer 360, "New Invoice" opens the invoice form with that customer pre-selected +- [ ] Due date auto-fills from invoice date + the customer's payment terms and is read-only +- [ ] Adding a line, picking a revenue account (only INCOME-type accounts for that customer's + branch are offered) and a tax code updates that line's Amount live +- [ ] Applying the STD (15%) tax code to a R1,000 line shows R150 tax and R1,150 line total +- [ ] The footer Subtotal / Tax / Total roll up correctly across multiple lines with different + tax codes (including a line with no tax code — contributes 0 to tax) +- [ ] "Save Draft" creates the invoice with status DRAFT and does **not** create a GL entry — + confirm by checking General Ledger's entry count is unchanged +- [ ] From the draft's detail page, "Post Invoice" posts it — status flips to POSTED, and a new + entry appears in General Ledger (journal `SALES`) that is balanced (Debits = Credits) +- [ ] Opening that GL entry shows: one debit line to the AR Control account for the invoice + total, one or more credit lines to the revenue account(s) for the subtotal(s), and (if + tax was applied) a credit line to Output Tax Payable for the tax total +- [ ] "Post Invoice" directly from the form (skipping the separate detail-page click) also works + and lands you on the now-posted invoice +- [ ] A draft invoice can be **Voided** (status → VOID, no GL entry ever created); a posted + invoice has no Void option — only a credit note can reverse it +- [ ] The invoice now appears in the customer's Invoices tab and in the global Invoices list, + with the correct balance and status pill + +## 5. Receiving a payment + +- [ ] From Customer 360, "Receive Payment" opens the receipt form with the customer pre-selected +- [ ] "Deposited to" only offers accounts marked as a Bank control account +- [ ] Saving and posting a receipt for the invoice's exact total creates a balanced GL entry: + debit to Bank, credit to AR Control, journal `CASH_RECEIPT` +- [ ] The posted receipt's detail page shows an "Allocate Against Invoices" panel listing the + customer's open (posted, balance > 0) invoices +- [ ] Clicking "Full" next to an invoice fills in its exact remaining balance (capped at what's + still unallocated on the receipt) +- [ ] Applying the allocation reduces both the invoice's balance and the receipt's unallocated + amount by the applied amount — reload both pages and confirm the numbers persist +- [ ] Fully allocating a receipt makes the "Allocate" panel show "Fully allocated." instead of + the invoice table +- [ ] Attempting to allocate more than a receipt's unallocated amount, or more than an invoice's + balance, is rejected with a clear error and changes nothing +- [ ] A part-paid invoice shows the correct partial balance on its detail page and in the + Customer 360 Invoices tab + +## 6. Credit notes + +- [ ] Create a credit note for the same customer, one line mirroring a posted invoice line + (same account, same tax code, same amount) +- [ ] Posting it creates a GL entry that is the mirror image of the invoice's: debit to the + revenue account (+ debit to Output Tax if taxed), credit to AR Control — and is balanced +- [ ] The credit note's detail page shows the same "Allocate Against Invoices" panel; allocating + it against the open invoice reduces both the invoice's balance and the credit note's + remaining balance +- [ ] A draft credit note can be voided; a posted one cannot + +## 7. Cross-cutting checks + +- [ ] Every invoice/receipt/credit note number follows its own series (`ARINV-2026-######`, + `ARRCT-2026-######`, `ARCN-2026-######`) and never repeats or skips oddly between runs +- [ ] The Dashboard's "Posted Movement by Account Type" bars now reflect AR activity (ASSET bar + grows from AR Control + Bank movement, INCOME bar grows from Sales) +- [ ] Switching to a specific branch (not Main) on any AR screen shows only that branch's + customers/invoices/receipts +- [ ] No console errors in the browser dev tools while working through this checklist + +--- + +Once this is ticked (or you've flagged issues), the plan's next step is Accounts Payable — +Suppliers, Supplier Invoices, Debit Notes, Payments — built the same way, followed by Tax +reporting and then Stock Control. diff --git a/PHASE_3_AP_TEST_PLAN.md b/PHASE_3_AP_TEST_PLAN.md new file mode 100644 index 0000000..e25922e --- /dev/null +++ b/PHASE_3_AP_TEST_PLAN.md @@ -0,0 +1,90 @@ +# Phase 3 — Accounts Payable: Manual Test Checklist + +Mirrors Accounts Receivable exactly, but for money owed to suppliers instead of money owed by +customers: Suppliers, Supplier Invoices (Bills), Debit Notes, and Payments with allocation — +same Draft → Post workflow, same shared `PostingService`, same Tax Codes. Backend correctness +is already covered by `tests/integration/ap.posting.spec.ts` (7 tests, passing alongside AR's +7 and GL's 9) and was additionally verified over the real HTTP API by hand (create supplier → +create/post invoice → create/post payment → allocate → invoice balance hit zero). This +checklist is for the parts only a human can judge. + +Start the same four dev servers as before and sign in through the Manager. + +## 0. New nav items + +- [ ] Sidebar shows a new **Purchasing** section (between Sales and General Ledger): Suppliers, + Bills, Payments + +## 1. Suppliers + +- [ ] "New Supplier" requires a branch selection; creating one without a branch shows an error +- [ ] A created supplier appears in the Suppliers grid +- [ ] Branch switcher filters the Suppliers grid the same way it does Customers +- [ ] Clicking a supplier opens their detail page (the AP equivalent of Customer 360) + +## 2. Supplier detail page + +- [ ] Header shows the supplier's name and an Active/Closed status pill +- [ ] Three summary tiles: Outstanding Balance, Overdue (30+ days), Payment Terms +- [ ] A brand-new supplier with no invoices shows R0.00 everywhere +- [ ] Contact Details card shows code/email/phone/tax number (or "—" for anything empty) +- [ ] Three tabs — Invoices / Payments / Debit Notes — each show "No … yet." until you create one +- [ ] "New Invoice" and "Make Payment" buttons only appear if you have the AP permissions + +## 3. Creating and posting a supplier invoice (Bill) + +- [ ] From the supplier's page, "New Invoice" opens the form with that supplier pre-selected +- [ ] Due date auto-fills from invoice date + the supplier's payment terms and is read-only +- [ ] Adding a line, picking an expense account (only EXPENSE-type accounts for that supplier's + branch are offered) and a tax code updates that line's Amount live +- [ ] Applying the STD (15%) tax code to a R1,000 line shows R150 tax and R1,150 line total +- [ ] "Save Draft" creates the invoice with status DRAFT and does **not** create a GL entry +- [ ] "Post Invoice" posts it — status flips to POSTED, and a new balanced entry appears in + General Ledger under journal `PURCHASES` +- [ ] Opening that entry shows: debit line(s) to the expense account(s) for the subtotal, a + debit line to Input Tax Receivable for the tax (if any), and a credit line to Accounts + Payable Control for the total +- [ ] A draft invoice can be **Voided**; a posted invoice has no Void option — only a debit note + can reverse it +- [ ] The invoice appears in the supplier's Invoices tab and in the global Bills list + +## 4. Making a payment + +- [ ] From the supplier's page, "Make Payment" opens the form with the supplier pre-selected +- [ ] "Paid from" only offers accounts marked as a Bank control account +- [ ] Posting a payment for the invoice's exact total creates a balanced GL entry: debit to + Accounts Payable Control, credit to Bank, journal `CASH_PAYMENT` +- [ ] The posted payment's detail page shows an "Allocate Against Invoices" panel listing the + supplier's open (posted, balance > 0) invoices +- [ ] "Full" fills in the invoice's exact remaining balance, capped at what's still unallocated + on the payment +- [ ] Applying the allocation reduces both the invoice's balance and the payment's unallocated + amount — reload both pages and confirm the numbers persist +- [ ] Over-allocating (more than the payment's unallocated amount, or more than an invoice's + balance) is rejected with a clear error and changes nothing +- [ ] A part-paid invoice shows the correct partial balance on its detail page and on the + supplier's Invoices tab + +## 5. Debit notes + +- [ ] Create a debit note for the same supplier, one line mirroring a posted invoice line +- [ ] Posting it creates the mirror-image GL entry: debit to Accounts Payable Control, credit + to the expense account (+ credit to Input Tax if taxed) — and is balanced +- [ ] The debit note's detail page shows the same allocation panel; allocating it against the + open invoice reduces both the invoice's balance and the debit note's remaining balance +- [ ] A draft debit note can be voided; a posted one cannot + +## 6. Cross-cutting checks + +- [ ] Every invoice/payment/debit-note number follows its own series (`APINV-2026-######`, + `APPMT-2026-######`, `APDN-2026-######`) and never repeats or skips oddly +- [ ] The Dashboard's "Posted Movement by Account Type" bars now also reflect AP activity + (LIABILITY bar grows from AP Control movement, EXPENSE bar grows from bills) +- [ ] Switching to a specific branch shows only that branch's suppliers/invoices/payments +- [ ] No console errors in the browser dev tools while working through this checklist + +--- + +Once this is ticked, the plan's next step is Tax reporting (VAT/output-input reconciliation), +then Stock Control + Procurement Matching (GRV/PPV, incorporating the Posting Ledger reference +already reviewed). diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000..13865f3 --- /dev/null +++ b/SETUP.md @@ -0,0 +1,46 @@ +# Setup — Phase 1 (Foundation) + +## Prerequisites +- Node.js 18+ (tested on v22) +- A reachable PostgreSQL 15+ database (this project does not use Docker) + +## Login +This app has no local login screen — see `../manager/`. Sign-in happens once at the central +Account Manager (2FA, Google, Microsoft), which hands this app a short-lived signed token +(`POST /api/auth/handoff`) instead of a password. `../manager/keys/handoff-public.pem` must be +copied into `keys/handoff-public.pem` here (see step 4) before that will work. + +## First-time setup +1. Copy `.env.example` to `.env` and fill in a real `DATABASE_URL`, two random JWT secrets + (e.g. `node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"`), and + `COMPANY_SLUG` (must match the `slug` of this company's `Company` row in the Manager). `.env` + is gitignored — never put real secrets in `.env.example`. +2. `npm install` +3. `npm run prisma:migrate` — applies all migrations, including the hand-written + `prisma/migrations/*_add_journal_balance_trigger/migration.sql` (the double-entry DB backstop; + source copy also kept at `prisma/manual-sql/add_journal_balance_trigger.sql` for reference). +4. `mkdir keys && cp ../manager/keys/handoff-public.pem keys/` (after running + `npm run generate-handoff-keys` in `../manager/` at least once). +5. `npm run prisma:seed` — creates the default 4-segment account structure, default Chart of + Accounts across two example branches (HQ, AMA), the GJ general journal, the 2026 fiscal year, + default roles/permissions, and an admin user (`joosth2002@icloud.com`, no local password — + this email must match the Manager `Person` who signs in). +6. `npm run dev` — starts the API on `http://localhost:4000` (see `PORT` in `.env`). + +## Verifying it works +- `npm test` — unit tests (no DB required; validates PostingService's pre-write balance checks). +- `npm run test:integration` — integration tests against the real DB: posts balanced/unbalanced + entries through the full stack (including a direct raw-SQL attempt that proves the DB trigger + backstop works even if `PostingService` is bypassed), and exchanges real handoff tokens (minted + with the Manager's real private key) to prove sign-in, replay protection, and cross-company + rejection all work end-to-end. +- `npm run smoke` — seeds two sample balanced entries (HQ and AMA), confirms an unbalanced one is + rejected, and prints a Main-level trial balance check. +- `GET /health` — basic liveness check. + +## Adding a new migration +Prisma's schema DSL can't express multi-row CHECK constraints or triggers, so any future raw-SQL +addition (e.g. more constraints) follows the same pattern used for the balance trigger: +1. `npx prisma migrate dev --create-only --name ` +2. Hand-edit the generated `migration.sql` +3. `npx prisma migrate dev` to apply it diff --git a/client/.env.example b/client/.env.example new file mode 100644 index 0000000..df17633 --- /dev/null +++ b/client/.env.example @@ -0,0 +1,2 @@ +VITE_API_BASE_URL="http://localhost:5000/api" +VITE_MANAGER_URL="http://localhost:5174" diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..438657a --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +.env + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/client/.oxlintrc.json b/client/.oxlintrc.json new file mode 100644 index 0000000..6fa991d --- /dev/null +++ b/client/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "typescript", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..d6af7e3 --- /dev/null +++ b/client/README.md @@ -0,0 +1,32 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the Oxlint configuration + +If you are developing a production application, we recommend enabling type-aware lint rules by installing `oxlint-tsgolint` and editing `.oxlintrc.json`: + +```json +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "typescript", "oxc"], + "options": { + "typeAware": true + }, + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} +``` + +See the [Oxlint rules documentation](https://oxc.rs/docs/guide/usage/linter/rules) for the full list of rules and categories. diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..f4f90a7 --- /dev/null +++ b/client/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + Cross Financial Management + + +
+ + + diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..48a0304 --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,2964 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@hookform/resolvers": "^5.9.1", + "@mui/icons-material": "^9.4.0", + "@mui/material": "^9.4.0", + "@mui/x-data-grid": "^9.12.0", + "@tanstack/react-query": "^5.102.8", + "axios": "^1.20.0", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-hook-form": "^7.87.0", + "react-router-dom": "^7.18.3", + "zod": "^3.25.76", + "zustand": "^5.0.15" + }, + "devDependencies": { + "@types/node": "^24.13.3", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.1.0", + "oxlint": "^1.79.0", + "typescript": "~6.0.2", + "vite": "^8.2.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base-ui/utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.3.2.tgz", + "integrity": "sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@floating-ui/utils": "^0.2.12", + "reselect": "^5.2.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "@types/react": "^17 || ^18 || ^19", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@hookform/resolvers": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.9.1.tgz", + "integrity": "sha512-7b7vsbraJxKgjVSA1Nur9tLwj539WGJUBLA7QNvXnFoT2pM5Z7G+6rlukk4B2/QrTZy6huRtH6wKeESPKuIr6w==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "@sinclair/typebox": ">=0.25.24", + "@standard-schema/spec": "^1.0.0", + "@typeschema/main": ">=0.13.7", + "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "arktype": "^2.0.0", + "ata-validator": "^1.2.0", + "class-transformer": ">=0.4.0", + "class-validator": ">=0.12.0", + "computed-types": "^1.0.0", + "effect": "^3.10.3", + "fluentvalidation-ts": "^3.0.0", + "fp-ts": "^2.7.0", + "io-ts": "^2.0.0", + "joi": "^17.0.0 || ^18.0.0", + "nope-validator": ">=0.12.0", + "react-hook-form": "^7.55.0", + "superstruct": ">=0.12.0", + "typanion": "^3.3.2", + "valibot": ">=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc", + "vest": ">=6.0.0", + "yup": "^1.0.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@sinclair/typebox": { + "optional": true + }, + "@standard-schema/spec": { + "optional": true + }, + "@typeschema/main": { + "optional": true + }, + "@vinejs/vine": { + "optional": true + }, + "ajv": { + "optional": true + }, + "ajv-errors": { + "optional": true + }, + "ajv-formats": { + "optional": true + }, + "arktype": { + "optional": true + }, + "ata-validator": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + }, + "computed-types": { + "optional": true + }, + "effect": { + "optional": true + }, + "fluentvalidation-ts": { + "optional": true + }, + "fp-ts": { + "optional": true + }, + "io-ts": { + "optional": true + }, + "joi": { + "optional": true + }, + "nope-validator": { + "optional": true + }, + "superstruct": { + "optional": true + }, + "typanion": { + "optional": true + }, + "valibot": { + "optional": true + }, + "vest": { + "optional": true + }, + "yup": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.4.0.tgz", + "integrity": "sha512-d+gIYM1raJP87yrVQcVg+Q3vycVMArMkgu/TjJLi2vTvO9FHKWNRR1xs9nnN4eLpM9nGxxm02UMvc9BrmcUKvQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-9.4.0.tgz", + "integrity": "sha512-5PVgBYtLOXTk6u0YUAjoV9GoTUQDbeZ8g+pus2h0GphLT/rpmftRnB5D/Kw6QCAovB7EyBX7UxKdZqPBBAHUKw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^9.4.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.4.0.tgz", + "integrity": "sha512-6KKUIvkQ2r/s48s9VZV9JEZ1W2dRa7RndVsF+Ipx4CYxDOQeozeRsS5r9NiheFf8A5hpbqJJIGoX7hjg5X4XUw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/core-downloads-tracker": "^9.4.0", + "@mui/system": "^9.4.0", + "@mui/types": "^9.4.0", + "@mui/utils": "^9.4.0", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.8", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^9.4.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.4.0.tgz", + "integrity": "sha512-qQpX/2XPGDz5F2OIWzo4kkorURlDeXGKytRQudXCdLS5TuwKsMKaZyx77LZEVSB73c7o3UrLWwQ/goRuHBdtjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/utils": "^9.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.4.0.tgz", + "integrity": "sha512-SlqVEYqnyEgXMFW4JuIDMelyhKzoWBJ85v2mNCQd0XtU0uk7U9E1zaJZ06XqodhA8oJrb+4Q+3E/JlwBe4jWkw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.4.0.tgz", + "integrity": "sha512-AZz9z13oGS1J0BYeAFHTbV7PegCtPiE/uMEIi7TJ1kTx3Vkt+jUpLyXF/2uV8B6Y79iTh98kVeOH9fX3x3zXXg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/private-theming": "^9.4.0", + "@mui/styled-engine": "^9.4.0", + "@mui/types": "^9.4.0", + "@mui/utils": "^9.4.0", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-9.4.0.tgz", + "integrity": "sha512-13DH0Oniua4WmGqeYbQAZqmiN7r4nfd0zwIoGJ5QeJwyIHgEmf+LkRw/jV1HZb6AiUoHX8Oxf4xgalq3vYHcIw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.4.0.tgz", + "integrity": "sha512-WkzY8uYtqUDyGKPShrRQRBomfMQHddlsyKu/gRRESYO24tDPD2z0xRE8CBoUsWqpBa+YrFs9KixiS7kQRjsPAQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/types": "^9.4.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.8" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-data-grid": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-9.12.0.tgz", + "integrity": "sha512-lI7NYAPhoLIWJECB2gZuVairzWviDDOE1RpjLcPXJM+hw1mwCG+isqNfx81X+17xuHtnEEBVahCDWAJFAvCF9g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@base-ui/utils": "^0.3.1", + "@mui/utils": "^9.3.0", + "@mui/x-internals": "^9.12.0", + "@mui/x-virtualizer": "0.7.0", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^7.3.0 || ^9.0.0", + "@mui/system": "^7.3.0 || ^9.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.12.0.tgz", + "integrity": "sha512-rpG9EgJhH3JeOK2Q/tKaUWk5vP8C1NfL8DaXMKR1XCA7RhpZUI/xT67WKY80QtogNWu7U/BRezKyQGtiZ8soYg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@base-ui/utils": "^0.3.1", + "@mui/utils": "^9.3.0", + "reselect": "^5.2.0", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@mui/x-virtualizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@mui/x-virtualizer/-/x-virtualizer-0.7.0.tgz", + "integrity": "sha512-Bz5p/t78zE2q6rf/nHY3j29hr7JlWaBNT0OD8jZFcfstr8jqrPkzirGsl/Bz5EpEjEzxV73kLfZLpIToGql+rA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@base-ui/utils": "^0.3.1", + "@mui/utils": "^9.3.0", + "@mui/x-internals": "^9.12.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.81.0.tgz", + "integrity": "sha512-IcCRsXiedJoJopY6mpZUBEeVFsUrutmrG7dZ87zMuKJlhg70Ora9bBl1WcCxZQtyI10YpnVdEso5oCg7YcfSHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.81.0.tgz", + "integrity": "sha512-GRrIPyTGVhx3L3h+0T5xT2A0jFAcdPv4+IfuXpGDLIdl6XeYhgg/zw72A5ILZoUgRqZuM8F1y+V/gfDriXSxzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.81.0.tgz", + "integrity": "sha512-qNQ9tXRgLuKbqSV1S2h9h4KPHjbovO7RRR2/enUOtHzTkFZ7B9X5zqqHJua8dRyc7dBy7Aoyq5pqTSLFVcAzGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.81.0.tgz", + "integrity": "sha512-q0QTm32jWga2Gv4j7IaVZN0jYMi9UV73sWVgFtDA4iIfqwMCLLZ3ve+9KwfYtsaKZSgQhmPaogeZWqDZpcY1Pw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.81.0.tgz", + "integrity": "sha512-/+8wVWDXEC7wHVAhOc59Fw/SkMc1arLkFD8iQCaSsmzenK1X4doFqquL9H1wrtGUzaiycVqkf/sSpcILK6W1UA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.81.0.tgz", + "integrity": "sha512-4xt422FEgioRq9hAL4Tq7fujGUWnc8z1BJ+Oi8RN8vB8axaP+sdK6a2xdlcQCCYnJg9QMuMFS0AucuIFx/EacA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.81.0.tgz", + "integrity": "sha512-u3vna8KdGplH4DRCW9K54D68fcMo7IxVrkCJWwXnIhwtBdnDnYrmzOUA/XjmBlPpcLsgw9Z5BNdY4za9+Dj+MQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.81.0.tgz", + "integrity": "sha512-3j9k+gsYsE7nv71GWotXsqsa2l9/aJenD7dVHNt/CBvsb0SgRjSMnHFeP59IXUAl1wvVFhqGl2wJNMwWU3UBlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.81.0.tgz", + "integrity": "sha512-k5iAp3dNxW0/uDCBY+WSm8jKB2szu7SkEQZdgRRpDXvuDd69vvDcqhB3A/pWCfCwXyenjNjFn9Td1fVoyAc+Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.81.0.tgz", + "integrity": "sha512-TFqLja3uYmVSte6nof9GWrex9Z8WgdZrNiLC6Te5rXGDqXB2y4j/26iFhwosXiAFqDhE9JJVuuCkDKLwptTn1g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.81.0.tgz", + "integrity": "sha512-UEcySvGS0NOVo7h7n7CYyJL9+6gFAh7Zc/ToDXVScFvzHSTIxtzkMVU30rmQ6+nQ1LF+UdiRDdJajpDu+OylLg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.81.0.tgz", + "integrity": "sha512-H+diDbhD00+wI1IRP8Kz88x/lat+DgtoBJzoTthS16xkTJGNaEkfb8gzmd1rzc/2uDQQMl7GNl+JFUacVeWxIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.81.0.tgz", + "integrity": "sha512-8znJ/5TekjOKg1j1Acho4PJMdiAHLtlcXuWEiipOhAMV6rQcXdmDdXCbheyDczN6TjBwiNfjcP81k4AthrKRzw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.81.0.tgz", + "integrity": "sha512-Q2Wj70yFsvn5QjlmifFzbj4H+kJy53bwqc41o1fzoM7MpLV1NIbhg/LpWXRfC6KOkSAdUx1Wd8VJsdPmhp/HRA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.81.0.tgz", + "integrity": "sha512-cPInHp/ddEe5qkyK2IiyQ8Q3Mp2oLLEhhsGgTK2oZx4L6+llGam1H1yBvJZ7qHfOXj8N3hxBS8sj4tO+gtFlIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.81.0.tgz", + "integrity": "sha512-0CQxSX4ajqm07AHBf5U33qQzXKdd7wtq/oTL/7vpY6RNNuxrRi8W4bqUV1Jyu/vj+9KmxQyDhxfeVX1nQL6kfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.81.0.tgz", + "integrity": "sha512-l0hbeISm9673hVrrQU8j/p2M7YH9Ouoj7p7E/QM55NTrKVLP+P3PF8hLu+OY+x0VtGRW+ggiQKZqmdYps9H+TA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.81.0.tgz", + "integrity": "sha512-ksqPP5jbFXcYreEQ7zdJh06rJQBymCTyGRCdaXjfcf2aG4f8KxUWY5wcgYHmaTK+FJ4bPG5sUAdOX+6trnH1JA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.81.0.tgz", + "integrity": "sha512-IZuUCwGw9emG5JtCp+fYGB+Z4OWEoeEcM8R5BA1pYw63/ieYFVdcU2ylxTpHbVHSenZnsYE+ZZ20uHAJszQ4cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@tanstack/query-core": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.8.tgz", + "integrity": "sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.8.tgz", + "integrity": "sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.102.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oxlint": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.81.0.tgz", + "integrity": "sha512-HyrJYqeoOCL0iqaLEzGewGT48ZX99P3hxYh8udAF9RGGIghSamkXE4ClUyBpEDNqasamThgmlPbuMOe7SAZmHg==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/oxc-project" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.81.0", + "@oxlint/binding-android-arm64": "1.81.0", + "@oxlint/binding-darwin-arm64": "1.81.0", + "@oxlint/binding-darwin-x64": "1.81.0", + "@oxlint/binding-freebsd-x64": "1.81.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.81.0", + "@oxlint/binding-linux-arm-musleabihf": "1.81.0", + "@oxlint/binding-linux-arm64-gnu": "1.81.0", + "@oxlint/binding-linux-arm64-musl": "1.81.0", + "@oxlint/binding-linux-ppc64-gnu": "1.81.0", + "@oxlint/binding-linux-riscv64-gnu": "1.81.0", + "@oxlint/binding-linux-riscv64-musl": "1.81.0", + "@oxlint/binding-linux-s390x-gnu": "1.81.0", + "@oxlint/binding-linux-x64-gnu": "1.81.0", + "@oxlint/binding-linux-x64-musl": "1.81.0", + "@oxlint/binding-openharmony-arm64": "1.81.0", + "@oxlint/binding-win32-arm64-msvc": "1.81.0", + "@oxlint/binding-win32-ia32-msvc": "1.81.0", + "@oxlint/binding-win32-x64-msvc": "1.81.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-hook-form": { + "version": "7.87.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.87.0.tgz", + "integrity": "sha512-zhFzWvLxNHH+8839OnZcUxgMZw88ah2jZWDWvKWgF3Tpbnd0vKL+dlcuU3nZVWESZQjd81EW8K+wU+cYfYAc0w==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT" + }, + "node_modules/react-router": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.3.tgz", + "integrity": "sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.3.tgz", + "integrity": "sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/reselect": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.3.0.tgz", + "integrity": "sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.147.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.15.tgz", + "integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..f3e9e6c --- /dev/null +++ b/client/package.json @@ -0,0 +1,37 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@hookform/resolvers": "^5.9.1", + "@mui/icons-material": "^9.4.0", + "@mui/material": "^9.4.0", + "@mui/x-data-grid": "^9.12.0", + "@tanstack/react-query": "^5.102.8", + "axios": "^1.20.0", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-hook-form": "^7.87.0", + "react-router-dom": "^7.18.3", + "zod": "^3.25.76", + "zustand": "^5.0.15" + }, + "devDependencies": { + "@types/node": "^24.13.3", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.1.0", + "oxlint": "^1.79.0", + "typescript": "~6.0.2", + "vite": "^8.2.2" + } +} diff --git a/client/public/favicon.svg b/client/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/client/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/icons.svg b/client/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/client/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/src/App.tsx b/client/src/App.tsx new file mode 100644 index 0000000..98e26ef --- /dev/null +++ b/client/src/App.tsx @@ -0,0 +1,15 @@ +import { BrowserRouter } from 'react-router-dom'; +import { ThemeProvider, CssBaseline } from '@mui/material'; +import { theme } from './theme'; +import { AppRouter } from './routes/AppRouter'; + +export default function App() { + return ( + + + + + + + ); +} diff --git a/client/src/api/apDebitNotes.api.ts b/client/src/api/apDebitNotes.api.ts new file mode 100644 index 0000000..9b28c72 --- /dev/null +++ b/client/src/api/apDebitNotes.api.ts @@ -0,0 +1,51 @@ +import { apiClient } from './client'; +import type { APAllocation, APDebitNote } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchDebitNotes(branchScope: BranchSelection, supplierId?: number): Promise { + const response = await apiClient.get('/ap/debit-notes', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope), supplierId }, + }); + return response.data; +} + +export async function fetchDebitNote(id: number): Promise { + const response = await apiClient.get(`/ap/debit-notes/${id}`); + return response.data; +} + +export interface DebitNoteLineInput { + description: string; + quantity: number; + unitPrice: number; + expenseGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateDebitNoteInput { + supplierId: number; + debitNoteDate: string; + reference?: string; + reason?: string; + lines: DebitNoteLineInput[]; +} + +export async function createDebitNote(input: CreateDebitNoteInput): Promise { + const response = await apiClient.post('/ap/debit-notes', input); + return response.data; +} + +export async function postDebitNote(id: number): Promise { + const response = await apiClient.post(`/ap/debit-notes/${id}/post`); + return response.data; +} + +export async function voidDebitNote(id: number): Promise { + const response = await apiClient.post(`/ap/debit-notes/${id}/void`); + return response.data; +} + +export async function allocateDebitNote(id: number, allocations: { invoiceId: number; amount: number }[]): Promise { + const response = await apiClient.post(`/ap/debit-notes/${id}/allocations`, { allocations }); + return response.data; +} diff --git a/client/src/api/apInvoices.api.ts b/client/src/api/apInvoices.api.ts new file mode 100644 index 0000000..b60ad08 --- /dev/null +++ b/client/src/api/apInvoices.api.ts @@ -0,0 +1,46 @@ +import { apiClient } from './client'; +import type { APInvoice } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchInvoices(branchScope: BranchSelection, supplierId?: number): Promise { + const response = await apiClient.get('/ap/invoices', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope), supplierId }, + }); + return response.data; +} + +export async function fetchInvoice(id: number): Promise { + const response = await apiClient.get(`/ap/invoices/${id}`); + return response.data; +} + +export interface InvoiceLineInput { + description: string; + quantity: number; + unitPrice: number; + expenseGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateInvoiceInput { + supplierId: number; + invoiceDate: string; + dueDate: string; + supplierReference?: string; + lines: InvoiceLineInput[]; +} + +export async function createInvoice(input: CreateInvoiceInput): Promise { + const response = await apiClient.post('/ap/invoices', input); + return response.data; +} + +export async function postInvoice(id: number): Promise { + const response = await apiClient.post(`/ap/invoices/${id}/post`); + return response.data; +} + +export async function voidInvoice(id: number): Promise { + const response = await apiClient.post(`/ap/invoices/${id}/void`); + return response.data; +} diff --git a/client/src/api/apPayments.api.ts b/client/src/api/apPayments.api.ts new file mode 100644 index 0000000..6d72ae6 --- /dev/null +++ b/client/src/api/apPayments.api.ts @@ -0,0 +1,43 @@ +import { apiClient } from './client'; +import type { APAllocation, APPayment } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchPayments(branchScope: BranchSelection, supplierId?: number): Promise { + const response = await apiClient.get('/ap/payments', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope), supplierId }, + }); + return response.data; +} + +export async function fetchPayment(id: number): Promise { + const response = await apiClient.get(`/ap/payments/${id}`); + return response.data; +} + +export interface CreatePaymentInput { + supplierId: number; + paymentDate: string; + amount: number; + bankGLAccountId: number; + reference?: string; +} + +export async function createPayment(input: CreatePaymentInput): Promise { + const response = await apiClient.post('/ap/payments', input); + return response.data; +} + +export async function postPayment(id: number): Promise { + const response = await apiClient.post(`/ap/payments/${id}/post`); + return response.data; +} + +export async function voidPayment(id: number): Promise { + const response = await apiClient.post(`/ap/payments/${id}/void`); + return response.data; +} + +export async function allocatePayment(id: number, allocations: { invoiceId: number; amount: number }[]): Promise { + const response = await apiClient.post(`/ap/payments/${id}/allocations`, { allocations }); + return response.data; +} diff --git a/client/src/api/arCreditNotes.api.ts b/client/src/api/arCreditNotes.api.ts new file mode 100644 index 0000000..de68245 --- /dev/null +++ b/client/src/api/arCreditNotes.api.ts @@ -0,0 +1,51 @@ +import { apiClient } from './client'; +import type { ARAllocation, ARCreditNote } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchCreditNotes(branchScope: BranchSelection, customerId?: number): Promise { + const response = await apiClient.get('/ar/credit-notes', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope), customerId }, + }); + return response.data; +} + +export async function fetchCreditNote(id: number): Promise { + const response = await apiClient.get(`/ar/credit-notes/${id}`); + return response.data; +} + +export interface CreditNoteLineInput { + description: string; + quantity: number; + unitPrice: number; + revenueGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateCreditNoteInput { + customerId: number; + creditNoteDate: string; + reference?: string; + reason?: string; + lines: CreditNoteLineInput[]; +} + +export async function createCreditNote(input: CreateCreditNoteInput): Promise { + const response = await apiClient.post('/ar/credit-notes', input); + return response.data; +} + +export async function postCreditNote(id: number): Promise { + const response = await apiClient.post(`/ar/credit-notes/${id}/post`); + return response.data; +} + +export async function voidCreditNote(id: number): Promise { + const response = await apiClient.post(`/ar/credit-notes/${id}/void`); + return response.data; +} + +export async function allocateCreditNote(id: number, allocations: { invoiceId: number; amount: number }[]): Promise { + const response = await apiClient.post(`/ar/credit-notes/${id}/allocations`, { allocations }); + return response.data; +} diff --git a/client/src/api/arInvoices.api.ts b/client/src/api/arInvoices.api.ts new file mode 100644 index 0000000..93a8a46 --- /dev/null +++ b/client/src/api/arInvoices.api.ts @@ -0,0 +1,46 @@ +import { apiClient } from './client'; +import type { ARInvoice } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchInvoices(branchScope: BranchSelection, customerId?: number): Promise { + const response = await apiClient.get('/ar/invoices', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope), customerId }, + }); + return response.data; +} + +export async function fetchInvoice(id: number): Promise { + const response = await apiClient.get(`/ar/invoices/${id}`); + return response.data; +} + +export interface InvoiceLineInput { + description: string; + quantity: number; + unitPrice: number; + revenueGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateInvoiceInput { + customerId: number; + invoiceDate: string; + dueDate: string; + reference?: string; + lines: InvoiceLineInput[]; +} + +export async function createInvoice(input: CreateInvoiceInput): Promise { + const response = await apiClient.post('/ar/invoices', input); + return response.data; +} + +export async function postInvoice(id: number): Promise { + const response = await apiClient.post(`/ar/invoices/${id}/post`); + return response.data; +} + +export async function voidInvoice(id: number): Promise { + const response = await apiClient.post(`/ar/invoices/${id}/void`); + return response.data; +} diff --git a/client/src/api/arReceipts.api.ts b/client/src/api/arReceipts.api.ts new file mode 100644 index 0000000..56ad4a3 --- /dev/null +++ b/client/src/api/arReceipts.api.ts @@ -0,0 +1,43 @@ +import { apiClient } from './client'; +import type { ARAllocation, ARReceipt } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchReceipts(branchScope: BranchSelection, customerId?: number): Promise { + const response = await apiClient.get('/ar/receipts', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope), customerId }, + }); + return response.data; +} + +export async function fetchReceipt(id: number): Promise { + const response = await apiClient.get(`/ar/receipts/${id}`); + return response.data; +} + +export interface CreateReceiptInput { + customerId: number; + receiptDate: string; + amount: number; + bankGLAccountId: number; + reference?: string; +} + +export async function createReceipt(input: CreateReceiptInput): Promise { + const response = await apiClient.post('/ar/receipts', input); + return response.data; +} + +export async function postReceipt(id: number): Promise { + const response = await apiClient.post(`/ar/receipts/${id}/post`); + return response.data; +} + +export async function voidReceipt(id: number): Promise { + const response = await apiClient.post(`/ar/receipts/${id}/void`); + return response.data; +} + +export async function allocateReceipt(id: number, allocations: { invoiceId: number; amount: number }[]): Promise { + const response = await apiClient.post(`/ar/receipts/${id}/allocations`, { allocations }); + return response.data; +} diff --git a/client/src/api/auth.api.ts b/client/src/api/auth.api.ts new file mode 100644 index 0000000..44942ad --- /dev/null +++ b/client/src/api/auth.api.ts @@ -0,0 +1,18 @@ +import { apiClient } from './client'; +import type { AuthUser } from '../store/authStore'; + +export interface HandoffResponse { + accessToken: string; + refreshToken: string; + user: AuthUser; +} + +export async function handoff(token: string): Promise { + const response = await apiClient.post('/auth/handoff', { token }); + return response.data; +} + +export async function fetchMe(): Promise { + const response = await apiClient.get<{ user: AuthUser }>('/auth/me'); + return response.data.user; +} diff --git a/client/src/api/client.ts b/client/src/api/client.ts new file mode 100644 index 0000000..1116dd5 --- /dev/null +++ b/client/src/api/client.ts @@ -0,0 +1,53 @@ +import axios, { type AxiosError, type InternalAxiosRequestConfig } from 'axios'; +import { useAuthStore } from '../store/authStore'; + +const baseURL = import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:5000/api'; + +export const apiClient = axios.create({ baseURL }); + +apiClient.interceptors.request.use((config: InternalAxiosRequestConfig) => { + const { accessToken } = useAuthStore.getState(); + if (accessToken) { + config.headers.set('Authorization', `Bearer ${accessToken}`); + } + return config; +}); + +let refreshInFlight: Promise | null = null; + +async function refreshAccessToken(): Promise { + const { refreshToken, setAccessToken, clearSession } = useAuthStore.getState(); + if (!refreshToken) { + clearSession(); + throw new Error('No refresh token available'); + } + try { + const response = await axios.post<{ accessToken: string }>(`${baseURL}/auth/refresh`, { refreshToken }); + setAccessToken(response.data.accessToken); + return response.data.accessToken; + } catch (error) { + clearSession(); + throw error; + } +} + +apiClient.interceptors.response.use( + (response) => response, + async (error: AxiosError) => { + const originalRequest = error.config as (InternalAxiosRequestConfig & { _retried?: boolean }) | undefined; + if (error.response?.status === 401 && originalRequest && !originalRequest._retried) { + originalRequest._retried = true; + try { + refreshInFlight ??= refreshAccessToken().finally(() => { + refreshInFlight = null; + }); + const accessToken = await refreshInFlight; + originalRequest.headers.set('Authorization', `Bearer ${accessToken}`); + return apiClient(originalRequest); + } catch { + return Promise.reject(error); + } + } + return Promise.reject(error); + }, +); diff --git a/client/src/api/customers.api.ts b/client/src/api/customers.api.ts new file mode 100644 index 0000000..8ec84df --- /dev/null +++ b/client/src/api/customers.api.ts @@ -0,0 +1,37 @@ +import { apiClient } from './client'; +import type { Customer, CustomerDetail } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchCustomers(branchScope: BranchSelection): Promise { + const response = await apiClient.get('/ar/customers', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope) }, + }); + return response.data; +} + +export async function fetchCustomer(id: number): Promise { + const response = await apiClient.get(`/ar/customers/${id}`); + return response.data; +} + +export interface CustomerInput { + code: string; + name: string; + email?: string; + phone?: string; + address?: string; + taxNumber?: string; + branchSegmentValueId: number; + creditLimit?: number; + paymentTermsDays?: number; +} + +export async function createCustomer(input: CustomerInput): Promise { + const response = await apiClient.post('/ar/customers', input); + return response.data; +} + +export async function updateCustomer(id: number, input: Partial & { isActive?: boolean }): Promise { + const response = await apiClient.put(`/ar/customers/${id}`, input); + return response.data; +} diff --git a/client/src/api/fiscalPeriods.api.ts b/client/src/api/fiscalPeriods.api.ts new file mode 100644 index 0000000..cfb6693 --- /dev/null +++ b/client/src/api/fiscalPeriods.api.ts @@ -0,0 +1,12 @@ +import { apiClient } from './client'; +import type { FiscalYear } from '../types/api'; + +export async function fetchFiscalYears(): Promise { + const response = await apiClient.get('/company/fiscal-years'); + return response.data; +} + +export async function createFiscalYear(year: number): Promise { + const response = await apiClient.post('/company/fiscal-years', { year }); + return response.data; +} diff --git a/client/src/api/glAccounts.api.ts b/client/src/api/glAccounts.api.ts new file mode 100644 index 0000000..3973026 --- /dev/null +++ b/client/src/api/glAccounts.api.ts @@ -0,0 +1,24 @@ +import { apiClient } from './client'; +import type { GLAccount, GLAccountType, DebitCredit, ControlAccountType } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchGLAccounts(branchScope: BranchSelection, accountType?: GLAccountType): Promise { + const response = await apiClient.get('/gl/accounts', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope), accountType }, + }); + return response.data; +} + +export interface CreateGLAccountInput { + accountName: string; + accountType: GLAccountType; + normalBalance: DebitCredit; + isControlAccount?: boolean; + controlType?: ControlAccountType; + segmentSelections: { segmentDefId: number; segmentValueId: number }[]; +} + +export async function createGLAccount(input: CreateGLAccountInput): Promise { + const response = await apiClient.post('/gl/accounts', input); + return response.data; +} diff --git a/client/src/api/journalEntries.api.ts b/client/src/api/journalEntries.api.ts new file mode 100644 index 0000000..3df41ae --- /dev/null +++ b/client/src/api/journalEntries.api.ts @@ -0,0 +1,40 @@ +import { apiClient } from './client'; +import type { JournalEntry } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchJournalEntries(branchScope: BranchSelection): Promise { + const response = await apiClient.get('/gl/journal-entries', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope) }, + }); + return response.data; +} + +export async function fetchJournalEntry(id: number): Promise { + const response = await apiClient.get(`/gl/journal-entries/${id}`); + return response.data; +} + +export interface CreateManualEntryLineInput { + glAccountId: number; + debit: number; + credit: number; + description?: string; + branchSegmentValueId?: number; +} + +export interface CreateManualEntryInput { + journalCode: string; + entryDate: string; + description: string; + lines: CreateManualEntryLineInput[]; +} + +export async function createManualEntry(input: CreateManualEntryInput): Promise { + const response = await apiClient.post('/gl/journal-entries', input); + return response.data; +} + +export async function reverseJournalEntry(id: number, reason?: string): Promise { + const response = await apiClient.post(`/gl/journal-entries/${id}/reverse`, { reason }); + return response.data; +} diff --git a/client/src/api/journals.api.ts b/client/src/api/journals.api.ts new file mode 100644 index 0000000..6ea196f --- /dev/null +++ b/client/src/api/journals.api.ts @@ -0,0 +1,19 @@ +import { apiClient } from './client'; +import type { Journal, JournalType } from '../types/api'; + +export async function fetchJournals(): Promise { + const response = await apiClient.get('/gl/journals'); + return response.data; +} + +export interface CreateJournalInput { + code: string; + name: string; + journalType: JournalType; + defaultBranchSegmentValueId?: number; +} + +export async function createJournal(input: CreateJournalInput): Promise { + const response = await apiClient.post('/gl/journals', input); + return response.data; +} diff --git a/client/src/api/roles.api.ts b/client/src/api/roles.api.ts new file mode 100644 index 0000000..379fec5 --- /dev/null +++ b/client/src/api/roles.api.ts @@ -0,0 +1,17 @@ +import { apiClient } from './client'; +import type { Permission, Role } from '../types/api'; + +export async function fetchRoles(): Promise { + const response = await apiClient.get('/roles'); + return response.data; +} + +export async function fetchPermissions(): Promise { + const response = await apiClient.get('/roles/permissions'); + return response.data; +} + +export async function setRolePermissions(roleId: number, permissionIds: number[]): Promise { + const response = await apiClient.put(`/roles/${roleId}/permissions`, { permissionIds }); + return response.data; +} diff --git a/client/src/api/segments.api.ts b/client/src/api/segments.api.ts new file mode 100644 index 0000000..3a37b64 --- /dev/null +++ b/client/src/api/segments.api.ts @@ -0,0 +1,37 @@ +import { apiClient } from './client'; +import type { AccountSegmentDefinition, AccountSegmentValue, SegmentFormat } from '../types/api'; + +export async function fetchSegmentDefinitions(): Promise { + const response = await apiClient.get('/company/segment-definitions'); + return response.data; +} + +export interface CreateSegmentDefinitionInput { + segmentKey: string; + label: string; + order: number; + length: number; + format: SegmentFormat; + isBranchSegment: boolean; +} + +export async function createSegmentDefinition(input: CreateSegmentDefinitionInput): Promise { + const response = await apiClient.post('/company/segment-definitions', input); + return response.data; +} + +export interface CreateSegmentValueInput { + segmentDefId: number; + code: string; + description: string; +} + +export async function createSegmentValue(input: CreateSegmentValueInput): Promise { + const response = await apiClient.post('/company/segment-values', input); + return response.data; +} + +export async function fetchBranchValues(): Promise { + const response = await apiClient.get('/company/branches'); + return response.data; +} diff --git a/client/src/api/suppliers.api.ts b/client/src/api/suppliers.api.ts new file mode 100644 index 0000000..5dd7f39 --- /dev/null +++ b/client/src/api/suppliers.api.ts @@ -0,0 +1,36 @@ +import { apiClient } from './client'; +import type { Supplier, SupplierDetail } from '../types/api'; +import type { BranchSelection } from '../store/branchStore'; + +export async function fetchSuppliers(branchScope: BranchSelection): Promise { + const response = await apiClient.get('/ap/suppliers', { + params: { branchScope: branchScope === 'MAIN' ? 'MAIN' : String(branchScope) }, + }); + return response.data; +} + +export async function fetchSupplier(id: number): Promise { + const response = await apiClient.get(`/ap/suppliers/${id}`); + return response.data; +} + +export interface SupplierInput { + code: string; + name: string; + email?: string; + phone?: string; + address?: string; + taxNumber?: string; + branchSegmentValueId: number; + paymentTermsDays?: number; +} + +export async function createSupplier(input: SupplierInput): Promise { + const response = await apiClient.post('/ap/suppliers', input); + return response.data; +} + +export async function updateSupplier(id: number, input: Partial & { isActive?: boolean }): Promise { + const response = await apiClient.put(`/ap/suppliers/${id}`, input); + return response.data; +} diff --git a/client/src/api/taxCodes.api.ts b/client/src/api/taxCodes.api.ts new file mode 100644 index 0000000..7ce4843 --- /dev/null +++ b/client/src/api/taxCodes.api.ts @@ -0,0 +1,24 @@ +import { apiClient } from './client'; +import type { TaxCode } from '../types/api'; + +export async function fetchTaxCodes(): Promise { + const response = await apiClient.get('/tax/codes'); + return response.data; +} + +export interface TaxCodeInput { + code: string; + name: string; + ratePercent: number; + isActive?: boolean; +} + +export async function createTaxCode(input: TaxCodeInput): Promise { + const response = await apiClient.post('/tax/codes', input); + return response.data; +} + +export async function updateTaxCode(id: number, input: Partial): Promise { + const response = await apiClient.put(`/tax/codes/${id}`, input); + return response.data; +} diff --git a/client/src/api/users.api.ts b/client/src/api/users.api.ts new file mode 100644 index 0000000..d750a9e --- /dev/null +++ b/client/src/api/users.api.ts @@ -0,0 +1,24 @@ +import { apiClient } from './client'; +import type { AppUser } from '../types/api'; + +export async function fetchUsers(): Promise { + const response = await apiClient.get('/users'); + return response.data; +} + +export interface CreateUserInput { + email: string; + fullName: string; + roleIds: number[]; + branchSegmentValueIds?: number[]; +} + +export async function createUser(input: CreateUserInput): Promise { + const response = await apiClient.post('/users', input); + return response.data; +} + +export async function setUserActive(id: number, isActive: boolean): Promise { + const response = await apiClient.patch(`/users/${id}/active`, { isActive }); + return response.data; +} diff --git a/client/src/components/common/BranchSwitcher.tsx b/client/src/components/common/BranchSwitcher.tsx new file mode 100644 index 0000000..66275ed --- /dev/null +++ b/client/src/components/common/BranchSwitcher.tsx @@ -0,0 +1,29 @@ +import { FormControl, MenuItem, Select, type SelectChangeEvent } from '@mui/material'; +import { useBranchScope } from '../../hooks/useBranchScope'; + +export function BranchSwitcher() { + const { selected, setSelected, branches, canViewMain } = useBranchScope(); + + const handleChange = (event: SelectChangeEvent) => { + const value = event.target.value; + setSelected(value === 'MAIN' ? 'MAIN' : Number(value)); + }; + + return ( + + + + ); +} diff --git a/client/src/components/common/ConfirmDialog.tsx b/client/src/components/common/ConfirmDialog.tsx new file mode 100644 index 0000000..1351875 --- /dev/null +++ b/client/src/components/common/ConfirmDialog.tsx @@ -0,0 +1,30 @@ +import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material'; + +interface ConfirmDialogProps { + open: boolean; + title: string; + description: string; + confirmLabel?: string; + onConfirm: () => void; + onCancel: () => void; + loading?: boolean; +} + +export function ConfirmDialog({ open, title, description, confirmLabel = 'Confirm', onConfirm, onCancel, loading }: ConfirmDialogProps) { + return ( + + {title} + + {description} + + + + + + + ); +} diff --git a/client/src/components/common/MoneyCell.tsx b/client/src/components/common/MoneyCell.tsx new file mode 100644 index 0000000..6d5a070 --- /dev/null +++ b/client/src/components/common/MoneyCell.tsx @@ -0,0 +1,10 @@ +interface MoneyCellProps { + value: string | number | null | undefined; +} + +/** Display-only formatting — never round-trips this formatted value back to the server. */ +export function MoneyCell({ value }: MoneyCellProps) { + const amount = Number(value ?? 0); + if (amount === 0) return —; + return {amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}; +} diff --git a/client/src/components/common/StatusChip.tsx b/client/src/components/common/StatusChip.tsx new file mode 100644 index 0000000..02f014d --- /dev/null +++ b/client/src/components/common/StatusChip.tsx @@ -0,0 +1,15 @@ +import { Chip } from '@mui/material'; + +const COLOR_BY_STATUS: Record = { + POSTED: 'success', + DRAFT: 'warning', + REVERSED: 'error', + OPEN: 'success', + ACTIVE: 'success', + CLOSED: 'default', + LOCKED: 'warning', +}; + +export function StatusChip({ status }: { status: string }) { + return ; +} diff --git a/client/src/features/admin/coa/AdminChartOfAccountsPage.tsx b/client/src/features/admin/coa/AdminChartOfAccountsPage.tsx new file mode 100644 index 0000000..6bd998f --- /dev/null +++ b/client/src/features/admin/coa/AdminChartOfAccountsPage.tsx @@ -0,0 +1,157 @@ +import { useMemo, useState } from 'react'; +import { + Box, + Button, + Card, + Chip, + Collapse, + InputAdornment, + Stack, + TextField, + Typography, +} from '@mui/material'; +import SearchOutlinedIcon from '@mui/icons-material/SearchOutlined'; +import ExpandMoreOutlinedIcon from '@mui/icons-material/ExpandMoreOutlined'; +import ChevronRightOutlinedIcon from '@mui/icons-material/ChevronRightOutlined'; +import { useGLAccounts } from '../../../hooks/useGLAccounts'; +import { useBranchStore } from '../../../store/branchStore'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { GLAccountDialog } from './GLAccountDialog'; +import type { GLAccount, GLAccountType } from '../../../types/api'; + +const TYPE_ORDER: GLAccountType[] = ['ASSET', 'LIABILITY', 'EQUITY', 'INCOME', 'EXPENSE']; + +export function AdminChartOfAccountsPage() { + const selected = useBranchStore((state) => state.selected); + const { data: accounts, isLoading } = useGLAccounts(selected); + const [dialogOpen, setDialogOpen] = useState(false); + const [search, setSearch] = useState(''); + const [collapsed, setCollapsed] = useState>(new Set()); + + const grouped = useMemo(() => { + const term = search.trim().toLowerCase(); + const filtered = (accounts ?? []).filter( + (a) => !term || a.accountCode.toLowerCase().includes(term) || a.accountName.toLowerCase().includes(term), + ); + const map = new Map(); + for (const type of TYPE_ORDER) map.set(type, []); + for (const account of filtered) { + if (!map.has(account.accountType)) map.set(account.accountType, []); + map.get(account.accountType)!.push(account); + } + for (const list of map.values()) list.sort((a, b) => a.accountCode.localeCompare(b.accountCode)); + return map; + }, [accounts, search]); + + const toggle = (type: GLAccountType) => + setCollapsed((prev) => { + const next = new Set(prev); + if (next.has(type)) next.delete(type); + else next.add(type); + return next; + }); + + return ( + + + Chart of Accounts + + + + setSearch(e.target.value)} + sx={{ mb: 2, width: 320 }} + slotProps={{ + input: { startAdornment: }, + }} + /> + + {isLoading && ( + + Loading… + + )} + + + {Array.from(grouped.entries()) + .filter(([, list]) => list.length > 0) + .map(([type, list]) => { + const isCollapsed = collapsed.has(type); + const totalBalance = list.length; + return ( + + toggle(type)} + sx={{ + alignItems: 'center', + px: 2, + py: 1.25, + cursor: 'pointer', + bgcolor: '#f7f9fd', + borderBottom: '1px solid', + borderColor: 'divider', + '&:hover': { bgcolor: '#eef2fa' }, + }} + > + {isCollapsed ? : } + + {type} + + + + + {list.map((account) => ( + + + {account.accountCode} + + + {account.accountName} + + + {account.normalBalance} + + + {account.isControlAccount && } + + + + + + ))} + {list.length === 0 && ( + + No accounts in this category. + + )} + + + ); + })} + + + setDialogOpen(false)} /> + + ); +} diff --git a/client/src/features/admin/coa/GLAccountDialog.tsx b/client/src/features/admin/coa/GLAccountDialog.tsx new file mode 100644 index 0000000..950428f --- /dev/null +++ b/client/src/features/admin/coa/GLAccountDialog.tsx @@ -0,0 +1,138 @@ +import { useState } from 'react'; +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + FormControlLabel, + Checkbox, + MenuItem, + Stack, + TextField, +} from '@mui/material'; +import { useSegmentDefinitions } from '../../../hooks/useSegments'; +import { useCreateGLAccount } from '../../../hooks/useGLAccounts'; +import type { GLAccountType, DebitCredit, ControlAccountType } from '../../../types/api'; + +const ACCOUNT_TYPES: GLAccountType[] = ['ASSET', 'LIABILITY', 'EQUITY', 'INCOME', 'EXPENSE']; +const DEBIT_CREDIT: DebitCredit[] = ['DEBIT', 'CREDIT']; +const CONTROL_TYPES: ControlAccountType[] = ['AR', 'AP', 'STOCK', 'TAX_OUTPUT', 'TAX_INPUT', 'BANK', 'RETAINED_EARNINGS']; + +export function GLAccountDialog({ open, onClose }: { open: boolean; onClose: () => void }) { + const { data: definitions } = useSegmentDefinitions(); + const createAccount = useCreateGLAccount(); + + const [accountName, setAccountName] = useState(''); + const [accountType, setAccountType] = useState('ASSET'); + const [normalBalance, setNormalBalance] = useState('DEBIT'); + const [isControlAccount, setIsControlAccount] = useState(false); + const [controlType, setControlType] = useState(''); + const [segmentValueBySegment, setSegmentValueBySegment] = useState>({}); + const [error, setError] = useState(null); + + const activeDefs = (definitions ?? []).filter((def) => def.isActive).sort((a, b) => a.order - b.order); + + const handleSubmit = async () => { + setError(null); + const segmentSelections = activeDefs.map((def) => ({ segmentDefId: def.id, segmentValueId: segmentValueBySegment[def.id] })); + if (segmentSelections.some((s) => !s.segmentValueId)) { + setError('Select a value for every segment'); + return; + } + try { + await createAccount.mutateAsync({ + accountName, + accountType, + normalBalance, + isControlAccount, + controlType: controlType || undefined, + segmentSelections, + }); + onClose(); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to create account'); + } + }; + + return ( + + New GL Account + + + setAccountName(e.target.value)} fullWidth /> + + setAccountType(e.target.value as GLAccountType)} + fullWidth + > + {ACCOUNT_TYPES.map((type) => ( + + {type} + + ))} + + setNormalBalance(e.target.value as DebitCredit)} + fullWidth + > + {DEBIT_CREDIT.map((option) => ( + + {option} + + ))} + + + setIsControlAccount(e.target.checked)} />} + label="Control account" + /> + {isControlAccount && ( + setControlType(e.target.value as ControlAccountType)} + fullWidth + > + {CONTROL_TYPES.map((type) => ( + + {type} + + ))} + + )} + {activeDefs.map((def) => ( + setSegmentValueBySegment((prev) => ({ ...prev, [def.id]: Number(e.target.value) }))} + fullWidth + > + {def.values.map((value) => ( + + {value.code} — {value.description} + + ))} + + ))} + {error && {error}} + + + + + + + + ); +} diff --git a/client/src/features/admin/fiscal/AdminFiscalYearsPage.tsx b/client/src/features/admin/fiscal/AdminFiscalYearsPage.tsx new file mode 100644 index 0000000..2f0a609 --- /dev/null +++ b/client/src/features/admin/fiscal/AdminFiscalYearsPage.tsx @@ -0,0 +1,70 @@ +import { useState } from 'react'; +import { Box, Button, Paper, Stack, TextField, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useCreateFiscalYear, useFiscalYears } from '../../../hooks/useFiscalYears'; +import { StatusChip } from '../../../components/common/StatusChip'; +import type { FiscalPeriod } from '../../../types/api'; + +export function AdminFiscalYearsPage() { + const { data: fiscalYears, isLoading } = useFiscalYears(); + const createFiscalYear = useCreateFiscalYear(); + const [newYear, setNewYear] = useState(''); + const [selectedYearId, setSelectedYearId] = useState(null); + + const selectedYear = (fiscalYears ?? []).find((year) => year.id === selectedYearId) ?? fiscalYears?.[0]; + + const periodColumns: GridColDef[] = [ + { field: 'periodNumber', headerName: 'Period', width: 100 }, + { field: 'startDate', headerName: 'Start', width: 140, valueFormatter: (value: string) => value?.slice(0, 10) }, + { field: 'endDate', headerName: 'End', width: 140, valueFormatter: (value: string) => value?.slice(0, 10) }, + { field: 'status', headerName: 'Status', width: 120, renderCell: (params) => }, + ]; + + return ( + + + Fiscal Years + + + setNewYear(e.target.value)} /> + + + + + {(fiscalYears ?? []).map((year) => ( + + ))} + + + {selectedYear && ( + + + + + + )} + + ); +} diff --git a/client/src/features/admin/journals/AdminJournalsPage.tsx b/client/src/features/admin/journals/AdminJournalsPage.tsx new file mode 100644 index 0000000..32fc036 --- /dev/null +++ b/client/src/features/admin/journals/AdminJournalsPage.tsx @@ -0,0 +1,33 @@ +import { useState } from 'react'; +import { Box, Button, Stack, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useJournals } from '../../../hooks/useJournals'; +import type { Journal } from '../../../types/api'; +import { JournalDialog } from './JournalDialog'; + +const columns: GridColDef[] = [ + { field: 'code', headerName: 'Code', width: 140 }, + { field: 'name', headerName: 'Name', flex: 1 }, + { field: 'journalType', headerName: 'Type', width: 160 }, + { field: 'isActive', headerName: 'Active', width: 100, type: 'boolean' }, +]; + +export function AdminJournalsPage() { + const { data: journals, isLoading } = useJournals(); + const [dialogOpen, setDialogOpen] = useState(false); + + return ( + + + Journals + + + + + + setDialogOpen(false)} /> + + ); +} diff --git a/client/src/features/admin/journals/JournalDialog.tsx b/client/src/features/admin/journals/JournalDialog.tsx new file mode 100644 index 0000000..b0a1136 --- /dev/null +++ b/client/src/features/admin/journals/JournalDialog.tsx @@ -0,0 +1,71 @@ +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, MenuItem, Stack, TextField } from '@mui/material'; +import { useCreateJournal } from '../../../hooks/useJournals'; +import { useSegmentDefinitions } from '../../../hooks/useSegments'; + +const JOURNAL_TYPES = ['GENERAL', 'SALES', 'PURCHASES', 'CASH_RECEIPT', 'CASH_PAYMENT', 'STOCK', 'BANK', 'CUSTOM'] as const; + +const schema = z.object({ + code: z.string().min(1).max(20), + name: z.string().min(1), + journalType: z.enum(JOURNAL_TYPES), + defaultBranchSegmentValueId: z.coerce.number().int().optional(), +}); + +type FormValues = z.infer; + +export function JournalDialog({ open, onClose }: { open: boolean; onClose: () => void }) { + const createJournal = useCreateJournal(); + const { data: definitions } = useSegmentDefinitions(); + const branchDef = (definitions ?? []).find((def) => def.isBranchSegment); + + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ resolver: zodResolver(schema), defaultValues: { code: '', name: '', journalType: 'CUSTOM' } }); + + const onSubmit = handleSubmit(async (values) => { + await createJournal.mutateAsync(values); + reset(); + onClose(); + }); + + return ( + + New Journal + + + + + + {JOURNAL_TYPES.map((type) => ( + + {type} + + ))} + + {branchDef && ( + + None + {branchDef.values.map((value) => ( + + {value.code} — {value.description} + + ))} + + )} + + + + + + + + ); +} diff --git a/client/src/features/admin/segments/AdminSegmentsPage.tsx b/client/src/features/admin/segments/AdminSegmentsPage.tsx new file mode 100644 index 0000000..f9ada13 --- /dev/null +++ b/client/src/features/admin/segments/AdminSegmentsPage.tsx @@ -0,0 +1,77 @@ +import { useState } from 'react'; +import { + Box, + Button, + Chip, + CircularProgress, + Paper, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from '@mui/material'; +import { useSegmentDefinitions } from '../../../hooks/useSegments'; +import { SegmentDefinitionDialog } from './SegmentDefinitionDialog'; +import { SegmentValueDialog } from './SegmentValueDialog'; + +export function AdminSegmentsPage() { + const { data: definitions, isLoading } = useSegmentDefinitions(); + const [defDialogOpen, setDefDialogOpen] = useState(false); + const [valueDialogFor, setValueDialogFor] = useState(null); + + if (isLoading) return ; + + return ( + + + Account Segments & Branches + + + + + {(definitions ?? []) + .sort((a, b) => a.order - b.order) + .map((def) => ( + + + + + {def.order}. {def.label} ({def.segmentKey}) + + {def.isBranchSegment && } + + + + + + + + Code + Description + + + + {def.values.map((value) => ( + + {value.code} + {value.description} + + ))} + +
+
+ ))} +
+ + setDefDialogOpen(false)} /> + setValueDialogFor(null)} /> +
+ ); +} diff --git a/client/src/features/admin/segments/SegmentDefinitionDialog.tsx b/client/src/features/admin/segments/SegmentDefinitionDialog.tsx new file mode 100644 index 0000000..25bc0bd --- /dev/null +++ b/client/src/features/admin/segments/SegmentDefinitionDialog.tsx @@ -0,0 +1,83 @@ +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { + Button, + Checkbox, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + FormControlLabel, + MenuItem, + Stack, + TextField, +} from '@mui/material'; +import { useCreateSegmentDefinition } from '../../../hooks/useSegments'; + +const schema = z.object({ + segmentKey: z.string().min(1).max(30), + label: z.string().min(1), + order: z.coerce.number().int().min(0), + length: z.coerce.number().int().min(1).max(20), + format: z.enum(['NUMERIC', 'ALPHA', 'ALPHANUMERIC']), + isBranchSegment: z.boolean(), +}); + +type FormValues = z.infer; + +export function SegmentDefinitionDialog({ open, onClose }: { open: boolean; onClose: () => void }) { + const createDefinition = useCreateSegmentDefinition(); + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ + resolver: zodResolver(schema), + defaultValues: { segmentKey: '', label: '', order: 0, length: 3, format: 'NUMERIC', isBranchSegment: false }, + }); + + const onSubmit = handleSubmit(async (values) => { + await createDefinition.mutateAsync(values); + reset(); + onClose(); + }); + + return ( + + New Account Segment + + + + + + + + Numeric + Alpha + Alphanumeric + + } label="This is the branch segment" /> + + + + + + + + ); +} diff --git a/client/src/features/admin/segments/SegmentValueDialog.tsx b/client/src/features/admin/segments/SegmentValueDialog.tsx new file mode 100644 index 0000000..85e6d82 --- /dev/null +++ b/client/src/features/admin/segments/SegmentValueDialog.tsx @@ -0,0 +1,58 @@ +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Stack, TextField } from '@mui/material'; +import { useCreateSegmentValue } from '../../../hooks/useSegments'; + +const schema = z.object({ + code: z.string().min(1), + description: z.string().min(1), +}); + +type FormValues = z.infer; + +interface SegmentValueDialogProps { + open: boolean; + segmentDefId: number | null; + onClose: () => void; +} + +export function SegmentValueDialog({ open, segmentDefId, onClose }: SegmentValueDialogProps) { + const createValue = useCreateSegmentValue(); + const { + register, + handleSubmit, + reset, + formState: { errors }, + } = useForm({ resolver: zodResolver(schema), defaultValues: { code: '', description: '' } }); + + const onSubmit = handleSubmit(async (values) => { + if (segmentDefId === null) return; + await createValue.mutateAsync({ segmentDefId, ...values }); + reset(); + onClose(); + }); + + return ( + + New Segment Value + + + + + + + + + + + + ); +} diff --git a/client/src/features/admin/tax/AdminTaxCodesPage.tsx b/client/src/features/admin/tax/AdminTaxCodesPage.tsx new file mode 100644 index 0000000..4b67711 --- /dev/null +++ b/client/src/features/admin/tax/AdminTaxCodesPage.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import { Box, Button, Card, Stack, Switch, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useTaxCodes, useUpdateTaxCode } from '../../../hooks/useTaxCodes'; +import { useAuth } from '../../../hooks/useAuth'; +import type { TaxCode } from '../../../types/api'; +import { TaxCodeDialog } from './TaxCodeDialog'; + +export function AdminTaxCodesPage() { + const { data: taxCodes, isLoading } = useTaxCodes(); + const updateTaxCode = useUpdateTaxCode(); + const { hasPermission } = useAuth(); + const [dialogOpen, setDialogOpen] = useState(false); + + const columns: GridColDef[] = [ + { field: 'code', headerName: 'Code', width: 140 }, + { field: 'name', headerName: 'Name', flex: 1 }, + { field: 'ratePercent', headerName: 'Rate %', width: 120, align: 'right', headerAlign: 'right' }, + { + field: 'isActive', + headerName: 'Active', + width: 100, + renderCell: (params) => ( + updateTaxCode.mutate({ id: params.row.id, input: { isActive: e.target.checked } })} + /> + ), + }, + ]; + + return ( + + + Tax Codes + {hasPermission('admin.tax.manage') && ( + + )} + + + + + setDialogOpen(false)} /> + + ); +} diff --git a/client/src/features/admin/tax/TaxCodeDialog.tsx b/client/src/features/admin/tax/TaxCodeDialog.tsx new file mode 100644 index 0000000..29fad46 --- /dev/null +++ b/client/src/features/admin/tax/TaxCodeDialog.tsx @@ -0,0 +1,50 @@ +import { useState } from 'react'; +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Stack, TextField } from '@mui/material'; +import { useCreateTaxCode } from '../../../hooks/useTaxCodes'; + +export function TaxCodeDialog({ open, onClose }: { open: boolean; onClose: () => void }) { + const createTaxCode = useCreateTaxCode(); + const [code, setCode] = useState(''); + const [name, setName] = useState(''); + const [ratePercent, setRatePercent] = useState(''); + const [error, setError] = useState(null); + + const handleSubmit = async () => { + setError(null); + try { + await createTaxCode.mutateAsync({ code, name, ratePercent: Number(ratePercent) }); + onClose(); + setCode(''); + setName(''); + setRatePercent(''); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to create tax code'); + } + }; + + return ( + + New Tax Code + + + setCode(e.target.value.toUpperCase())} helperText="e.g. STD, ZERO" /> + setName(e.target.value)} /> + setRatePercent(e.target.value)} + slotProps={{ htmlInput: { min: 0, max: 100, step: '0.001' } }} + /> + {error && {error}} + + + + + + + + ); +} diff --git a/client/src/features/admin/users/AdminUsersPage.tsx b/client/src/features/admin/users/AdminUsersPage.tsx new file mode 100644 index 0000000..f4b2f57 --- /dev/null +++ b/client/src/features/admin/users/AdminUsersPage.tsx @@ -0,0 +1,65 @@ +import { useState } from 'react'; +import { Box, Button, Stack, Switch, Tab, Tabs, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useSetUserActive, useUsers } from '../../../hooks/useUsers'; +import type { AppUser } from '../../../types/api'; +import { UserDialog } from './UserDialog'; +import { RolePermissionMatrix } from './RolePermissionMatrix'; + +export function AdminUsersPage() { + const { data: users, isLoading } = useUsers(); + const setActive = useSetUserActive(); + const [dialogOpen, setDialogOpen] = useState(false); + const [tab, setTab] = useState(0); + + const columns: GridColDef[] = [ + { field: 'fullName', headerName: 'Name', flex: 1 }, + { field: 'email', headerName: 'Email', flex: 1 }, + { + field: 'roles', + headerName: 'Roles', + flex: 1, + valueGetter: (_value, row) => row.roles.map((r) => r.role.name).join(', '), + }, + { + field: 'isActive', + headerName: 'Active', + width: 100, + renderCell: (params) => ( + setActive.mutate({ id: params.row.id, isActive: e.target.checked })} + /> + ), + }, + ]; + + return ( + + + Users & Roles + + setTab(value)} sx={{ mb: 2 }}> + + + + + {tab === 0 && ( + + + + + + + + setDialogOpen(false)} /> + + )} + + {tab === 1 && } + + ); +} diff --git a/client/src/features/admin/users/RolePermissionMatrix.tsx b/client/src/features/admin/users/RolePermissionMatrix.tsx new file mode 100644 index 0000000..c663597 --- /dev/null +++ b/client/src/features/admin/users/RolePermissionMatrix.tsx @@ -0,0 +1,53 @@ +import { Checkbox, CircularProgress, Paper, Table, TableBody, TableCell, TableHead, TableRow } from '@mui/material'; +import { useRoles, usePermissions, useSetRolePermissions } from '../../../hooks/useRoles'; + +export function RolePermissionMatrix() { + const { data: roles, isLoading: rolesLoading } = useRoles(); + const { data: permissions, isLoading: permissionsLoading } = usePermissions(); + const setRolePermissions = useSetRolePermissions(); + + if (rolesLoading || permissionsLoading) return ; + + const handleToggle = (roleId: number, currentPermissionIds: number[], permissionId: number) => { + const next = currentPermissionIds.includes(permissionId) + ? currentPermissionIds.filter((id) => id !== permissionId) + : [...currentPermissionIds, permissionId]; + setRolePermissions.mutate({ roleId, permissionIds: next }); + }; + + return ( + + + + + Permission + {(roles ?? []).map((role) => ( + + {role.name} + + ))} + + + + {(permissions ?? []).map((permission) => ( + + {permission.key} + {(roles ?? []).map((role) => { + const currentPermissionIds = role.permissions.map((rp) => rp.permission.id); + return ( + + handleToggle(role.id, currentPermissionIds, permission.id)} + /> + + ); + })} + + ))} + +
+
+ ); +} diff --git a/client/src/features/admin/users/UserDialog.tsx b/client/src/features/admin/users/UserDialog.tsx new file mode 100644 index 0000000..ad88d84 --- /dev/null +++ b/client/src/features/admin/users/UserDialog.tsx @@ -0,0 +1,100 @@ +import { useState } from 'react'; +import { + Button, + Checkbox, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + FormControlLabel, + FormGroup, + Stack, + TextField, + Typography, +} from '@mui/material'; +import { useCreateUser } from '../../../hooks/useUsers'; +import { useRoles } from '../../../hooks/useRoles'; +import { useSegmentDefinitions } from '../../../hooks/useSegments'; + +export function UserDialog({ open, onClose }: { open: boolean; onClose: () => void }) { + const { data: roles } = useRoles(); + const { data: definitions } = useSegmentDefinitions(); + const branchDef = (definitions ?? []).find((def) => def.isBranchSegment); + const createUser = useCreateUser(); + + const [email, setEmail] = useState(''); + const [fullName, setFullName] = useState(''); + const [roleIds, setRoleIds] = useState([]); + const [branchIds, setBranchIds] = useState([]); + const [error, setError] = useState(null); + + const toggle = (list: number[], setList: (ids: number[]) => void, id: number) => + setList(list.includes(id) ? list.filter((existing) => existing !== id) : [...list, id]); + + const handleSubmit = async () => { + setError(null); + if (roleIds.length === 0) { + setError('Select at least one role'); + return; + } + try { + await createUser.mutateAsync({ email, fullName, roleIds, branchSegmentValueIds: branchIds }); + onClose(); + setEmail(''); + setFullName(''); + setRoleIds([]); + setBranchIds([]); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to create user'); + } + }; + + return ( + + New User + + + setFullName(e.target.value)} /> + setEmail(e.target.value)} + helperText="Must match the email this person signs in with at the Account Manager" + /> + Roles + + {(roles ?? []).map((role) => ( + toggle(roleIds, setRoleIds, role.id)} />} + label={role.name} + /> + ))} + + {branchDef && ( + <> + Branch restrictions (leave empty for unrestricted) + + {branchDef.values.map((value) => ( + toggle(branchIds, setBranchIds, value.id)} />} + label={value.code} + /> + ))} + + + )} + {error && {error}} + + + + + + + + ); +} diff --git a/client/src/features/ap/debitNotes/DebitNoteDetailPage.tsx b/client/src/features/ap/debitNotes/DebitNoteDetailPage.tsx new file mode 100644 index 0000000..345df92 --- /dev/null +++ b/client/src/features/ap/debitNotes/DebitNoteDetailPage.tsx @@ -0,0 +1,186 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { + Alert, + Box, + Button, + Card, + CircularProgress, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from '@mui/material'; +import { useAllocateDebitNote, useDebitNote, usePostDebitNote, useVoidDebitNote } from '../../../hooks/useAPDebitNotes'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { APAllocationPanel } from '../shared/APAllocationPanel'; + +export function DebitNoteDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const debitNoteId = id ? Number(id) : undefined; + const { data: debitNote, isLoading } = useDebitNote(debitNoteId); + const postDebitNote = usePostDebitNote(); + const voidDebitNote = useVoidDebitNote(); + const allocateDebitNote = useAllocateDebitNote(); + const { hasPermission } = useAuth(); + const [error, setError] = useState(null); + const autoPosted = useRef(false); + + useEffect(() => { + if (searchParams.get('post') === '1' && debitNote?.status === 'DRAFT' && !autoPosted.current) { + autoPosted.current = true; + postDebitNote.mutateAsync(debitNote.id).catch((err) => { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post debit note'); + }); + setSearchParams({}, { replace: true }); + } + }, [debitNote, postDebitNote, searchParams, setSearchParams]); + + if (isLoading || !debitNote) return ; + + const handlePost = async () => { + setError(null); + try { + await postDebitNote.mutateAsync(debitNote.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post debit note'); + } + }; + + const handleVoid = async () => { + setError(null); + try { + await voidDebitNote.mutateAsync(debitNote.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to void debit note'); + } + }; + + return ( + + + + {debitNote.debitNoteNumber} + + + {debitNote.status === 'DRAFT' && hasPermission('ap.debitnote.manage') && ( + + + + + )} + + + {error && ( + + {error} + + )} + + + + + + Supplier + + navigate(`/ap/suppliers/${debitNote.supplierId}`)} + > + {debitNote.supplier?.name} + + + + + Date + + {debitNote.debitNoteDate.slice(0, 10)} + + + + Reason + + {debitNote.reason || '—'} + + + + Unallocated Balance + + + + + + + + + + + + + Description + Qty + Unit Price + Expense Account + Tax + Amount + + + + {debitNote.lines.map((line) => ( + + {line.description} + {line.quantity} + + + + {line.expenseGLAccount?.accountName} + {line.taxCode?.code ?? '—'} + + + + + ))} + + + Total + + + + + + + + +
+
+ + {debitNote.status === 'POSTED' && ( + + + Allocate Against Invoices + + allocateDebitNote.mutateAsync({ id: debitNote.id, allocations })} + /> + + )} +
+ ); +} diff --git a/client/src/features/ap/debitNotes/DebitNoteFormPage.tsx b/client/src/features/ap/debitNotes/DebitNoteFormPage.tsx new file mode 100644 index 0000000..9e07cfe --- /dev/null +++ b/client/src/features/ap/debitNotes/DebitNoteFormPage.tsx @@ -0,0 +1,153 @@ +import { useMemo, useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, MenuItem, Stack, TextField, Typography } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import { useSuppliers } from '../../../hooks/useSuppliers'; +import { useGLAccounts } from '../../../hooks/useGLAccounts'; +import { useTaxCodes } from '../../../hooks/useTaxCodes'; +import { useCreateDebitNote } from '../../../hooks/useAPDebitNotes'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { APDocumentLineEditor, blankAPDocumentLine, apLineTotals, type APDocumentLineDraft } from '../shared/APDocumentLineEditor'; + +export function DebitNoteFormPage() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const preselectedSupplierId = searchParams.get('supplierId'); + + const { data: suppliers } = useSuppliers('MAIN'); + const { data: taxCodes } = useTaxCodes(); + const createDebitNote = useCreateDebitNote(); + + const [supplierId, setSupplierId] = useState(preselectedSupplierId ? Number(preselectedSupplierId) : ''); + const [debitNoteDate, setDebitNoteDate] = useState(new Date().toISOString().slice(0, 10)); + const [reference, setReference] = useState(''); + const [reason, setReason] = useState(''); + const [lines, setLines] = useState([blankAPDocumentLine()]); + const [error, setError] = useState(null); + + const supplier = (suppliers ?? []).find((s) => s.id === supplierId); + const { data: expenseAccounts } = useGLAccounts(supplier ? supplier.branchSegmentValueId : 'MAIN', 'EXPENSE'); + + const totals = useMemo(() => { + const computed = lines.map((line) => apLineTotals(line, taxCodes ?? [])); + return { + subtotal: computed.reduce((sum, l) => sum + l.subtotal, 0), + tax: computed.reduce((sum, l) => sum + l.tax, 0), + total: computed.reduce((sum, l) => sum + l.total, 0), + }; + }, [lines, taxCodes]); + + const save = async (postAfter: boolean) => { + setError(null); + if (!supplierId) { + setError('Select a supplier'); + return; + } + if (lines.some((line) => !line.expenseGLAccountId || !line.description || !Number(line.unitPrice))) { + setError('Every line needs a description, unit price, and expense account'); + return; + } + try { + const debitNote = await createDebitNote.mutateAsync({ + supplierId, + debitNoteDate, + reference: reference || undefined, + reason: reason || undefined, + lines: lines.map((line) => ({ + description: line.description, + quantity: Number(line.quantity) || 1, + unitPrice: Number(line.unitPrice) || 0, + expenseGLAccountId: line.expenseGLAccountId as number, + taxCodeId: line.taxCodeId ? (line.taxCodeId as number) : undefined, + })), + }); + navigate(postAfter ? `/ap/debit-notes/${debitNote.id}?post=1` : `/ap/debit-notes/${debitNote.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to save debit note')); + } + }; + + return ( + + + New Debit Note + + + + + setSupplierId(Number(e.target.value))} + sx={{ minWidth: 260 }} + > + {(suppliers ?? []).map((s) => ( + + {s.code} — {s.name} + + ))} + + setDebitNoteDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + setReference(e.target.value)} sx={{ minWidth: 180 }} /> + setReason(e.target.value)} sx={{ minWidth: 220 }} /> + + + + + + + + + + + Subtotal + + + + + + + + Tax + + + + + + + Total + + + + + + + + {error && ( + + {error} + + )} + + + + + + + + ); +} diff --git a/client/src/features/ap/invoices/InvoiceDetailPage.tsx b/client/src/features/ap/invoices/InvoiceDetailPage.tsx new file mode 100644 index 0000000..eeb2f22 --- /dev/null +++ b/client/src/features/ap/invoices/InvoiceDetailPage.tsx @@ -0,0 +1,224 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { + Alert, + Box, + Button, + Card, + CircularProgress, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from '@mui/material'; +import { useInvoice, usePostInvoice, useVoidInvoice } from '../../../hooks/useAPInvoices'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; + +export function InvoiceDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const invoiceId = id ? Number(id) : undefined; + const { data: invoice, isLoading } = useInvoice(invoiceId); + const postInvoice = usePostInvoice(); + const voidInvoice = useVoidInvoice(); + const { hasPermission } = useAuth(); + const [error, setError] = useState(null); + const autoPosted = useRef(false); + + useEffect(() => { + if (searchParams.get('post') === '1' && invoice?.status === 'DRAFT' && !autoPosted.current) { + autoPosted.current = true; + postInvoice.mutateAsync(invoice.id).catch((err) => { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post invoice'); + }); + setSearchParams({}, { replace: true }); + } + }, [invoice, postInvoice, searchParams, setSearchParams]); + + if (isLoading || !invoice) return ; + + const handlePost = async () => { + setError(null); + try { + await postInvoice.mutateAsync(invoice.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post invoice'); + } + }; + + const handleVoid = async () => { + setError(null); + try { + await voidInvoice.mutateAsync(invoice.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to void invoice'); + } + }; + + return ( + + + + {invoice.invoiceNumber} + + + + {invoice.status === 'DRAFT' && hasPermission('ap.invoice.manage') && ( + <> + + + + )} + + + + {error && ( + + {error} + + )} + + + + + + Supplier + + navigate(`/ap/suppliers/${invoice.supplierId}`)} + > + {invoice.supplier?.name} + + + + + Invoice Date + + {invoice.invoiceDate.slice(0, 10)} + + + + Due Date + + {invoice.dueDate.slice(0, 10)} + + + + Supplier Reference + + {invoice.supplierReference || '—'} + + + + Balance + + + + + + + + + + + + + Description + Qty + Unit Price + Expense Account + Tax + Amount + + + + {invoice.lines.map((line) => ( + + {line.description} + {line.quantity} + + + + {line.expenseGLAccount?.accountName} + {line.taxCode?.code ?? '—'} + + + + + ))} + + + Subtotal + + + + + + + + Tax + + + + + + + + Total + + + + + + + + +
+
+ + {invoice.allocations && invoice.allocations.length > 0 && ( + + + Allocations + + + + + Source + Date + Amount + + + + {invoice.allocations.map((allocation) => ( + + + {allocation.payment?.paymentNumber ?? allocation.debitNote?.debitNoteNumber} + + {allocation.allocatedAt.slice(0, 10)} + + + + + ))} + +
+
+ )} +
+ ); +} diff --git a/client/src/features/ap/invoices/InvoiceFormPage.tsx b/client/src/features/ap/invoices/InvoiceFormPage.tsx new file mode 100644 index 0000000..468decf --- /dev/null +++ b/client/src/features/ap/invoices/InvoiceFormPage.tsx @@ -0,0 +1,164 @@ +import { useMemo, useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, MenuItem, Stack, TextField, Typography } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import { useSuppliers } from '../../../hooks/useSuppliers'; +import { useGLAccounts } from '../../../hooks/useGLAccounts'; +import { useTaxCodes } from '../../../hooks/useTaxCodes'; +import { useCreateInvoice } from '../../../hooks/useAPInvoices'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { APDocumentLineEditor, blankAPDocumentLine, apLineTotals, type APDocumentLineDraft } from '../shared/APDocumentLineEditor'; + +function addDays(dateStr: string, days: number): string { + const date = new Date(dateStr); + date.setDate(date.getDate() + days); + return date.toISOString().slice(0, 10); +} + +export function InvoiceFormPage() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const preselectedSupplierId = searchParams.get('supplierId'); + + const { data: suppliers } = useSuppliers('MAIN'); + const { data: taxCodes } = useTaxCodes(); + const createInvoice = useCreateInvoice(); + + const [supplierId, setSupplierId] = useState(preselectedSupplierId ? Number(preselectedSupplierId) : ''); + const [invoiceDate, setInvoiceDate] = useState(new Date().toISOString().slice(0, 10)); + const [supplierReference, setSupplierReference] = useState(''); + const [lines, setLines] = useState([blankAPDocumentLine()]); + const [error, setError] = useState(null); + + const supplier = (suppliers ?? []).find((s) => s.id === supplierId); + const { data: expenseAccounts } = useGLAccounts(supplier ? supplier.branchSegmentValueId : 'MAIN', 'EXPENSE'); + const dueDate = supplier ? addDays(invoiceDate, supplier.paymentTermsDays) : invoiceDate; + + const totals = useMemo(() => { + const computed = lines.map((line) => apLineTotals(line, taxCodes ?? [])); + return { + subtotal: computed.reduce((sum, l) => sum + l.subtotal, 0), + tax: computed.reduce((sum, l) => sum + l.tax, 0), + total: computed.reduce((sum, l) => sum + l.total, 0), + }; + }, [lines, taxCodes]); + + const save = async (postAfter: boolean) => { + setError(null); + if (!supplierId) { + setError('Select a supplier'); + return; + } + if (lines.some((line) => !line.expenseGLAccountId || !line.description || !Number(line.unitPrice))) { + setError('Every line needs a description, unit price, and expense account'); + return; + } + try { + const invoice = await createInvoice.mutateAsync({ + supplierId, + invoiceDate, + dueDate, + supplierReference: supplierReference || undefined, + lines: lines.map((line) => ({ + description: line.description, + quantity: Number(line.quantity) || 1, + unitPrice: Number(line.unitPrice) || 0, + expenseGLAccountId: line.expenseGLAccountId as number, + taxCodeId: line.taxCodeId ? (line.taxCodeId as number) : undefined, + })), + }); + navigate(postAfter ? `/ap/invoices/${invoice.id}?post=1` : `/ap/invoices/${invoice.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to save invoice')); + } + }; + + return ( + + + New Supplier Invoice + + + + + setSupplierId(Number(e.target.value))} + sx={{ minWidth: 260 }} + > + {(suppliers ?? []).map((s) => ( + + {s.code} — {s.name} + + ))} + + setInvoiceDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + + setSupplierReference(e.target.value)} + sx={{ minWidth: 200 }} + /> + + + + + + + + + + + Subtotal + + + + + + + + Tax + + + + + + + Total + + + + + + + + {error && ( + + {error} + + )} + + + + + + + + ); +} diff --git a/client/src/features/ap/invoices/InvoicesListPage.tsx b/client/src/features/ap/invoices/InvoicesListPage.tsx new file mode 100644 index 0000000..0d71e2f --- /dev/null +++ b/client/src/features/ap/invoices/InvoicesListPage.tsx @@ -0,0 +1,65 @@ +import { useNavigate } from 'react-router-dom'; +import { Box, Button, Card, Stack, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useInvoices } from '../../../hooks/useAPInvoices'; +import { useBranchStore } from '../../../store/branchStore'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { APInvoice } from '../../../types/api'; + +export function InvoicesListPage() { + const navigate = useNavigate(); + const selected = useBranchStore((state) => state.selected); + const { data: invoices, isLoading } = useInvoices(selected); + const { hasPermission } = useAuth(); + + const columns: GridColDef[] = [ + { field: 'invoiceNumber', headerName: 'Invoice #', width: 180 }, + { field: 'supplier', headerName: 'Supplier', flex: 1, valueGetter: (_v, row) => row.supplier?.name }, + { field: 'invoiceDate', headerName: 'Date', width: 120, valueFormatter: (value: string) => value?.slice(0, 10) }, + { field: 'dueDate', headerName: 'Due', width: 120, valueFormatter: (value: string) => value?.slice(0, 10) }, + { + field: 'total', + headerName: 'Total', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { + field: 'balance', + headerName: 'Balance', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { field: 'status', headerName: 'Status', width: 120, renderCell: (params) => }, + ]; + + return ( + + + Supplier Invoices + {hasPermission('ap.invoice.manage') && ( + + )} + + + navigate(`/ap/invoices/${params.row.id}`)} + sx={{ border: 'none', '& .MuiDataGrid-row': { cursor: 'pointer' } }} + initialState={{ sorting: { sortModel: [{ field: 'invoiceDate', sort: 'desc' }] } }} + /> + + + ); +} diff --git a/client/src/features/ap/payments/PaymentDetailPage.tsx b/client/src/features/ap/payments/PaymentDetailPage.tsx new file mode 100644 index 0000000..7a37713 --- /dev/null +++ b/client/src/features/ap/payments/PaymentDetailPage.tsx @@ -0,0 +1,140 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, CircularProgress, Stack, Typography } from '@mui/material'; +import { useAllocatePayment, usePayment, usePostPayment, useVoidPayment } from '../../../hooks/useAPPayments'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { APAllocationPanel } from '../shared/APAllocationPanel'; + +export function PaymentDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const paymentId = id ? Number(id) : undefined; + const { data: payment, isLoading } = usePayment(paymentId); + const postPayment = usePostPayment(); + const voidPayment = useVoidPayment(); + const allocatePayment = useAllocatePayment(); + const { hasPermission } = useAuth(); + const [error, setError] = useState(null); + const autoPosted = useRef(false); + + useEffect(() => { + if (searchParams.get('post') === '1' && payment?.status === 'DRAFT' && !autoPosted.current) { + autoPosted.current = true; + postPayment.mutateAsync(payment.id).catch((err) => { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post payment'); + }); + setSearchParams({}, { replace: true }); + } + }, [payment, postPayment, searchParams, setSearchParams]); + + if (isLoading || !payment) return ; + + const handlePost = async () => { + setError(null); + try { + await postPayment.mutateAsync(payment.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post payment'); + } + }; + + const handleVoid = async () => { + setError(null); + try { + await voidPayment.mutateAsync(payment.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to void payment'); + } + }; + + return ( + + + + {payment.paymentNumber} + + + {payment.status === 'DRAFT' && hasPermission('ap.payment.manage') && ( + + + + + )} + + + {error && ( + + {error} + + )} + + + + + + Supplier + + navigate(`/ap/suppliers/${payment.supplierId}`)} + > + {payment.supplier?.name} + + + + + Date + + {payment.paymentDate.slice(0, 10)} + + + + Paid From + + {payment.bankGLAccount?.accountName} + + + + Amount + + + + + + + + Unallocated + + + + + + + + + {payment.status === 'POSTED' && ( + + + Allocate Against Invoices + + allocatePayment.mutateAsync({ id: payment.id, allocations })} + /> + + )} + + ); +} diff --git a/client/src/features/ap/payments/PaymentFormPage.tsx b/client/src/features/ap/payments/PaymentFormPage.tsx new file mode 100644 index 0000000..f0a8bc7 --- /dev/null +++ b/client/src/features/ap/payments/PaymentFormPage.tsx @@ -0,0 +1,105 @@ +import { useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, MenuItem, Stack, TextField, Typography } from '@mui/material'; +import { useSuppliers } from '../../../hooks/useSuppliers'; +import { useGLAccounts } from '../../../hooks/useGLAccounts'; +import { useCreatePayment } from '../../../hooks/useAPPayments'; + +export function PaymentFormPage() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const preselectedSupplierId = searchParams.get('supplierId'); + + const { data: suppliers } = useSuppliers('MAIN'); + const createPayment = useCreatePayment(); + + const [supplierId, setSupplierId] = useState(preselectedSupplierId ? Number(preselectedSupplierId) : ''); + const [paymentDate, setPaymentDate] = useState(new Date().toISOString().slice(0, 10)); + const [amount, setAmount] = useState(''); + const [bankGLAccountId, setBankGLAccountId] = useState(''); + const [reference, setReference] = useState(''); + const [error, setError] = useState(null); + + const supplier = (suppliers ?? []).find((s) => s.id === supplierId); + const { data: assetAccounts } = useGLAccounts(supplier ? supplier.branchSegmentValueId : 'MAIN', 'ASSET'); + const bankAccounts = (assetAccounts ?? []).filter((account) => account.controlType === 'BANK'); + + const save = async (postAfter: boolean) => { + setError(null); + if (!supplierId || !bankGLAccountId || !Number(amount)) { + setError('Select a supplier, bank account, and enter an amount'); + return; + } + try { + const payment = await createPayment.mutateAsync({ + supplierId, + paymentDate, + amount: Number(amount), + bankGLAccountId, + reference: reference || undefined, + }); + navigate(postAfter ? `/ap/payments/${payment.id}?post=1` : `/ap/payments/${payment.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to save payment')); + } + }; + + return ( + + + Make Payment + + + + + setSupplierId(Number(e.target.value))}> + {(suppliers ?? []).map((s) => ( + + {s.code} — {s.name} + + ))} + + setPaymentDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + setAmount(e.target.value)} + slotProps={{ htmlInput: { min: 0, step: '0.01' } }} + /> + setBankGLAccountId(Number(e.target.value))}> + {bankAccounts.map((account) => ( + + {account.accountCode} — {account.accountName} + + ))} + + setReference(e.target.value)} /> + + + + {error && ( + + {error} + + )} + + + + + + + + ); +} diff --git a/client/src/features/ap/payments/PaymentsListPage.tsx b/client/src/features/ap/payments/PaymentsListPage.tsx new file mode 100644 index 0000000..8b27bdd --- /dev/null +++ b/client/src/features/ap/payments/PaymentsListPage.tsx @@ -0,0 +1,64 @@ +import { useNavigate } from 'react-router-dom'; +import { Box, Button, Card, Stack, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { usePayments } from '../../../hooks/useAPPayments'; +import { useBranchStore } from '../../../store/branchStore'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { APPayment } from '../../../types/api'; + +export function PaymentsListPage() { + const navigate = useNavigate(); + const selected = useBranchStore((state) => state.selected); + const { data: payments, isLoading } = usePayments(selected); + const { hasPermission } = useAuth(); + + const columns: GridColDef[] = [ + { field: 'paymentNumber', headerName: 'Payment #', width: 180 }, + { field: 'supplier', headerName: 'Supplier', flex: 1, valueGetter: (_v, row) => row.supplier?.name }, + { field: 'paymentDate', headerName: 'Date', width: 120, valueFormatter: (value: string) => value?.slice(0, 10) }, + { + field: 'amount', + headerName: 'Amount', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { + field: 'unallocatedAmount', + headerName: 'Unallocated', + width: 130, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { field: 'status', headerName: 'Status', width: 120, renderCell: (params) => }, + ]; + + return ( + + + Payments + {hasPermission('ap.payment.manage') && ( + + )} + + + navigate(`/ap/payments/${params.row.id}`)} + sx={{ border: 'none', '& .MuiDataGrid-row': { cursor: 'pointer' } }} + initialState={{ sorting: { sortModel: [{ field: 'paymentDate', sort: 'desc' }] } }} + /> + + + ); +} diff --git a/client/src/features/ap/shared/APAllocationPanel.tsx b/client/src/features/ap/shared/APAllocationPanel.tsx new file mode 100644 index 0000000..6a3d811 --- /dev/null +++ b/client/src/features/ap/shared/APAllocationPanel.tsx @@ -0,0 +1,126 @@ +import { useMemo, useState } from 'react'; +import { Alert, Box, Button, Stack, Table, TableBody, TableCell, TableHead, TableRow, TextField, Typography } from '@mui/material'; +import { useInvoices } from '../../../hooks/useAPInvoices'; +import { MoneyCell } from '../../../components/common/MoneyCell'; + +interface APAllocationPanelProps { + supplierId: number; + unallocatedAmount: number; + onAllocate: (allocations: { invoiceId: number; amount: number }[]) => Promise; + isSubmitting: boolean; +} + +export function APAllocationPanel({ supplierId, unallocatedAmount, onAllocate, isSubmitting }: APAllocationPanelProps) { + const { data: invoices } = useInvoices('MAIN', supplierId); + const openInvoices = (invoices ?? []).filter((invoice) => invoice.status === 'POSTED' && Number(invoice.balance) > 0); + + const [amounts, setAmounts] = useState>({}); + const [error, setError] = useState(null); + + const totalEntered = useMemo( + () => Object.values(amounts).reduce((sum, value) => sum + (Number(value) || 0), 0), + [amounts], + ); + const remaining = unallocatedAmount - totalEntered; + + if (unallocatedAmount <= 0) { + return ( + + Fully allocated. + + ); + } + + const applyFull = (invoiceId: number, balance: number) => { + const applied = Math.min(balance, unallocatedAmount - totalEntered + (Number(amounts[invoiceId]) || 0)); + setAmounts((prev) => ({ ...prev, [invoiceId]: applied > 0 ? applied.toFixed(2) : '' })); + }; + + const handleApply = async () => { + setError(null); + const allocations = Object.entries(amounts) + .map(([invoiceId, value]) => ({ invoiceId: Number(invoiceId), amount: Number(value) || 0 })) + .filter((allocation) => allocation.amount > 0); + if (allocations.length === 0) { + setError('Enter at least one allocation amount'); + return; + } + if (totalEntered > unallocatedAmount) { + setError('Total allocated exceeds the unallocated amount'); + return; + } + try { + await onAllocate(allocations); + setAmounts({}); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to allocate')); + } + }; + + if (openInvoices.length === 0) { + return ( + + This supplier has no open invoices to allocate against. + + ); + } + + return ( + + + + + Invoice # + Due + Balance + + Apply Amount + + + + + {openInvoices.map((invoice) => ( + + {invoice.invoiceNumber} + {invoice.dueDate.slice(0, 10)} + + + + + + setAmounts((prev) => ({ ...prev, [invoice.id]: e.target.value }))} + sx={{ width: 100 }} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + + + ))} + +
+ + + + Remaining unallocated: + + + + + {error && ( + + {error} + + )} +
+ ); +} diff --git a/client/src/features/ap/shared/APDocumentLineEditor.tsx b/client/src/features/ap/shared/APDocumentLineEditor.tsx new file mode 100644 index 0000000..675429f --- /dev/null +++ b/client/src/features/ap/shared/APDocumentLineEditor.tsx @@ -0,0 +1,142 @@ +import { IconButton, MenuItem, Table, TableBody, TableCell, TableHead, TableRow, TextField } from '@mui/material'; +import DeleteIcon from '@mui/icons-material/Delete'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { GLAccount, TaxCode } from '../../../types/api'; + +export interface APDocumentLineDraft { + key: number; + description: string; + quantity: string; + unitPrice: string; + expenseGLAccountId: number | ''; + taxCodeId: number | ''; +} + +let keySeed = 0; +export const blankAPDocumentLine = (): APDocumentLineDraft => ({ + key: keySeed++, + description: '', + quantity: '1', + unitPrice: '', + expenseGLAccountId: '', + taxCodeId: '', +}); + +export function apLineTotals(line: APDocumentLineDraft, taxCodes: TaxCode[]) { + const quantity = Number(line.quantity) || 0; + const unitPrice = Number(line.unitPrice) || 0; + const subtotal = quantity * unitPrice; + const rate = line.taxCodeId ? Number(taxCodes.find((t) => t.id === line.taxCodeId)?.ratePercent ?? 0) : 0; + const tax = subtotal * (rate / 100); + return { subtotal, tax, total: subtotal + tax }; +} + +interface APDocumentLineEditorProps { + lines: APDocumentLineDraft[]; + onChange: (lines: APDocumentLineDraft[]) => void; + expenseAccounts: GLAccount[]; + taxCodes: TaxCode[]; +} + +export function APDocumentLineEditor({ lines, onChange, expenseAccounts, taxCodes }: APDocumentLineEditorProps) { + const updateLine = (key: number, patch: Partial) => + onChange(lines.map((line) => (line.key === key ? { ...line, ...patch } : line))); + + const removeLine = (key: number) => onChange(lines.length > 1 ? lines.filter((line) => line.key !== key) : lines); + + return ( + + + + Description + + Qty + + + Unit Price + + Expense Account + Tax + + Amount + + + + + + {lines.map((line) => { + const { total } = apLineTotals(line, taxCodes); + return ( + + + updateLine(line.key, { description: e.target.value })} + /> + + + updateLine(line.key, { quantity: e.target.value })} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + updateLine(line.key, { unitPrice: e.target.value })} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + updateLine(line.key, { expenseGLAccountId: Number(e.target.value) })} + > + {expenseAccounts.map((account) => ( + + {account.accountCode} — {account.accountName} + + ))} + + + + updateLine(line.key, { taxCodeId: e.target.value ? Number(e.target.value) : '' })} + > + None + {taxCodes.map((taxCode) => ( + + {taxCode.code} ({Number(taxCode.ratePercent)}%) + + ))} + + + + + + + removeLine(line.key)} disabled={lines.length <= 1}> + + + + + ); + })} + +
+ ); +} diff --git a/client/src/features/ap/suppliers/SupplierDetailPage.tsx b/client/src/features/ap/suppliers/SupplierDetailPage.tsx new file mode 100644 index 0000000..735602b --- /dev/null +++ b/client/src/features/ap/suppliers/SupplierDetailPage.tsx @@ -0,0 +1,218 @@ +import { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, Button, Card, CircularProgress, Stack, Tab, Tabs, Table, TableBody, TableCell, TableHead, TableRow, Typography } from '@mui/material'; +import { useSupplier } from '../../../hooks/useSuppliers'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { APDebitNote, APInvoice, APPayment } from '../../../types/api'; + +function InvoicesTable({ invoices, onRowClick }: { invoices: APInvoice[]; onRowClick: (id: number) => void }) { + if (invoices.length === 0) return No invoices yet.; + return ( + + + + Invoice # + Supplier Ref + Date + Due + Total + Balance + Status + + + + {invoices.map((invoice) => ( + onRowClick(invoice.id)} sx={{ cursor: 'pointer' }}> + {invoice.invoiceNumber} + {invoice.supplierReference || '—'} + {invoice.invoiceDate.slice(0, 10)} + {invoice.dueDate.slice(0, 10)} + + + + + + + + + + + ))} + +
+ ); +} + +function PaymentsTable({ payments }: { payments: APPayment[] }) { + if (payments.length === 0) return No payments yet.; + return ( + + + + Payment # + Date + Amount + Unallocated + Status + + + + {payments.map((payment) => ( + + {payment.paymentNumber} + {payment.paymentDate.slice(0, 10)} + + + + + + + + + + + ))} + +
+ ); +} + +function DebitNotesTable({ debitNotes }: { debitNotes: APDebitNote[] }) { + if (debitNotes.length === 0) return No debit notes yet.; + return ( + + + + Debit Note # + Date + Total + Unallocated + Status + + + + {debitNotes.map((debitNote) => ( + + {debitNote.debitNoteNumber} + {debitNote.debitNoteDate.slice(0, 10)} + + + + + + + + + + + ))} + +
+ ); +} + +export function SupplierDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const { data, isLoading } = useSupplier(id ? Number(id) : undefined); + const { hasPermission } = useAuth(); + const [tab, setTab] = useState(0); + + if (isLoading || !data) return ; + + const { supplier, invoices, debitNotes, payments, outstandingBalance, overdueBalance } = data; + + return ( + + + + {supplier.name} + + + + {hasPermission('ap.payment.manage') && ( + + )} + {hasPermission('ap.invoice.manage') && ( + + )} + + + + + + + Outstanding Balance + + + + + + + + Overdue (30+ days) + + 0 ? 'error.main' : 'text.primary'}> + + + + + + Payment Terms + + {supplier.paymentTermsDays} days + + + + + + Contact Details + + + + + Code + + {supplier.code} + + + + Email + + {supplier.email || '—'} + + + + Phone + + {supplier.phone || '—'} + + + + Tax Number + + {supplier.taxNumber || '—'} + + + + + setTab(value)} sx={{ mb: 2 }}> + + + + + + + {tab === 0 && navigate(`/ap/invoices/${invoiceId}`)} />} + {tab === 1 && } + {tab === 2 && } + + + ); +} diff --git a/client/src/features/ap/suppliers/SupplierDialog.tsx b/client/src/features/ap/suppliers/SupplierDialog.tsx new file mode 100644 index 0000000..f6772ca --- /dev/null +++ b/client/src/features/ap/suppliers/SupplierDialog.tsx @@ -0,0 +1,88 @@ +import { useState } from 'react'; +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, MenuItem, Stack, TextField } from '@mui/material'; +import { useCreateSupplier } from '../../../hooks/useSuppliers'; +import { useSegmentDefinitions } from '../../../hooks/useSegments'; + +export function SupplierDialog({ open, onClose }: { open: boolean; onClose: () => void }) { + const createSupplier = useCreateSupplier(); + const { data: definitions } = useSegmentDefinitions(); + const branchDef = (definitions ?? []).find((def) => def.isBranchSegment); + + const [code, setCode] = useState(''); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [phone, setPhone] = useState(''); + const [branchSegmentValueId, setBranchSegmentValueId] = useState(''); + const [paymentTermsDays, setPaymentTermsDays] = useState('30'); + const [error, setError] = useState(null); + + const reset = () => { + setCode(''); + setName(''); + setEmail(''); + setPhone(''); + setBranchSegmentValueId(''); + setPaymentTermsDays('30'); + }; + + const handleSubmit = async () => { + setError(null); + if (!branchSegmentValueId) { + setError('Select a branch'); + return; + } + try { + await createSupplier.mutateAsync({ + code, + name, + email: email || undefined, + phone: phone || undefined, + branchSegmentValueId, + paymentTermsDays: paymentTermsDays ? Number(paymentTermsDays) : undefined, + }); + onClose(); + reset(); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to create supplier'); + } + }; + + return ( + + New Supplier + + + setCode(e.target.value)} /> + setName(e.target.value)} /> + setEmail(e.target.value)} /> + setPhone(e.target.value)} /> + setBranchSegmentValueId(Number(e.target.value))} + > + {(branchDef?.values ?? []).map((value) => ( + + {value.code} — {value.description} + + ))} + + setPaymentTermsDays(e.target.value)} + /> + {error && {error}} + + + + + + + + ); +} diff --git a/client/src/features/ap/suppliers/SuppliersListPage.tsx b/client/src/features/ap/suppliers/SuppliersListPage.tsx new file mode 100644 index 0000000..0a26317 --- /dev/null +++ b/client/src/features/ap/suppliers/SuppliersListPage.tsx @@ -0,0 +1,57 @@ +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Box, Button, Card, Stack, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useSuppliers } from '../../../hooks/useSuppliers'; +import { useBranchStore } from '../../../store/branchStore'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import type { Supplier } from '../../../types/api'; +import { SupplierDialog } from './SupplierDialog'; + +export function SuppliersListPage() { + const navigate = useNavigate(); + const selected = useBranchStore((state) => state.selected); + const { data: suppliers, isLoading } = useSuppliers(selected); + const { hasPermission } = useAuth(); + const [dialogOpen, setDialogOpen] = useState(false); + + const columns: GridColDef[] = [ + { field: 'code', headerName: 'Code', width: 140 }, + { field: 'name', headerName: 'Name', flex: 1 }, + { field: 'email', headerName: 'Email', flex: 1 }, + { field: 'phone', headerName: 'Phone', width: 160 }, + { field: 'paymentTermsDays', headerName: 'Terms (days)', width: 130 }, + { + field: 'isActive', + headerName: 'Status', + width: 100, + renderCell: (params) => , + }, + ]; + + return ( + + + Suppliers + {hasPermission('ap.supplier.manage') && ( + + )} + + + navigate(`/ap/suppliers/${params.row.id}`)} + sx={{ border: 'none', '& .MuiDataGrid-row': { cursor: 'pointer' } }} + /> + + setDialogOpen(false)} /> + + ); +} diff --git a/client/src/features/ar/creditNotes/CreditNoteDetailPage.tsx b/client/src/features/ar/creditNotes/CreditNoteDetailPage.tsx new file mode 100644 index 0000000..7bf4869 --- /dev/null +++ b/client/src/features/ar/creditNotes/CreditNoteDetailPage.tsx @@ -0,0 +1,186 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { + Alert, + Box, + Button, + Card, + CircularProgress, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from '@mui/material'; +import { useAllocateCreditNote, useCreditNote, usePostCreditNote, useVoidCreditNote } from '../../../hooks/useARCreditNotes'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { AllocationPanel } from '../shared/AllocationPanel'; + +export function CreditNoteDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const creditNoteId = id ? Number(id) : undefined; + const { data: creditNote, isLoading } = useCreditNote(creditNoteId); + const postCreditNote = usePostCreditNote(); + const voidCreditNote = useVoidCreditNote(); + const allocateCreditNote = useAllocateCreditNote(); + const { hasPermission } = useAuth(); + const [error, setError] = useState(null); + const autoPosted = useRef(false); + + useEffect(() => { + if (searchParams.get('post') === '1' && creditNote?.status === 'DRAFT' && !autoPosted.current) { + autoPosted.current = true; + postCreditNote.mutateAsync(creditNote.id).catch((err) => { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post credit note'); + }); + setSearchParams({}, { replace: true }); + } + }, [creditNote, postCreditNote, searchParams, setSearchParams]); + + if (isLoading || !creditNote) return ; + + const handlePost = async () => { + setError(null); + try { + await postCreditNote.mutateAsync(creditNote.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post credit note'); + } + }; + + const handleVoid = async () => { + setError(null); + try { + await voidCreditNote.mutateAsync(creditNote.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to void credit note'); + } + }; + + return ( + + + + {creditNote.creditNoteNumber} + + + {creditNote.status === 'DRAFT' && hasPermission('ar.creditnote.manage') && ( + + + + + )} + + + {error && ( + + {error} + + )} + + + + + + Customer + + navigate(`/ar/customers/${creditNote.customerId}`)} + > + {creditNote.customer?.name} + + + + + Date + + {creditNote.creditNoteDate.slice(0, 10)} + + + + Reason + + {creditNote.reason || '—'} + + + + Unallocated Balance + + + + + + + + + + + + + Description + Qty + Unit Price + Revenue Account + Tax + Amount + + + + {creditNote.lines.map((line) => ( + + {line.description} + {line.quantity} + + + + {line.revenueGLAccount?.accountName} + {line.taxCode?.code ?? '—'} + + + + + ))} + + + Total + + + + + + + + +
+
+ + {creditNote.status === 'POSTED' && ( + + + Allocate Against Invoices + + allocateCreditNote.mutateAsync({ id: creditNote.id, allocations })} + /> + + )} +
+ ); +} diff --git a/client/src/features/ar/creditNotes/CreditNoteFormPage.tsx b/client/src/features/ar/creditNotes/CreditNoteFormPage.tsx new file mode 100644 index 0000000..7e9cf03 --- /dev/null +++ b/client/src/features/ar/creditNotes/CreditNoteFormPage.tsx @@ -0,0 +1,153 @@ +import { useMemo, useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, MenuItem, Stack, TextField, Typography } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import { useCustomers } from '../../../hooks/useCustomers'; +import { useGLAccounts } from '../../../hooks/useGLAccounts'; +import { useTaxCodes } from '../../../hooks/useTaxCodes'; +import { useCreateCreditNote } from '../../../hooks/useARCreditNotes'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { DocumentLineEditor, blankDocumentLine, lineTotals, type DocumentLineDraft } from '../shared/DocumentLineEditor'; + +export function CreditNoteFormPage() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const preselectedCustomerId = searchParams.get('customerId'); + + const { data: customers } = useCustomers('MAIN'); + const { data: taxCodes } = useTaxCodes(); + const createCreditNote = useCreateCreditNote(); + + const [customerId, setCustomerId] = useState(preselectedCustomerId ? Number(preselectedCustomerId) : ''); + const [creditNoteDate, setCreditNoteDate] = useState(new Date().toISOString().slice(0, 10)); + const [reference, setReference] = useState(''); + const [reason, setReason] = useState(''); + const [lines, setLines] = useState([blankDocumentLine()]); + const [error, setError] = useState(null); + + const customer = (customers ?? []).find((c) => c.id === customerId); + const { data: revenueAccounts } = useGLAccounts(customer ? customer.branchSegmentValueId : 'MAIN', 'INCOME'); + + const totals = useMemo(() => { + const computed = lines.map((line) => lineTotals(line, taxCodes ?? [])); + return { + subtotal: computed.reduce((sum, l) => sum + l.subtotal, 0), + tax: computed.reduce((sum, l) => sum + l.tax, 0), + total: computed.reduce((sum, l) => sum + l.total, 0), + }; + }, [lines, taxCodes]); + + const save = async (postAfter: boolean) => { + setError(null); + if (!customerId) { + setError('Select a customer'); + return; + } + if (lines.some((line) => !line.revenueGLAccountId || !line.description || !Number(line.unitPrice))) { + setError('Every line needs a description, unit price, and revenue account'); + return; + } + try { + const creditNote = await createCreditNote.mutateAsync({ + customerId, + creditNoteDate, + reference: reference || undefined, + reason: reason || undefined, + lines: lines.map((line) => ({ + description: line.description, + quantity: Number(line.quantity) || 1, + unitPrice: Number(line.unitPrice) || 0, + revenueGLAccountId: line.revenueGLAccountId as number, + taxCodeId: line.taxCodeId ? (line.taxCodeId as number) : undefined, + })), + }); + navigate(postAfter ? `/ar/credit-notes/${creditNote.id}?post=1` : `/ar/credit-notes/${creditNote.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to save credit note')); + } + }; + + return ( + + + New Credit Note + + + + + setCustomerId(Number(e.target.value))} + sx={{ minWidth: 260 }} + > + {(customers ?? []).map((c) => ( + + {c.code} — {c.name} + + ))} + + setCreditNoteDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + setReference(e.target.value)} sx={{ minWidth: 180 }} /> + setReason(e.target.value)} sx={{ minWidth: 220 }} /> + + + + + + + + + + + Subtotal + + + + + + + + Tax + + + + + + + Total + + + + + + + + {error && ( + + {error} + + )} + + + + + + + + ); +} diff --git a/client/src/features/ar/customers/CustomerDetailPage.tsx b/client/src/features/ar/customers/CustomerDetailPage.tsx new file mode 100644 index 0000000..5860952 --- /dev/null +++ b/client/src/features/ar/customers/CustomerDetailPage.tsx @@ -0,0 +1,224 @@ +import { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Box, Button, Card, CircularProgress, Stack, Tab, Tabs, Table, TableBody, TableCell, TableHead, TableRow, Typography } from '@mui/material'; +import { useCustomer } from '../../../hooks/useCustomers'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { ARCreditNote, ARInvoice, ARReceipt } from '../../../types/api'; + +function InvoicesTable({ invoices, onRowClick }: { invoices: ARInvoice[]; onRowClick: (id: number) => void }) { + if (invoices.length === 0) return No invoices yet.; + return ( + + + + Invoice # + Date + Due + Total + Balance + Status + + + + {invoices.map((invoice) => ( + onRowClick(invoice.id)} sx={{ cursor: 'pointer' }}> + {invoice.invoiceNumber} + {invoice.invoiceDate.slice(0, 10)} + {invoice.dueDate.slice(0, 10)} + + + + + + + + + + + ))} + +
+ ); +} + +function ReceiptsTable({ receipts }: { receipts: ARReceipt[] }) { + if (receipts.length === 0) return No receipts yet.; + return ( + + + + Receipt # + Date + Amount + Unallocated + Status + + + + {receipts.map((receipt) => ( + + {receipt.receiptNumber} + {receipt.receiptDate.slice(0, 10)} + + + + + + + + + + + ))} + +
+ ); +} + +function CreditNotesTable({ creditNotes }: { creditNotes: ARCreditNote[] }) { + if (creditNotes.length === 0) return No credit notes yet.; + return ( + + + + Credit Note # + Date + Total + Unallocated + Status + + + + {creditNotes.map((creditNote) => ( + + {creditNote.creditNoteNumber} + {creditNote.creditNoteDate.slice(0, 10)} + + + + + + + + + + + ))} + +
+ ); +} + +export function CustomerDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const { data, isLoading } = useCustomer(id ? Number(id) : undefined); + const { hasPermission } = useAuth(); + const [tab, setTab] = useState(0); + + if (isLoading || !data) return ; + + const { customer, invoices, creditNotes, receipts, outstandingBalance, overdueBalance } = data; + + return ( + + + + {customer.name} + + + + {hasPermission('ar.receipt.manage') && ( + + )} + {hasPermission('ar.invoice.manage') && ( + + )} + + + + + + + Outstanding Balance + + + + + + + + Overdue (30+ days) + + 0 ? 'error.main' : 'text.primary'}> + + + + + + Credit Limit + + + + + + + + Payment Terms + + {customer.paymentTermsDays} days + + + + + + Contact Details + + + + + Code + + {customer.code} + + + + Email + + {customer.email || '—'} + + + + Phone + + {customer.phone || '—'} + + + + Tax Number + + {customer.taxNumber || '—'} + + + + + setTab(value)} sx={{ mb: 2 }}> + + + + + + + {tab === 0 && navigate(`/ar/invoices/${invoiceId}`)} />} + {tab === 1 && } + {tab === 2 && } + + + ); +} diff --git a/client/src/features/ar/customers/CustomerDialog.tsx b/client/src/features/ar/customers/CustomerDialog.tsx new file mode 100644 index 0000000..3e7f801 --- /dev/null +++ b/client/src/features/ar/customers/CustomerDialog.tsx @@ -0,0 +1,101 @@ +import { useState } from 'react'; +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, MenuItem, Stack, TextField } from '@mui/material'; +import { useCreateCustomer } from '../../../hooks/useCustomers'; +import { useSegmentDefinitions } from '../../../hooks/useSegments'; + +export function CustomerDialog({ open, onClose }: { open: boolean; onClose: () => void }) { + const createCustomer = useCreateCustomer(); + const { data: definitions } = useSegmentDefinitions(); + const branchDef = (definitions ?? []).find((def) => def.isBranchSegment); + + const [code, setCode] = useState(''); + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [phone, setPhone] = useState(''); + const [branchSegmentValueId, setBranchSegmentValueId] = useState(''); + const [creditLimit, setCreditLimit] = useState(''); + const [paymentTermsDays, setPaymentTermsDays] = useState('30'); + const [error, setError] = useState(null); + + const reset = () => { + setCode(''); + setName(''); + setEmail(''); + setPhone(''); + setBranchSegmentValueId(''); + setCreditLimit(''); + setPaymentTermsDays('30'); + }; + + const handleSubmit = async () => { + setError(null); + if (!branchSegmentValueId) { + setError('Select a branch'); + return; + } + try { + await createCustomer.mutateAsync({ + code, + name, + email: email || undefined, + phone: phone || undefined, + branchSegmentValueId, + creditLimit: creditLimit ? Number(creditLimit) : undefined, + paymentTermsDays: paymentTermsDays ? Number(paymentTermsDays) : undefined, + }); + onClose(); + reset(); + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to create customer'); + } + }; + + return ( + + New Customer + + + setCode(e.target.value)} /> + setName(e.target.value)} /> + setEmail(e.target.value)} /> + setPhone(e.target.value)} /> + setBranchSegmentValueId(Number(e.target.value))} + > + {(branchDef?.values ?? []).map((value) => ( + + {value.code} — {value.description} + + ))} + + + setCreditLimit(e.target.value)} + fullWidth + /> + setPaymentTermsDays(e.target.value)} + fullWidth + /> + + {error && {error}} + + + + + + + + ); +} diff --git a/client/src/features/ar/customers/CustomersListPage.tsx b/client/src/features/ar/customers/CustomersListPage.tsx new file mode 100644 index 0000000..c3d3c63 --- /dev/null +++ b/client/src/features/ar/customers/CustomersListPage.tsx @@ -0,0 +1,66 @@ +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Box, Button, Card, Stack, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useCustomers } from '../../../hooks/useCustomers'; +import { useBranchStore } from '../../../store/branchStore'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { Customer } from '../../../types/api'; +import { CustomerDialog } from './CustomerDialog'; + +export function CustomersListPage() { + const navigate = useNavigate(); + const selected = useBranchStore((state) => state.selected); + const { data: customers, isLoading } = useCustomers(selected); + const { hasPermission } = useAuth(); + const [dialogOpen, setDialogOpen] = useState(false); + + const columns: GridColDef[] = [ + { field: 'code', headerName: 'Code', width: 140 }, + { field: 'name', headerName: 'Name', flex: 1 }, + { field: 'email', headerName: 'Email', flex: 1 }, + { field: 'phone', headerName: 'Phone', width: 160 }, + { + field: 'creditLimit', + headerName: 'Credit Limit', + width: 140, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { field: 'paymentTermsDays', headerName: 'Terms (days)', width: 130 }, + { + field: 'isActive', + headerName: 'Status', + width: 100, + renderCell: (params) => , + }, + ]; + + return ( + + + Customers + {hasPermission('ar.customer.manage') && ( + + )} + + + navigate(`/ar/customers/${params.row.id}`)} + sx={{ border: 'none', '& .MuiDataGrid-row': { cursor: 'pointer' } }} + /> + + setDialogOpen(false)} /> + + ); +} diff --git a/client/src/features/ar/invoices/InvoiceDetailPage.tsx b/client/src/features/ar/invoices/InvoiceDetailPage.tsx new file mode 100644 index 0000000..fe041c4 --- /dev/null +++ b/client/src/features/ar/invoices/InvoiceDetailPage.tsx @@ -0,0 +1,224 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { + Alert, + Box, + Button, + Card, + CircularProgress, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from '@mui/material'; +import { useInvoice, usePostInvoice, useVoidInvoice } from '../../../hooks/useARInvoices'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; + +export function InvoiceDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const invoiceId = id ? Number(id) : undefined; + const { data: invoice, isLoading } = useInvoice(invoiceId); + const postInvoice = usePostInvoice(); + const voidInvoice = useVoidInvoice(); + const { hasPermission } = useAuth(); + const [error, setError] = useState(null); + const autoPosted = useRef(false); + + useEffect(() => { + if (searchParams.get('post') === '1' && invoice?.status === 'DRAFT' && !autoPosted.current) { + autoPosted.current = true; + postInvoice.mutateAsync(invoice.id).catch((err) => { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post invoice'); + }); + setSearchParams({}, { replace: true }); + } + }, [invoice, postInvoice, searchParams, setSearchParams]); + + if (isLoading || !invoice) return ; + + const handlePost = async () => { + setError(null); + try { + await postInvoice.mutateAsync(invoice.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post invoice'); + } + }; + + const handleVoid = async () => { + setError(null); + try { + await voidInvoice.mutateAsync(invoice.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to void invoice'); + } + }; + + return ( + + + + {invoice.invoiceNumber} + + + + {invoice.status === 'DRAFT' && hasPermission('ar.invoice.manage') && ( + <> + + + + )} + + + + {error && ( + + {error} + + )} + + + + + + Customer + + navigate(`/ar/customers/${invoice.customerId}`)} + > + {invoice.customer?.name} + + + + + Invoice Date + + {invoice.invoiceDate.slice(0, 10)} + + + + Due Date + + {invoice.dueDate.slice(0, 10)} + + + + Reference + + {invoice.reference || '—'} + + + + Balance + + + + + + + + + + + + + Description + Qty + Unit Price + Revenue Account + Tax + Amount + + + + {invoice.lines.map((line) => ( + + {line.description} + {line.quantity} + + + + {line.revenueGLAccount?.accountName} + {line.taxCode?.code ?? '—'} + + + + + ))} + + + Subtotal + + + + + + + + Tax + + + + + + + + Total + + + + + + + + +
+
+ + {invoice.allocations && invoice.allocations.length > 0 && ( + + + Allocations + + + + + Source + Date + Amount + + + + {invoice.allocations.map((allocation) => ( + + + {allocation.receipt?.receiptNumber ?? allocation.creditNote?.creditNoteNumber} + + {allocation.allocatedAt.slice(0, 10)} + + + + + ))} + +
+
+ )} +
+ ); +} diff --git a/client/src/features/ar/invoices/InvoiceFormPage.tsx b/client/src/features/ar/invoices/InvoiceFormPage.tsx new file mode 100644 index 0000000..2f16f91 --- /dev/null +++ b/client/src/features/ar/invoices/InvoiceFormPage.tsx @@ -0,0 +1,178 @@ +import { useMemo, useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, MenuItem, Stack, TextField, Typography } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import { useCustomers } from '../../../hooks/useCustomers'; +import { useGLAccounts } from '../../../hooks/useGLAccounts'; +import { useTaxCodes } from '../../../hooks/useTaxCodes'; +import { useCreateInvoice } from '../../../hooks/useARInvoices'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { DocumentLineEditor, blankDocumentLine, lineTotals, type DocumentLineDraft } from '../shared/DocumentLineEditor'; + +function addDays(dateStr: string, days: number): string { + const date = new Date(dateStr); + date.setDate(date.getDate() + days); + return date.toISOString().slice(0, 10); +} + +export function InvoiceFormPage() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const preselectedCustomerId = searchParams.get('customerId'); + + const { data: customers } = useCustomers('MAIN'); + const { data: taxCodes } = useTaxCodes(); + const createInvoice = useCreateInvoice(); + + const [customerId, setCustomerId] = useState(preselectedCustomerId ? Number(preselectedCustomerId) : ''); + const [invoiceDate, setInvoiceDate] = useState(new Date().toISOString().slice(0, 10)); + const [reference, setReference] = useState(''); + const [lines, setLines] = useState([blankDocumentLine()]); + const [error, setError] = useState(null); + + const customer = (customers ?? []).find((c) => c.id === customerId); + const { data: revenueAccounts } = useGLAccounts(customer ? customer.branchSegmentValueId : 'MAIN', 'INCOME'); + const dueDate = customer ? addDays(invoiceDate, customer.paymentTermsDays) : invoiceDate; + + const totals = useMemo(() => { + const computed = lines.map((line) => lineTotals(line, taxCodes ?? [])); + return { + subtotal: computed.reduce((sum, l) => sum + l.subtotal, 0), + tax: computed.reduce((sum, l) => sum + l.tax, 0), + total: computed.reduce((sum, l) => sum + l.total, 0), + }; + }, [lines, taxCodes]); + + const save = async (postAfter: boolean) => { + setError(null); + if (!customerId) { + setError('Select a customer'); + return; + } + if (lines.some((line) => !line.revenueGLAccountId || !line.description || !Number(line.unitPrice))) { + setError('Every line needs a description, unit price, and revenue account'); + return; + } + try { + const invoice = await createInvoice.mutateAsync({ + customerId, + invoiceDate, + dueDate, + reference: reference || undefined, + lines: lines.map((line) => ({ + description: line.description, + quantity: Number(line.quantity) || 1, + unitPrice: Number(line.unitPrice) || 0, + revenueGLAccountId: line.revenueGLAccountId as number, + taxCodeId: line.taxCodeId ? (line.taxCodeId as number) : undefined, + })), + }); + navigate(postAfter ? `/ar/invoices/${invoice.id}?post=1` : `/ar/invoices/${invoice.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to save invoice')); + } + }; + + return ( + + + New Invoice + + + + + setCustomerId(Number(e.target.value))} + sx={{ minWidth: 260 }} + > + {(customers ?? []).map((c) => ( + + {c.code} — {c.name} + + ))} + + setInvoiceDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + + setReference(e.target.value)} sx={{ minWidth: 200 }} /> + + + + + + + + + + + Subtotal + + + + + + + + Tax + + + + + + + Total + + + + + + + + + + + Notes + + + + + + Attachments + + + + + + {error && ( + + {error} + + )} + + + + + + + + ); +} diff --git a/client/src/features/ar/invoices/InvoicesListPage.tsx b/client/src/features/ar/invoices/InvoicesListPage.tsx new file mode 100644 index 0000000..f7dac9d --- /dev/null +++ b/client/src/features/ar/invoices/InvoicesListPage.tsx @@ -0,0 +1,65 @@ +import { useNavigate } from 'react-router-dom'; +import { Box, Button, Card, Stack, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useInvoices } from '../../../hooks/useARInvoices'; +import { useBranchStore } from '../../../store/branchStore'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { ARInvoice } from '../../../types/api'; + +export function InvoicesListPage() { + const navigate = useNavigate(); + const selected = useBranchStore((state) => state.selected); + const { data: invoices, isLoading } = useInvoices(selected); + const { hasPermission } = useAuth(); + + const columns: GridColDef[] = [ + { field: 'invoiceNumber', headerName: 'Invoice #', width: 180 }, + { field: 'customer', headerName: 'Customer', flex: 1, valueGetter: (_v, row) => row.customer?.name }, + { field: 'invoiceDate', headerName: 'Date', width: 120, valueFormatter: (value: string) => value?.slice(0, 10) }, + { field: 'dueDate', headerName: 'Due', width: 120, valueFormatter: (value: string) => value?.slice(0, 10) }, + { + field: 'total', + headerName: 'Total', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { + field: 'balance', + headerName: 'Balance', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { field: 'status', headerName: 'Status', width: 120, renderCell: (params) => }, + ]; + + return ( + + + Invoices + {hasPermission('ar.invoice.manage') && ( + + )} + + + navigate(`/ar/invoices/${params.row.id}`)} + sx={{ border: 'none', '& .MuiDataGrid-row': { cursor: 'pointer' } }} + initialState={{ sorting: { sortModel: [{ field: 'invoiceDate', sort: 'desc' }] } }} + /> + + + ); +} diff --git a/client/src/features/ar/receipts/ReceiptDetailPage.tsx b/client/src/features/ar/receipts/ReceiptDetailPage.tsx new file mode 100644 index 0000000..c162202 --- /dev/null +++ b/client/src/features/ar/receipts/ReceiptDetailPage.tsx @@ -0,0 +1,140 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, CircularProgress, Stack, Typography } from '@mui/material'; +import { useAllocateReceipt, usePostReceipt, useReceipt, useVoidReceipt } from '../../../hooks/useARReceipts'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import { AllocationPanel } from '../shared/AllocationPanel'; + +export function ReceiptDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const receiptId = id ? Number(id) : undefined; + const { data: receipt, isLoading } = useReceipt(receiptId); + const postReceipt = usePostReceipt(); + const voidReceipt = useVoidReceipt(); + const allocateReceipt = useAllocateReceipt(); + const { hasPermission } = useAuth(); + const [error, setError] = useState(null); + const autoPosted = useRef(false); + + useEffect(() => { + if (searchParams.get('post') === '1' && receipt?.status === 'DRAFT' && !autoPosted.current) { + autoPosted.current = true; + postReceipt.mutateAsync(receipt.id).catch((err) => { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post receipt'); + }); + setSearchParams({}, { replace: true }); + } + }, [receipt, postReceipt, searchParams, setSearchParams]); + + if (isLoading || !receipt) return ; + + const handlePost = async () => { + setError(null); + try { + await postReceipt.mutateAsync(receipt.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to post receipt'); + } + }; + + const handleVoid = async () => { + setError(null); + try { + await voidReceipt.mutateAsync(receipt.id); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to void receipt'); + } + }; + + return ( + + + + {receipt.receiptNumber} + + + {receipt.status === 'DRAFT' && hasPermission('ar.receipt.manage') && ( + + + + + )} + + + {error && ( + + {error} + + )} + + + + + + Customer + + navigate(`/ar/customers/${receipt.customerId}`)} + > + {receipt.customer?.name} + + + + + Date + + {receipt.receiptDate.slice(0, 10)} + + + + Deposited To + + {receipt.bankGLAccount?.accountName} + + + + Amount + + + + + + + + Unallocated + + + + + + + + + {receipt.status === 'POSTED' && ( + + + Allocate Against Invoices + + allocateReceipt.mutateAsync({ id: receipt.id, allocations })} + /> + + )} + + ); +} diff --git a/client/src/features/ar/receipts/ReceiptFormPage.tsx b/client/src/features/ar/receipts/ReceiptFormPage.tsx new file mode 100644 index 0000000..c48aa3b --- /dev/null +++ b/client/src/features/ar/receipts/ReceiptFormPage.tsx @@ -0,0 +1,105 @@ +import { useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, Button, Card, MenuItem, Stack, TextField, Typography } from '@mui/material'; +import { useCustomers } from '../../../hooks/useCustomers'; +import { useGLAccounts } from '../../../hooks/useGLAccounts'; +import { useCreateReceipt } from '../../../hooks/useARReceipts'; + +export function ReceiptFormPage() { + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const preselectedCustomerId = searchParams.get('customerId'); + + const { data: customers } = useCustomers('MAIN'); + const createReceipt = useCreateReceipt(); + + const [customerId, setCustomerId] = useState(preselectedCustomerId ? Number(preselectedCustomerId) : ''); + const [receiptDate, setReceiptDate] = useState(new Date().toISOString().slice(0, 10)); + const [amount, setAmount] = useState(''); + const [bankGLAccountId, setBankGLAccountId] = useState(''); + const [reference, setReference] = useState(''); + const [error, setError] = useState(null); + + const customer = (customers ?? []).find((c) => c.id === customerId); + const { data: assetAccounts } = useGLAccounts(customer ? customer.branchSegmentValueId : 'MAIN', 'ASSET'); + const bankAccounts = (assetAccounts ?? []).filter((account) => account.controlType === 'BANK'); + + const save = async (postAfter: boolean) => { + setError(null); + if (!customerId || !bankGLAccountId || !Number(amount)) { + setError('Select a customer, bank account, and enter an amount'); + return; + } + try { + const receipt = await createReceipt.mutateAsync({ + customerId, + receiptDate, + amount: Number(amount), + bankGLAccountId, + reference: reference || undefined, + }); + navigate(postAfter ? `/ar/receipts/${receipt.id}?post=1` : `/ar/receipts/${receipt.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to save receipt')); + } + }; + + return ( + + + Receive Payment + + + + + setCustomerId(Number(e.target.value))}> + {(customers ?? []).map((c) => ( + + {c.code} — {c.name} + + ))} + + setReceiptDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + setAmount(e.target.value)} + slotProps={{ htmlInput: { min: 0, step: '0.01' } }} + /> + setBankGLAccountId(Number(e.target.value))}> + {bankAccounts.map((account) => ( + + {account.accountCode} — {account.accountName} + + ))} + + setReference(e.target.value)} /> + + + + {error && ( + + {error} + + )} + + + + + + + + ); +} diff --git a/client/src/features/ar/receipts/ReceiptsListPage.tsx b/client/src/features/ar/receipts/ReceiptsListPage.tsx new file mode 100644 index 0000000..32aa6ab --- /dev/null +++ b/client/src/features/ar/receipts/ReceiptsListPage.tsx @@ -0,0 +1,64 @@ +import { useNavigate } from 'react-router-dom'; +import { Box, Button, Card, Stack, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useReceipts } from '../../../hooks/useARReceipts'; +import { useBranchStore } from '../../../store/branchStore'; +import { useAuth } from '../../../hooks/useAuth'; +import { StatusChip } from '../../../components/common/StatusChip'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { ARReceipt } from '../../../types/api'; + +export function ReceiptsListPage() { + const navigate = useNavigate(); + const selected = useBranchStore((state) => state.selected); + const { data: receipts, isLoading } = useReceipts(selected); + const { hasPermission } = useAuth(); + + const columns: GridColDef[] = [ + { field: 'receiptNumber', headerName: 'Receipt #', width: 180 }, + { field: 'customer', headerName: 'Customer', flex: 1, valueGetter: (_v, row) => row.customer?.name }, + { field: 'receiptDate', headerName: 'Date', width: 120, valueFormatter: (value: string) => value?.slice(0, 10) }, + { + field: 'amount', + headerName: 'Amount', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { + field: 'unallocatedAmount', + headerName: 'Unallocated', + width: 130, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { field: 'status', headerName: 'Status', width: 120, renderCell: (params) => }, + ]; + + return ( + + + Receipts + {hasPermission('ar.receipt.manage') && ( + + )} + + + navigate(`/ar/receipts/${params.row.id}`)} + sx={{ border: 'none', '& .MuiDataGrid-row': { cursor: 'pointer' } }} + initialState={{ sorting: { sortModel: [{ field: 'receiptDate', sort: 'desc' }] } }} + /> + + + ); +} diff --git a/client/src/features/ar/shared/AllocationPanel.tsx b/client/src/features/ar/shared/AllocationPanel.tsx new file mode 100644 index 0000000..50b6725 --- /dev/null +++ b/client/src/features/ar/shared/AllocationPanel.tsx @@ -0,0 +1,126 @@ +import { useMemo, useState } from 'react'; +import { Alert, Box, Button, Stack, Table, TableBody, TableCell, TableHead, TableRow, TextField, Typography } from '@mui/material'; +import { useInvoices } from '../../../hooks/useARInvoices'; +import { MoneyCell } from '../../../components/common/MoneyCell'; + +interface AllocationPanelProps { + customerId: number; + unallocatedAmount: number; + onAllocate: (allocations: { invoiceId: number; amount: number }[]) => Promise; + isSubmitting: boolean; +} + +export function AllocationPanel({ customerId, unallocatedAmount, onAllocate, isSubmitting }: AllocationPanelProps) { + const { data: invoices } = useInvoices('MAIN', customerId); + const openInvoices = (invoices ?? []).filter((invoice) => invoice.status === 'POSTED' && Number(invoice.balance) > 0); + + const [amounts, setAmounts] = useState>({}); + const [error, setError] = useState(null); + + const totalEntered = useMemo( + () => Object.values(amounts).reduce((sum, value) => sum + (Number(value) || 0), 0), + [amounts], + ); + const remaining = unallocatedAmount - totalEntered; + + if (unallocatedAmount <= 0) { + return ( + + Fully allocated. + + ); + } + + const applyFull = (invoiceId: number, balance: number) => { + const applied = Math.min(balance, unallocatedAmount - totalEntered + (Number(amounts[invoiceId]) || 0)); + setAmounts((prev) => ({ ...prev, [invoiceId]: applied > 0 ? applied.toFixed(2) : '' })); + }; + + const handleApply = async () => { + setError(null); + const allocations = Object.entries(amounts) + .map(([invoiceId, value]) => ({ invoiceId: Number(invoiceId), amount: Number(value) || 0 })) + .filter((allocation) => allocation.amount > 0); + if (allocations.length === 0) { + setError('Enter at least one allocation amount'); + return; + } + if (totalEntered > unallocatedAmount) { + setError('Total allocated exceeds the unallocated amount'); + return; + } + try { + await onAllocate(allocations); + setAmounts({}); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to allocate')); + } + }; + + if (openInvoices.length === 0) { + return ( + + This customer has no open invoices to allocate against. + + ); + } + + return ( + + + + + Invoice # + Due + Balance + + Apply Amount + + + + + {openInvoices.map((invoice) => ( + + {invoice.invoiceNumber} + {invoice.dueDate.slice(0, 10)} + + + + + + setAmounts((prev) => ({ ...prev, [invoice.id]: e.target.value }))} + sx={{ width: 100 }} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + + + ))} + +
+ + + + Remaining unallocated: + + + + + {error && ( + + {error} + + )} +
+ ); +} diff --git a/client/src/features/ar/shared/DocumentLineEditor.tsx b/client/src/features/ar/shared/DocumentLineEditor.tsx new file mode 100644 index 0000000..219b795 --- /dev/null +++ b/client/src/features/ar/shared/DocumentLineEditor.tsx @@ -0,0 +1,142 @@ +import { IconButton, MenuItem, Table, TableBody, TableCell, TableHead, TableRow, TextField } from '@mui/material'; +import DeleteIcon from '@mui/icons-material/Delete'; +import { MoneyCell } from '../../../components/common/MoneyCell'; +import type { GLAccount, TaxCode } from '../../../types/api'; + +export interface DocumentLineDraft { + key: number; + description: string; + quantity: string; + unitPrice: string; + revenueGLAccountId: number | ''; + taxCodeId: number | ''; +} + +let keySeed = 0; +export const blankDocumentLine = (): DocumentLineDraft => ({ + key: keySeed++, + description: '', + quantity: '1', + unitPrice: '', + revenueGLAccountId: '', + taxCodeId: '', +}); + +export function lineTotals(line: DocumentLineDraft, taxCodes: TaxCode[]) { + const quantity = Number(line.quantity) || 0; + const unitPrice = Number(line.unitPrice) || 0; + const subtotal = quantity * unitPrice; + const rate = line.taxCodeId ? Number(taxCodes.find((t) => t.id === line.taxCodeId)?.ratePercent ?? 0) : 0; + const tax = subtotal * (rate / 100); + return { subtotal, tax, total: subtotal + tax }; +} + +interface DocumentLineEditorProps { + lines: DocumentLineDraft[]; + onChange: (lines: DocumentLineDraft[]) => void; + revenueAccounts: GLAccount[]; + taxCodes: TaxCode[]; +} + +export function DocumentLineEditor({ lines, onChange, revenueAccounts, taxCodes }: DocumentLineEditorProps) { + const updateLine = (key: number, patch: Partial) => + onChange(lines.map((line) => (line.key === key ? { ...line, ...patch } : line))); + + const removeLine = (key: number) => onChange(lines.length > 1 ? lines.filter((line) => line.key !== key) : lines); + + return ( + + + + Description + + Qty + + + Unit Price + + Revenue Account + Tax + + Amount + + + + + + {lines.map((line) => { + const { total } = lineTotals(line, taxCodes); + return ( + + + updateLine(line.key, { description: e.target.value })} + /> + + + updateLine(line.key, { quantity: e.target.value })} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + updateLine(line.key, { unitPrice: e.target.value })} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + updateLine(line.key, { revenueGLAccountId: Number(e.target.value) })} + > + {revenueAccounts.map((account) => ( + + {account.accountCode} — {account.accountName} + + ))} + + + + updateLine(line.key, { taxCodeId: e.target.value ? Number(e.target.value) : '' })} + > + None + {taxCodes.map((taxCode) => ( + + {taxCode.code} ({Number(taxCode.ratePercent)}%) + + ))} + + + + + + + removeLine(line.key)} disabled={lines.length <= 1}> + + + + + ); + })} + +
+ ); +} diff --git a/client/src/features/auth/HandoffPage.tsx b/client/src/features/auth/HandoffPage.tsx new file mode 100644 index 0000000..55aead3 --- /dev/null +++ b/client/src/features/auth/HandoffPage.tsx @@ -0,0 +1,42 @@ +import { useEffect, useRef } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, CircularProgress, Typography } from '@mui/material'; +import { useAuth } from '../../hooks/useAuth'; + +/** + * Lands here after the Account Manager redirects with a one-time handoff token + * (see manager/src/modules/companies/companies.service.ts issueHandoff()). Exchanges it for a + * session in this company app and moves on — there is no local login form to fall back to. + */ +export function HandoffPage() { + const [searchParams] = useSearchParams(); + const navigate = useNavigate(); + const { handoff, handoffError } = useAuth(); + const attempted = useRef(false); + + useEffect(() => { + const token = searchParams.get('token'); + if (!token || attempted.current) return; + attempted.current = true; + handoff(token) + .then(() => navigate('/', { replace: true })) + .catch(() => undefined); + }, [searchParams, handoff, navigate]); + + return ( + + {!handoffError && ( + <> + + Signing you in… + + )} + {handoffError && ( + + {(handoffError as { response?: { data?: { error?: string } } })?.response?.data?.error ?? + 'Could not complete sign-in. Return to the Account Manager and try again.'} + + )} + + ); +} diff --git a/client/src/features/dashboard/DashboardPage.tsx b/client/src/features/dashboard/DashboardPage.tsx new file mode 100644 index 0000000..8ec5d1d --- /dev/null +++ b/client/src/features/dashboard/DashboardPage.tsx @@ -0,0 +1,197 @@ +import { useMemo } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Box, Card, CircularProgress, Stack, Typography } from '@mui/material'; +import PostAddOutlinedIcon from '@mui/icons-material/PostAddOutlined'; +import AccountBalanceOutlinedIcon from '@mui/icons-material/AccountBalanceOutlined'; +import MenuBookOutlinedIcon from '@mui/icons-material/MenuBookOutlined'; +import GroupOutlinedIcon from '@mui/icons-material/GroupOutlined'; +import { useJournalEntries } from '../../hooks/useJournalEntries'; +import { useAuth } from '../../hooks/useAuth'; +import { StatusChip } from '../../components/common/StatusChip'; +import { MoneyCell } from '../../components/common/MoneyCell'; +import { ACCENT_BLUE } from '../../theme'; +import type { GLAccountType } from '../../types/api'; + +const TYPE_COLOR: Record = { + ASSET: '#2f6fed', + LIABILITY: '#e0631f', + EQUITY: '#7c3aed', + INCOME: '#1a9e6e', + EXPENSE: '#d1364c', +}; + +function KpiTile({ label, value, sub }: { label: string; value: string; sub?: string }) { + return ( + + + {label} + + {value} + {sub && ( + + {sub} + + )} + + ); +} + +export function DashboardPage() { + const navigate = useNavigate(); + const { hasPermission } = useAuth(); + const { data: entries, isLoading } = useJournalEntries('MAIN'); + + const stats = useMemo(() => { + const all = entries ?? []; + const posted = all.filter((e) => e.status === 'POSTED'); + const draft = all.filter((e) => e.status === 'DRAFT'); + const totalPostedValue = posted.reduce((sum, e) => sum + Number(e.totalDebits), 0); + const accountIds = new Set(); + const movementByType = new Map(); + for (const entry of posted) { + for (const line of entry.lines) { + accountIds.add(line.glAccountId); + const net = Number(line.debit) - Number(line.credit); + const signed = line.glAccount.normalBalance === 'DEBIT' ? net : -net; + movementByType.set(line.glAccount.accountType, (movementByType.get(line.glAccount.accountType) ?? 0) + Math.abs(signed)); + } + } + const recent = [...all].sort((a, b) => b.entryDate.localeCompare(a.entryDate)).slice(0, 8); + const maxMovement = Math.max(1, ...Array.from(movementByType.values())); + return { posted, draft, totalPostedValue, accountsInUse: accountIds.size, movementByType, recent, maxMovement }; + }, [entries]); + + if (isLoading) return ; + + const quickActions = [ + { label: 'New Manual Entry', path: '/gl/journal-entries/new', icon: , permission: 'gl.journal.post' }, + { label: 'Chart of Accounts', path: '/admin/chart-of-accounts', icon: , permission: 'gl.account.manage' }, + { label: 'Journals', path: '/admin/journals', icon: , permission: 'gl.journal.manage' }, + { label: 'Users & Roles', path: '/admin/users', icon: , permission: 'admin.users.manage' }, + ].filter((action) => !action.permission || hasPermission(action.permission)); + + return ( + + + Dashboard + + + Overview of general ledger activity across all branches. + + + + + + + + + + + + + Posted Movement by Account Type + + {stats.movementByType.size === 0 ? ( + + No posted entries yet. + + ) : ( + + {(Object.keys(TYPE_COLOR) as GLAccountType[]) + .filter((type) => stats.movementByType.has(type)) + .map((type) => { + const value = stats.movementByType.get(type) ?? 0; + const pct = (value / stats.maxMovement) * 100; + return ( + + + {type} + + + + + + + + + ); + })} + + )} + + + + + Quick Actions + + + {quickActions.map((action) => ( + navigate(action.path)} + sx={{ + alignItems: 'center', + p: 1, + borderRadius: 2, + cursor: 'pointer', + color: ACCENT_BLUE, + '&:hover': { bgcolor: '#f0f4ff' }, + }} + > + {action.icon} + + {action.label} + + + ))} + + + + + + + Recent Activity + + {stats.recent.length === 0 ? ( + + No journal entries yet. + + ) : ( + }> + {stats.recent.map((entry) => ( + navigate(`/gl/journal-entries/${entry.id}`)} + > + + + {entry.entryDate.slice(0, 10)} + + + + {entry.entryNumber} + + + {entry.description} + + + + + + + ))} + + )} + + + ); +} diff --git a/client/src/features/gl/GLAccountLedgerView.tsx b/client/src/features/gl/GLAccountLedgerView.tsx new file mode 100644 index 0000000..86f54a5 --- /dev/null +++ b/client/src/features/gl/GLAccountLedgerView.tsx @@ -0,0 +1,129 @@ +import { useMemo, useState } from 'react'; +import { Box, Card, MenuItem, Stack, Table, TableBody, TableCell, TableHead, TableRow, TextField, Typography } from '@mui/material'; +import { useJournalEntries } from '../../hooks/useJournalEntries'; +import { useGLAccounts } from '../../hooks/useGLAccounts'; +import { useBranchStore } from '../../store/branchStore'; +import { MoneyCell } from '../../components/common/MoneyCell'; + +/** Account-centric drill-down, computed client-side from posted entries already in cache — no new endpoint. */ +export function GLAccountLedgerView() { + const selected = useBranchStore((state) => state.selected); + const { data: accounts } = useGLAccounts(selected); + const { data: entries, isLoading } = useJournalEntries(selected); + + const [accountId, setAccountId] = useState(''); + const [fromDate, setFromDate] = useState(''); + const [toDate, setToDate] = useState(''); + + const account = (accounts ?? []).find((a) => a.id === accountId); + + const rows = useMemo(() => { + if (!accountId) return []; + let running = 0; + return (entries ?? []) + .filter((entry) => entry.status === 'POSTED') + .flatMap((entry) => + entry.lines + .filter((line) => line.glAccountId === accountId) + .map((line) => ({ entry, line })), + ) + .filter(({ entry }) => (!fromDate || entry.entryDate.slice(0, 10) >= fromDate) && (!toDate || entry.entryDate.slice(0, 10) <= toDate)) + .sort((a, b) => a.entry.entryDate.localeCompare(b.entry.entryDate)) + .map(({ entry, line }) => { + const movement = account?.normalBalance === 'DEBIT' ? Number(line.debit) - Number(line.credit) : Number(line.credit) - Number(line.debit); + running += movement; + return { entry, line, running }; + }); + }, [entries, accountId, fromDate, toDate, account?.normalBalance]); + + return ( + + + + setAccountId(e.target.value ? Number(e.target.value) : '')} + sx={{ minWidth: 280 }} + > + {(accounts ?? []) + .filter((a) => a.isPostable) + .map((a) => ( + + {a.accountCode} — {a.accountName} + + ))} + + setFromDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + setToDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + + + + {!accountId ? ( + + Select an account to view its posted transaction history and running balance. + + ) : ( + + + + + Date + Reference + Description + Debit + Credit + Balance + + + + {!isLoading && rows.length === 0 && ( + + + + No posted transactions for this account in the selected range. + + + + )} + {rows.map(({ entry, line, running }) => ( + + {entry.entryDate.slice(0, 10)} + {entry.entryNumber} + {line.description || entry.description} + + + + + + + + + + + + + ))} + +
+
+ )} +
+ ); +} diff --git a/client/src/features/gl/JournalEntryDetailPage.tsx b/client/src/features/gl/JournalEntryDetailPage.tsx new file mode 100644 index 0000000..4decef9 --- /dev/null +++ b/client/src/features/gl/JournalEntryDetailPage.tsx @@ -0,0 +1,144 @@ +import { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { + Alert, + Box, + Button, + CircularProgress, + Paper, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from '@mui/material'; +import { useJournalEntry, useReverseJournalEntry } from '../../hooks/useJournalEntries'; +import { StatusChip } from '../../components/common/StatusChip'; +import { MoneyCell } from '../../components/common/MoneyCell'; +import { ConfirmDialog } from '../../components/common/ConfirmDialog'; +import { useAuth } from '../../hooks/useAuth'; + +export function JournalEntryDetailPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const { hasPermission } = useAuth(); + const { data: entry, isLoading } = useJournalEntry(id ? Number(id) : undefined); + const reverseEntry = useReverseJournalEntry(); + const [confirmOpen, setConfirmOpen] = useState(false); + const [error, setError] = useState(null); + + if (isLoading || !entry) return ; + + const handleReverse = async () => { + try { + const reversal = await reverseEntry.mutateAsync({ id: entry.id }); + setConfirmOpen(false); + navigate(`/gl/journal-entries/${reversal.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? 'Failed to reverse entry'); + setConfirmOpen(false); + } + }; + + return ( + + + {entry.entryNumber} + + + {entry.status === 'POSTED' && hasPermission('gl.journal.post') && ( + + )} + + + + {error && ( + + {error} + + )} + + + + + + Journal + + {entry.journal?.code} + + + + Date + + {entry.entryDate.slice(0, 10)} + + + + Description + + {entry.description} + + + + + + + + + GL Account + Description + Debit + Credit + + + + {entry.lines.map((line) => ( + + + {line.glAccount.accountCode} — {line.glAccount.accountName} + + {line.description} + + + + + + + + ))} + + + Total + + + + + + + + + + + + + +
+
+ + setConfirmOpen(false)} + loading={reverseEntry.isPending} + /> +
+ ); +} diff --git a/client/src/features/gl/JournalEntryFormPage.tsx b/client/src/features/gl/JournalEntryFormPage.tsx new file mode 100644 index 0000000..187d1d2 --- /dev/null +++ b/client/src/features/gl/JournalEntryFormPage.tsx @@ -0,0 +1,255 @@ +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { + Alert, + Box, + Button, + IconButton, + MenuItem, + Paper, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + TextField, + Typography, +} from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import DeleteIcon from '@mui/icons-material/Delete'; +import { useJournals } from '../../hooks/useJournals'; +import { useGLAccounts } from '../../hooks/useGLAccounts'; +import { useSegmentDefinitions } from '../../hooks/useSegments'; +import { useCreateManualEntry } from '../../hooks/useJournalEntries'; + +interface LineDraft { + key: number; + glAccountId: number | ''; + debit: string; + credit: string; + description: string; + branchSegmentValueId: number | ''; +} + +let keySeed = 0; +const blankLine = (): LineDraft => ({ key: keySeed++, glAccountId: '', debit: '', credit: '', description: '', branchSegmentValueId: '' }); + +export function JournalEntryFormPage() { + const navigate = useNavigate(); + const { data: journals } = useJournals(); + const { data: accounts } = useGLAccounts('MAIN'); + const { data: definitions } = useSegmentDefinitions(); + const branchDef = (definitions ?? []).find((def) => def.isBranchSegment); + const createEntry = useCreateManualEntry(); + + const [journalCode, setJournalCode] = useState('GJ'); + const [entryDate, setEntryDate] = useState(new Date().toISOString().slice(0, 10)); + const [description, setDescription] = useState(''); + const [lines, setLines] = useState([blankLine(), blankLine()]); + const [error, setError] = useState(null); + + const totalDebits = lines.reduce((sum, line) => sum + (Number(line.debit) || 0), 0); + const totalCredits = lines.reduce((sum, line) => sum + (Number(line.credit) || 0), 0); + const isBalanced = totalDebits > 0 && totalDebits === totalCredits; + + const updateLine = (key: number, patch: Partial) => + setLines((prev) => prev.map((line) => (line.key === key ? { ...line, ...patch } : line))); + + const removeLine = (key: number) => setLines((prev) => (prev.length > 2 ? prev.filter((line) => line.key !== key) : prev)); + + const handleSubmit = async () => { + setError(null); + if (!isBalanced) { + setError('Debits and credits must balance before this entry can be posted'); + return; + } + if (lines.some((line) => !line.glAccountId || (Number(line.debit) === 0 && Number(line.credit) === 0))) { + setError('Every line needs a GL account and a debit or credit amount'); + return; + } + try { + const entry = await createEntry.mutateAsync({ + journalCode, + entryDate, + description, + lines: lines.map((line) => ({ + glAccountId: line.glAccountId as number, + debit: Number(line.debit) || 0, + credit: Number(line.credit) || 0, + description: line.description || undefined, + branchSegmentValueId: line.branchSegmentValueId ? (line.branchSegmentValueId as number) : undefined, + })), + }); + navigate(`/gl/journal-entries/${entry.id}`); + } catch (err) { + const message = (err as { response?: { data?: { error?: string } } })?.response?.data?.error; + setError(message ?? (err instanceof Error ? err.message : 'Failed to post entry')); + } + }; + + return ( + + + New Manual Journal Entry + + + + + setJournalCode(e.target.value)} sx={{ minWidth: 200 }}> + {(journals ?? []).map((journal) => ( + + {journal.code} — {journal.name} + + ))} + + setEntryDate(e.target.value)} + slotProps={{ inputLabel: { shrink: true } }} + /> + setDescription(e.target.value)} fullWidth /> + + + + + + + + GL Account + Line description + Branch + + Debit + + + Credit + + + + + + {lines.map((line) => ( + + + updateLine(line.key, { glAccountId: Number(e.target.value) })} + > + {(accounts ?? []).map((account) => ( + + {account.accountCode} — {account.accountName} + + ))} + + + + updateLine(line.key, { description: e.target.value })} + /> + + + {branchDef && ( + updateLine(line.key, { branchSegmentValueId: e.target.value ? Number(e.target.value) : '' })} + > + — + {branchDef.values.map((value) => ( + + {value.code} + + ))} + + )} + + + updateLine(line.key, { debit: e.target.value, credit: e.target.value ? '' : line.credit })} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + updateLine(line.key, { credit: e.target.value, debit: e.target.value ? '' : line.debit })} + slotProps={{ htmlInput: { min: 0, step: '0.01', style: { textAlign: 'right' } } }} + /> + + + removeLine(line.key)} disabled={lines.length <= 2}> + + + + + ))} + +
+ + + + + + Total debits: {totalDebits.toFixed(2)} + + + Total credits: {totalCredits.toFixed(2)} + + + {isBalanced ? 'Balanced ✓' : 'Not balanced'} + + +
+ + {error && ( + + {error} + + )} + + + + + Attachments + + + + + + Notes + + + + + + + + + +
+ ); +} diff --git a/client/src/features/gl/JournalEntryListPage.tsx b/client/src/features/gl/JournalEntryListPage.tsx new file mode 100644 index 0000000..887a964 --- /dev/null +++ b/client/src/features/gl/JournalEntryListPage.tsx @@ -0,0 +1,78 @@ +import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { Box, Button, Card, Stack, Tab, Tabs, Typography } from '@mui/material'; +import { DataGrid, type GridColDef } from '@mui/x-data-grid'; +import { useJournalEntries } from '../../hooks/useJournalEntries'; +import { useBranchStore } from '../../store/branchStore'; +import { StatusChip } from '../../components/common/StatusChip'; +import { MoneyCell } from '../../components/common/MoneyCell'; +import { useAuth } from '../../hooks/useAuth'; +import { GLAccountLedgerView } from './GLAccountLedgerView'; +import type { JournalEntry } from '../../types/api'; + +export function JournalEntryListPage() { + const navigate = useNavigate(); + const selected = useBranchStore((state) => state.selected); + const { data: entries, isLoading } = useJournalEntries(selected); + const { hasPermission } = useAuth(); + const [tab, setTab] = useState(0); + + const columns: GridColDef[] = [ + { field: 'entryNumber', headerName: 'Entry #', width: 180 }, + { field: 'entryDate', headerName: 'Date', width: 120, valueFormatter: (value: string) => value?.slice(0, 10) }, + { field: 'description', headerName: 'Description', flex: 1 }, + { field: 'journal', headerName: 'Journal', width: 140, valueGetter: (_v, row) => row.journal?.code }, + { + field: 'totalDebits', + headerName: 'Debits', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { + field: 'totalCredits', + headerName: 'Credits', + width: 120, + align: 'right', + headerAlign: 'right', + renderCell: (params) => , + }, + { field: 'status', headerName: 'Status', width: 120, renderCell: (params) => }, + ]; + + return ( + + + General Ledger + {hasPermission('gl.journal.post') && ( + + )} + + + setTab(value)} sx={{ mb: 2 }}> + + + + + {tab === 0 && ( + + navigate(`/gl/journal-entries/${params.row.id}`)} + sx={{ border: 'none', '& .MuiDataGrid-row': { cursor: 'pointer' } }} + initialState={{ pagination: { paginationModel: { pageSize: 25 } }, sorting: { sortModel: [{ field: 'entryDate', sort: 'desc' }] } }} + /> + + )} + + {tab === 1 && } + + ); +} diff --git a/client/src/features/reports/ReportsPage.tsx b/client/src/features/reports/ReportsPage.tsx new file mode 100644 index 0000000..5822ac5 --- /dev/null +++ b/client/src/features/reports/ReportsPage.tsx @@ -0,0 +1,88 @@ +import { Box, Card, Chip, Stack, Typography } from '@mui/material'; +import DescriptionOutlinedIcon from '@mui/icons-material/DescriptionOutlined'; + +interface ReportDef { + name: string; + description: string; +} + +const CATEGORIES: { title: string; reports: ReportDef[] }[] = [ + { + title: 'Financial', + reports: [ + { name: 'Trial Balance', description: 'Debit and credit balances for every account, Main or per-branch.' }, + { name: 'Profit & Loss Statement', description: 'Income and expense performance for a selected period.' }, + { name: 'Balance Sheet', description: 'Assets, liabilities, and equity as at a selected date.' }, + { name: 'General Ledger', description: 'Full transaction detail for any account and date range.' }, + ], + }, + { + title: 'Receivables', + reports: [ + { name: 'Aged Receivables', description: 'Outstanding customer balances by age bucket.' }, + { name: 'Customer Statement', description: 'Transaction history and running balance per customer.' }, + ], + }, + { + title: 'Payables', + reports: [ + { name: 'Aged Payables', description: 'Outstanding supplier balances by age bucket.' }, + { name: 'Payment Run', description: 'Supplier invoices selected for the next payment batch.' }, + ], + }, + { + title: 'Management', + reports: [ + { name: 'Budget vs Actual', description: 'Budgeted figures compared against actual GL movement.' }, + { name: 'Branch Performance', description: 'Key metrics compared across branches.' }, + { name: 'Stock Valuation', description: 'On-hand stock quantities and value by warehouse.' }, + ], + }, +]; + +export function ReportsPage() { + return ( + + + Reports Centre + + + Financial and management reports. Reports become available as each module is built. + + + + {CATEGORIES.map((category) => ( + + + {category.title} + + + {category.reports.map((report) => ( + + + + + {report.name} + + + + {report.description} + + + + ))} + + + ))} + + + ); +} diff --git a/client/src/hooks/useAPDebitNotes.ts b/client/src/hooks/useAPDebitNotes.ts new file mode 100644 index 0000000..351ba82 --- /dev/null +++ b/client/src/hooks/useAPDebitNotes.ts @@ -0,0 +1,55 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { + allocateDebitNote, + createDebitNote, + fetchDebitNote, + fetchDebitNotes, + postDebitNote, + voidDebitNote, +} from '../api/apDebitNotes.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useDebitNotes(branchScope: BranchSelection, supplierId?: number) { + return useQuery({ queryKey: ['apDebitNotes', branchScope, supplierId], queryFn: () => fetchDebitNotes(branchScope, supplierId) }); +} + +export function useDebitNote(id: number | undefined) { + return useQuery({ + queryKey: ['apDebitNote', id], + queryFn: () => fetchDebitNote(id as number), + enabled: id !== undefined, + }); +} + +function invalidateDebitNoteQueries(queryClient: ReturnType) { + queryClient.invalidateQueries({ queryKey: ['apDebitNotes'] }); + queryClient.invalidateQueries({ queryKey: ['apDebitNote'] }); + queryClient.invalidateQueries({ queryKey: ['apInvoice'] }); + queryClient.invalidateQueries({ queryKey: ['apInvoices'] }); + queryClient.invalidateQueries({ queryKey: ['supplier'] }); + queryClient.invalidateQueries({ queryKey: ['glAccounts'] }); +} + +export function useCreateDebitNote() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: createDebitNote, onSuccess: () => invalidateDebitNoteQueries(queryClient) }); +} + +export function usePostDebitNote() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: postDebitNote, onSuccess: () => invalidateDebitNoteQueries(queryClient) }); +} + +export function useVoidDebitNote() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: voidDebitNote, onSuccess: () => invalidateDebitNoteQueries(queryClient) }); +} + +export function useAllocateDebitNote() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, allocations }: { id: number; allocations: { invoiceId: number; amount: number }[] }) => + allocateDebitNote(id, allocations), + onSuccess: () => invalidateDebitNoteQueries(queryClient), + }); +} diff --git a/client/src/hooks/useAPInvoices.ts b/client/src/hooks/useAPInvoices.ts new file mode 100644 index 0000000..564e572 --- /dev/null +++ b/client/src/hooks/useAPInvoices.ts @@ -0,0 +1,37 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createInvoice, fetchInvoice, fetchInvoices, postInvoice, voidInvoice } from '../api/apInvoices.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useInvoices(branchScope: BranchSelection, supplierId?: number) { + return useQuery({ queryKey: ['apInvoices', branchScope, supplierId], queryFn: () => fetchInvoices(branchScope, supplierId) }); +} + +export function useInvoice(id: number | undefined) { + return useQuery({ + queryKey: ['apInvoice', id], + queryFn: () => fetchInvoice(id as number), + enabled: id !== undefined, + }); +} + +function invalidateInvoiceQueries(queryClient: ReturnType) { + queryClient.invalidateQueries({ queryKey: ['apInvoices'] }); + queryClient.invalidateQueries({ queryKey: ['apInvoice'] }); + queryClient.invalidateQueries({ queryKey: ['supplier'] }); + queryClient.invalidateQueries({ queryKey: ['glAccounts'] }); +} + +export function useCreateInvoice() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: createInvoice, onSuccess: () => invalidateInvoiceQueries(queryClient) }); +} + +export function usePostInvoice() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: postInvoice, onSuccess: () => invalidateInvoiceQueries(queryClient) }); +} + +export function useVoidInvoice() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: voidInvoice, onSuccess: () => invalidateInvoiceQueries(queryClient) }); +} diff --git a/client/src/hooks/useAPPayments.ts b/client/src/hooks/useAPPayments.ts new file mode 100644 index 0000000..4768e77 --- /dev/null +++ b/client/src/hooks/useAPPayments.ts @@ -0,0 +1,48 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { allocatePayment, createPayment, fetchPayment, fetchPayments, postPayment, voidPayment } from '../api/apPayments.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function usePayments(branchScope: BranchSelection, supplierId?: number) { + return useQuery({ queryKey: ['apPayments', branchScope, supplierId], queryFn: () => fetchPayments(branchScope, supplierId) }); +} + +export function usePayment(id: number | undefined) { + return useQuery({ + queryKey: ['apPayment', id], + queryFn: () => fetchPayment(id as number), + enabled: id !== undefined, + }); +} + +function invalidatePaymentQueries(queryClient: ReturnType) { + queryClient.invalidateQueries({ queryKey: ['apPayments'] }); + queryClient.invalidateQueries({ queryKey: ['apPayment'] }); + queryClient.invalidateQueries({ queryKey: ['apInvoice'] }); + queryClient.invalidateQueries({ queryKey: ['apInvoices'] }); + queryClient.invalidateQueries({ queryKey: ['supplier'] }); + queryClient.invalidateQueries({ queryKey: ['glAccounts'] }); +} + +export function useCreatePayment() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: createPayment, onSuccess: () => invalidatePaymentQueries(queryClient) }); +} + +export function usePostPayment() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: postPayment, onSuccess: () => invalidatePaymentQueries(queryClient) }); +} + +export function useVoidPayment() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: voidPayment, onSuccess: () => invalidatePaymentQueries(queryClient) }); +} + +export function useAllocatePayment() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, allocations }: { id: number; allocations: { invoiceId: number; amount: number }[] }) => + allocatePayment(id, allocations), + onSuccess: () => invalidatePaymentQueries(queryClient), + }); +} diff --git a/client/src/hooks/useARCreditNotes.ts b/client/src/hooks/useARCreditNotes.ts new file mode 100644 index 0000000..ca5be4a --- /dev/null +++ b/client/src/hooks/useARCreditNotes.ts @@ -0,0 +1,55 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { + allocateCreditNote, + createCreditNote, + fetchCreditNote, + fetchCreditNotes, + postCreditNote, + voidCreditNote, +} from '../api/arCreditNotes.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useCreditNotes(branchScope: BranchSelection, customerId?: number) { + return useQuery({ queryKey: ['arCreditNotes', branchScope, customerId], queryFn: () => fetchCreditNotes(branchScope, customerId) }); +} + +export function useCreditNote(id: number | undefined) { + return useQuery({ + queryKey: ['arCreditNote', id], + queryFn: () => fetchCreditNote(id as number), + enabled: id !== undefined, + }); +} + +function invalidateCreditNoteQueries(queryClient: ReturnType) { + queryClient.invalidateQueries({ queryKey: ['arCreditNotes'] }); + queryClient.invalidateQueries({ queryKey: ['arCreditNote'] }); + queryClient.invalidateQueries({ queryKey: ['arInvoice'] }); + queryClient.invalidateQueries({ queryKey: ['arInvoices'] }); + queryClient.invalidateQueries({ queryKey: ['customer'] }); + queryClient.invalidateQueries({ queryKey: ['glAccounts'] }); +} + +export function useCreateCreditNote() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: createCreditNote, onSuccess: () => invalidateCreditNoteQueries(queryClient) }); +} + +export function usePostCreditNote() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: postCreditNote, onSuccess: () => invalidateCreditNoteQueries(queryClient) }); +} + +export function useVoidCreditNote() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: voidCreditNote, onSuccess: () => invalidateCreditNoteQueries(queryClient) }); +} + +export function useAllocateCreditNote() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, allocations }: { id: number; allocations: { invoiceId: number; amount: number }[] }) => + allocateCreditNote(id, allocations), + onSuccess: () => invalidateCreditNoteQueries(queryClient), + }); +} diff --git a/client/src/hooks/useARInvoices.ts b/client/src/hooks/useARInvoices.ts new file mode 100644 index 0000000..474bb9e --- /dev/null +++ b/client/src/hooks/useARInvoices.ts @@ -0,0 +1,37 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createInvoice, fetchInvoice, fetchInvoices, postInvoice, voidInvoice } from '../api/arInvoices.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useInvoices(branchScope: BranchSelection, customerId?: number) { + return useQuery({ queryKey: ['arInvoices', branchScope, customerId], queryFn: () => fetchInvoices(branchScope, customerId) }); +} + +export function useInvoice(id: number | undefined) { + return useQuery({ + queryKey: ['arInvoice', id], + queryFn: () => fetchInvoice(id as number), + enabled: id !== undefined, + }); +} + +function invalidateInvoiceQueries(queryClient: ReturnType) { + queryClient.invalidateQueries({ queryKey: ['arInvoices'] }); + queryClient.invalidateQueries({ queryKey: ['arInvoice'] }); + queryClient.invalidateQueries({ queryKey: ['customer'] }); + queryClient.invalidateQueries({ queryKey: ['glAccounts'] }); +} + +export function useCreateInvoice() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: createInvoice, onSuccess: () => invalidateInvoiceQueries(queryClient) }); +} + +export function usePostInvoice() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: postInvoice, onSuccess: () => invalidateInvoiceQueries(queryClient) }); +} + +export function useVoidInvoice() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: voidInvoice, onSuccess: () => invalidateInvoiceQueries(queryClient) }); +} diff --git a/client/src/hooks/useARReceipts.ts b/client/src/hooks/useARReceipts.ts new file mode 100644 index 0000000..0958af6 --- /dev/null +++ b/client/src/hooks/useARReceipts.ts @@ -0,0 +1,48 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { allocateReceipt, createReceipt, fetchReceipt, fetchReceipts, postReceipt, voidReceipt } from '../api/arReceipts.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useReceipts(branchScope: BranchSelection, customerId?: number) { + return useQuery({ queryKey: ['arReceipts', branchScope, customerId], queryFn: () => fetchReceipts(branchScope, customerId) }); +} + +export function useReceipt(id: number | undefined) { + return useQuery({ + queryKey: ['arReceipt', id], + queryFn: () => fetchReceipt(id as number), + enabled: id !== undefined, + }); +} + +function invalidateReceiptQueries(queryClient: ReturnType) { + queryClient.invalidateQueries({ queryKey: ['arReceipts'] }); + queryClient.invalidateQueries({ queryKey: ['arReceipt'] }); + queryClient.invalidateQueries({ queryKey: ['arInvoice'] }); + queryClient.invalidateQueries({ queryKey: ['arInvoices'] }); + queryClient.invalidateQueries({ queryKey: ['customer'] }); + queryClient.invalidateQueries({ queryKey: ['glAccounts'] }); +} + +export function useCreateReceipt() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: createReceipt, onSuccess: () => invalidateReceiptQueries(queryClient) }); +} + +export function usePostReceipt() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: postReceipt, onSuccess: () => invalidateReceiptQueries(queryClient) }); +} + +export function useVoidReceipt() { + const queryClient = useQueryClient(); + return useMutation({ mutationFn: voidReceipt, onSuccess: () => invalidateReceiptQueries(queryClient) }); +} + +export function useAllocateReceipt() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, allocations }: { id: number; allocations: { invoiceId: number; amount: number }[] }) => + allocateReceipt(id, allocations), + onSuccess: () => invalidateReceiptQueries(queryClient), + }); +} diff --git a/client/src/hooks/useAuth.ts b/client/src/hooks/useAuth.ts new file mode 100644 index 0000000..f20d63b --- /dev/null +++ b/client/src/hooks/useAuth.ts @@ -0,0 +1,22 @@ +import { useMutation } from '@tanstack/react-query'; +import { handoff as handoffRequest } from '../api/auth.api'; +import { useAuthStore } from '../store/authStore'; + +export function useAuth() { + const { user, accessToken, setSession, clearSession, hasPermission } = useAuthStore(); + + const handoffMutation = useMutation({ + mutationFn: (token: string) => handoffRequest(token), + onSuccess: (session) => setSession(session), + }); + + return { + user, + isAuthenticated: Boolean(accessToken && user), + handoff: handoffMutation.mutateAsync, + isHandingOff: handoffMutation.isPending, + handoffError: handoffMutation.error, + logout: clearSession, + hasPermission, + }; +} diff --git a/client/src/hooks/useBranchScope.ts b/client/src/hooks/useBranchScope.ts new file mode 100644 index 0000000..20ef0a8 --- /dev/null +++ b/client/src/hooks/useBranchScope.ts @@ -0,0 +1,22 @@ +import { useQuery } from '@tanstack/react-query'; +import { fetchBranchValues } from '../api/segments.api'; +import { useAuthStore } from '../store/authStore'; +import { useBranchStore } from '../store/branchStore'; + +export function useBranchScope() { + const { selected, setSelected } = useBranchStore(); + const allowed = useAuthStore((state) => state.user?.allowedBranchSegmentValueIds ?? null); + + const branchesQuery = useQuery({ queryKey: ['branches'], queryFn: fetchBranchValues }); + const allBranches = branchesQuery.data ?? []; + const visibleBranches = allowed === null ? allBranches : allBranches.filter((branch) => allowed.includes(branch.id)); + const canViewMain = allowed === null; + + return { + selected, + setSelected, + branches: visibleBranches, + canViewMain, + isLoading: branchesQuery.isLoading, + }; +} diff --git a/client/src/hooks/useCustomers.ts b/client/src/hooks/useCustomers.ts new file mode 100644 index 0000000..e889c89 --- /dev/null +++ b/client/src/hooks/useCustomers.ts @@ -0,0 +1,34 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createCustomer, fetchCustomer, fetchCustomers, updateCustomer, type CustomerInput } from '../api/customers.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useCustomers(branchScope: BranchSelection) { + return useQuery({ queryKey: ['customers', branchScope], queryFn: () => fetchCustomers(branchScope) }); +} + +export function useCustomer(id: number | undefined) { + return useQuery({ + queryKey: ['customer', id], + queryFn: () => fetchCustomer(id as number), + enabled: id !== undefined, + }); +} + +export function useCreateCustomer() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createCustomer, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['customers'] }), + }); +} + +export function useUpdateCustomer() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, input }: { id: number; input: Partial & { isActive?: boolean } }) => updateCustomer(id, input), + onSuccess: (_data, variables) => { + queryClient.invalidateQueries({ queryKey: ['customers'] }); + queryClient.invalidateQueries({ queryKey: ['customer', variables.id] }); + }, + }); +} diff --git a/client/src/hooks/useFiscalYears.ts b/client/src/hooks/useFiscalYears.ts new file mode 100644 index 0000000..8472a85 --- /dev/null +++ b/client/src/hooks/useFiscalYears.ts @@ -0,0 +1,14 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createFiscalYear, fetchFiscalYears } from '../api/fiscalPeriods.api'; + +export function useFiscalYears() { + return useQuery({ queryKey: ['fiscalYears'], queryFn: fetchFiscalYears }); +} + +export function useCreateFiscalYear() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createFiscalYear, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['fiscalYears'] }), + }); +} diff --git a/client/src/hooks/useGLAccounts.ts b/client/src/hooks/useGLAccounts.ts new file mode 100644 index 0000000..f555168 --- /dev/null +++ b/client/src/hooks/useGLAccounts.ts @@ -0,0 +1,19 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createGLAccount, fetchGLAccounts } from '../api/glAccounts.api'; +import type { BranchSelection } from '../store/branchStore'; +import type { GLAccountType } from '../types/api'; + +export function useGLAccounts(branchScope: BranchSelection, accountType?: GLAccountType) { + return useQuery({ + queryKey: ['glAccounts', branchScope, accountType], + queryFn: () => fetchGLAccounts(branchScope, accountType), + }); +} + +export function useCreateGLAccount() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createGLAccount, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['glAccounts'] }), + }); +} diff --git a/client/src/hooks/useJournalEntries.ts b/client/src/hooks/useJournalEntries.ts new file mode 100644 index 0000000..9f4d6fe --- /dev/null +++ b/client/src/hooks/useJournalEntries.ts @@ -0,0 +1,37 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createManualEntry, fetchJournalEntries, fetchJournalEntry, reverseJournalEntry } from '../api/journalEntries.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useJournalEntries(branchScope: BranchSelection) { + return useQuery({ queryKey: ['journalEntries', branchScope], queryFn: () => fetchJournalEntries(branchScope) }); +} + +export function useJournalEntry(id: number | undefined) { + return useQuery({ + queryKey: ['journalEntry', id], + queryFn: () => fetchJournalEntry(id as number), + enabled: id !== undefined, + }); +} + +export function useCreateManualEntry() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createManualEntry, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['journalEntries'] }); + queryClient.invalidateQueries({ queryKey: ['glAccounts'] }); + }, + }); +} + +export function useReverseJournalEntry() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, reason }: { id: number; reason?: string }) => reverseJournalEntry(id, reason), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['journalEntries'] }); + queryClient.invalidateQueries({ queryKey: ['journalEntry'] }); + }, + }); +} diff --git a/client/src/hooks/useJournals.ts b/client/src/hooks/useJournals.ts new file mode 100644 index 0000000..384af9d --- /dev/null +++ b/client/src/hooks/useJournals.ts @@ -0,0 +1,14 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createJournal, fetchJournals } from '../api/journals.api'; + +export function useJournals() { + return useQuery({ queryKey: ['journals'], queryFn: fetchJournals }); +} + +export function useCreateJournal() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createJournal, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['journals'] }), + }); +} diff --git a/client/src/hooks/useRoles.ts b/client/src/hooks/useRoles.ts new file mode 100644 index 0000000..54c82f9 --- /dev/null +++ b/client/src/hooks/useRoles.ts @@ -0,0 +1,19 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { fetchPermissions, fetchRoles, setRolePermissions } from '../api/roles.api'; + +export function useRoles() { + return useQuery({ queryKey: ['roles'], queryFn: fetchRoles }); +} + +export function usePermissions() { + return useQuery({ queryKey: ['permissions'], queryFn: fetchPermissions }); +} + +export function useSetRolePermissions() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ roleId, permissionIds }: { roleId: number; permissionIds: number[] }) => + setRolePermissions(roleId, permissionIds), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['roles'] }), + }); +} diff --git a/client/src/hooks/useSegments.ts b/client/src/hooks/useSegments.ts new file mode 100644 index 0000000..3d0fe3c --- /dev/null +++ b/client/src/hooks/useSegments.ts @@ -0,0 +1,29 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { + createSegmentDefinition, + createSegmentValue, + fetchSegmentDefinitions, +} from '../api/segments.api'; + +export function useSegmentDefinitions() { + return useQuery({ queryKey: ['segmentDefinitions'], queryFn: fetchSegmentDefinitions }); +} + +export function useCreateSegmentDefinition() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createSegmentDefinition, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['segmentDefinitions'] }), + }); +} + +export function useCreateSegmentValue() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createSegmentValue, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['segmentDefinitions'] }); + queryClient.invalidateQueries({ queryKey: ['branches'] }); + }, + }); +} diff --git a/client/src/hooks/useSuppliers.ts b/client/src/hooks/useSuppliers.ts new file mode 100644 index 0000000..862a553 --- /dev/null +++ b/client/src/hooks/useSuppliers.ts @@ -0,0 +1,34 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createSupplier, fetchSupplier, fetchSuppliers, updateSupplier, type SupplierInput } from '../api/suppliers.api'; +import type { BranchSelection } from '../store/branchStore'; + +export function useSuppliers(branchScope: BranchSelection) { + return useQuery({ queryKey: ['suppliers', branchScope], queryFn: () => fetchSuppliers(branchScope) }); +} + +export function useSupplier(id: number | undefined) { + return useQuery({ + queryKey: ['supplier', id], + queryFn: () => fetchSupplier(id as number), + enabled: id !== undefined, + }); +} + +export function useCreateSupplier() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createSupplier, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['suppliers'] }), + }); +} + +export function useUpdateSupplier() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, input }: { id: number; input: Partial & { isActive?: boolean } }) => updateSupplier(id, input), + onSuccess: (_data, variables) => { + queryClient.invalidateQueries({ queryKey: ['suppliers'] }); + queryClient.invalidateQueries({ queryKey: ['supplier', variables.id] }); + }, + }); +} diff --git a/client/src/hooks/useTaxCodes.ts b/client/src/hooks/useTaxCodes.ts new file mode 100644 index 0000000..9edfee2 --- /dev/null +++ b/client/src/hooks/useTaxCodes.ts @@ -0,0 +1,22 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createTaxCode, fetchTaxCodes, updateTaxCode, type TaxCodeInput } from '../api/taxCodes.api'; + +export function useTaxCodes() { + return useQuery({ queryKey: ['taxCodes'], queryFn: fetchTaxCodes }); +} + +export function useCreateTaxCode() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createTaxCode, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['taxCodes'] }), + }); +} + +export function useUpdateTaxCode() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, input }: { id: number; input: Partial }) => updateTaxCode(id, input), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['taxCodes'] }), + }); +} diff --git a/client/src/hooks/useUsers.ts b/client/src/hooks/useUsers.ts new file mode 100644 index 0000000..c9281ed --- /dev/null +++ b/client/src/hooks/useUsers.ts @@ -0,0 +1,22 @@ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { createUser, fetchUsers, setUserActive } from '../api/users.api'; + +export function useUsers() { + return useQuery({ queryKey: ['users'], queryFn: fetchUsers }); +} + +export function useCreateUser() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createUser, + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }), + }); +} + +export function useSetUserActive() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, isActive }: { id: number; isActive: boolean }) => setUserActive(id, isActive), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }), + }); +} diff --git a/client/src/index.css b/client/src/index.css new file mode 100644 index 0000000..e4a5833 --- /dev/null +++ b/client/src/index.css @@ -0,0 +1,7 @@ +html, body, #root { + height: 100%; +} + +body { + margin: 0; +} diff --git a/client/src/layouts/MainLayout.tsx b/client/src/layouts/MainLayout.tsx new file mode 100644 index 0000000..ac58548 --- /dev/null +++ b/client/src/layouts/MainLayout.tsx @@ -0,0 +1,243 @@ +import { useState, type ReactNode } from 'react'; +import { Link as RouterLink, Outlet, useLocation } from 'react-router-dom'; +import { + AppBar, + Avatar, + Box, + Divider, + Drawer, + IconButton, + List, + ListItemButton, + ListItemIcon, + ListItemText, + Menu, + MenuItem, + Stack, + Toolbar, + Typography, +} from '@mui/material'; +import DashboardOutlinedIcon from '@mui/icons-material/DashboardOutlined'; +import ListAltOutlinedIcon from '@mui/icons-material/ListAltOutlined'; +import PostAddOutlinedIcon from '@mui/icons-material/PostAddOutlined'; +import AccountTreeOutlinedIcon from '@mui/icons-material/AccountTreeOutlined'; +import AccountBalanceOutlinedIcon from '@mui/icons-material/AccountBalanceOutlined'; +import MenuBookOutlinedIcon from '@mui/icons-material/MenuBookOutlined'; +import CalendarMonthOutlinedIcon from '@mui/icons-material/CalendarMonthOutlined'; +import GroupOutlinedIcon from '@mui/icons-material/GroupOutlined'; +import AssessmentOutlinedIcon from '@mui/icons-material/AssessmentOutlined'; +import PeopleAltOutlinedIcon from '@mui/icons-material/PeopleAltOutlined'; +import ReceiptOutlinedIcon from '@mui/icons-material/ReceiptOutlined'; +import PaymentsOutlinedIcon from '@mui/icons-material/PaymentsOutlined'; +import PercentOutlinedIcon from '@mui/icons-material/PercentOutlined'; +import StorefrontOutlinedIcon from '@mui/icons-material/StorefrontOutlined'; +import RequestQuoteOutlinedIcon from '@mui/icons-material/RequestQuoteOutlined'; +import PriceCheckOutlinedIcon from '@mui/icons-material/PriceCheckOutlined'; +import { BranchSwitcher } from '../components/common/BranchSwitcher'; +import { useAuth } from '../hooks/useAuth'; +import { NAVY, NAVY_SURFACE, ACCENT_BLUE } from '../theme'; + +const DRAWER_WIDTH = 250; + +interface NavItem { + label: string; + path: string; + icon: ReactNode; + permission?: string; + end?: boolean; +} + +const NAV_SECTIONS: { title: string; items: NavItem[] }[] = [ + { + title: '', + items: [{ label: 'Dashboard', path: '/', icon: , end: true }], + }, + { + title: 'Sales', + items: [ + { label: 'Customers', path: '/ar/customers', icon: }, + { label: 'Invoices', path: '/ar/invoices', icon: }, + { label: 'Receipts', path: '/ar/receipts', icon: }, + ], + }, + { + title: 'Purchasing', + items: [ + { label: 'Suppliers', path: '/ap/suppliers', icon: }, + { label: 'Bills', path: '/ap/invoices', icon: }, + { label: 'Payments', path: '/ap/payments', icon: }, + ], + }, + { + title: 'General Ledger', + items: [ + { label: 'Journal Entries', path: '/gl/journal-entries', icon: }, + { + label: 'New Manual Entry', + path: '/gl/journal-entries/new', + icon: , + permission: 'gl.journal.post', + }, + ], + }, + { + title: 'Reports', + items: [{ label: 'Reports Centre', path: '/reports', icon: }], + }, + { + title: 'Administration', + items: [ + { + label: 'Segments & Branches', + path: '/admin/segments', + icon: , + permission: 'admin.segments.manage', + }, + { + label: 'Chart of Accounts', + path: '/admin/chart-of-accounts', + icon: , + permission: 'gl.account.manage', + }, + { label: 'Journals', path: '/admin/journals', icon: , permission: 'gl.journal.manage' }, + { + label: 'Fiscal Years', + path: '/admin/fiscal-years', + icon: , + permission: 'admin.fiscalPeriods.manage', + }, + { label: 'Users & Roles', path: '/admin/users', icon: , permission: 'admin.users.manage' }, + { label: 'Tax Codes', path: '/admin/tax-codes', icon: , permission: 'admin.tax.manage' }, + ], + }, +]; + +export function MainLayout() { + const { user, logout, hasPermission } = useAuth(); + const location = useLocation(); + const [menuAnchor, setMenuAnchor] = useState(null); + + const initials = (user?.fullName ?? user?.email ?? '?') + .split(/[\s@.]+/) + .filter(Boolean) + .slice(0, 2) + .map((part) => part[0]?.toUpperCase()) + .join(''); + + return ( + + + + + + CF + + + Cross Financial + MANAGER + + + + + {NAV_SECTIONS.map((section) => { + const items = section.items.filter((item) => !item.permission || hasPermission(item.permission)); + if (items.length === 0) return null; + return ( + + {section.title && ( + + {section.title} + + )} + + {items.map((item) => { + const selected = item.end ? location.pathname === item.path : location.pathname.startsWith(item.path); + return ( + + {item.icon} + + + ); + })} + + + ); + })} + + + + + + + + setMenuAnchor(event.currentTarget)}> + {initials} + + setMenuAnchor(null)}> + + + + {user?.fullName} + + + {user?.email} + + + + + Sign out + + + + + + + + + ); +} diff --git a/client/src/main.tsx b/client/src/main.tsx new file mode 100644 index 0000000..1374365 --- /dev/null +++ b/client/src/main.tsx @@ -0,0 +1,17 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import './index.css'; +import App from './App.tsx'; + +const queryClient = new QueryClient({ + defaultOptions: { queries: { retry: 1, refetchOnWindowFocus: false } }, +}); + +createRoot(document.getElementById('root')!).render( + + + + + , +); diff --git a/client/src/routes/AppRouter.tsx b/client/src/routes/AppRouter.tsx new file mode 100644 index 0000000..ae5f513 --- /dev/null +++ b/client/src/routes/AppRouter.tsx @@ -0,0 +1,111 @@ +import { Navigate, Route, Routes } from 'react-router-dom'; +import { MainLayout } from '../layouts/MainLayout'; +import { ProtectedRoute } from './ProtectedRoute'; +import { HandoffPage } from '../features/auth/HandoffPage'; +import { DashboardPage } from '../features/dashboard/DashboardPage'; +import { ReportsPage } from '../features/reports/ReportsPage'; +import { JournalEntryListPage } from '../features/gl/JournalEntryListPage'; +import { JournalEntryFormPage } from '../features/gl/JournalEntryFormPage'; +import { JournalEntryDetailPage } from '../features/gl/JournalEntryDetailPage'; +import { AdminSegmentsPage } from '../features/admin/segments/AdminSegmentsPage'; +import { AdminChartOfAccountsPage } from '../features/admin/coa/AdminChartOfAccountsPage'; +import { AdminJournalsPage } from '../features/admin/journals/AdminJournalsPage'; +import { AdminFiscalYearsPage } from '../features/admin/fiscal/AdminFiscalYearsPage'; +import { AdminUsersPage } from '../features/admin/users/AdminUsersPage'; +import { AdminTaxCodesPage } from '../features/admin/tax/AdminTaxCodesPage'; +import { CustomersListPage } from '../features/ar/customers/CustomersListPage'; +import { CustomerDetailPage } from '../features/ar/customers/CustomerDetailPage'; +import { InvoicesListPage } from '../features/ar/invoices/InvoicesListPage'; +import { InvoiceFormPage } from '../features/ar/invoices/InvoiceFormPage'; +import { InvoiceDetailPage } from '../features/ar/invoices/InvoiceDetailPage'; +import { CreditNoteFormPage } from '../features/ar/creditNotes/CreditNoteFormPage'; +import { CreditNoteDetailPage } from '../features/ar/creditNotes/CreditNoteDetailPage'; +import { ReceiptsListPage } from '../features/ar/receipts/ReceiptsListPage'; +import { ReceiptFormPage } from '../features/ar/receipts/ReceiptFormPage'; +import { ReceiptDetailPage } from '../features/ar/receipts/ReceiptDetailPage'; +import { SuppliersListPage } from '../features/ap/suppliers/SuppliersListPage'; +import { SupplierDetailPage } from '../features/ap/suppliers/SupplierDetailPage'; +import { InvoicesListPage as APInvoicesListPage } from '../features/ap/invoices/InvoicesListPage'; +import { InvoiceFormPage as APInvoiceFormPage } from '../features/ap/invoices/InvoiceFormPage'; +import { InvoiceDetailPage as APInvoiceDetailPage } from '../features/ap/invoices/InvoiceDetailPage'; +import { DebitNoteFormPage } from '../features/ap/debitNotes/DebitNoteFormPage'; +import { DebitNoteDetailPage } from '../features/ap/debitNotes/DebitNoteDetailPage'; +import { PaymentsListPage } from '../features/ap/payments/PaymentsListPage'; +import { PaymentFormPage } from '../features/ap/payments/PaymentFormPage'; +import { PaymentDetailPage } from '../features/ap/payments/PaymentDetailPage'; + +export function AppRouter() { + return ( + + } /> + + }> + }> + } /> + } /> + + } /> + } /> + }> + } /> + + + }> + } /> + + }> + } /> + + }> + } /> + + }> + } /> + + }> + } /> + + }> + } /> + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + }> + } /> + + }> + } /> + + }> + } /> + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + }> + } /> + + }> + } /> + + }> + } /> + + + + + } /> + + ); +} diff --git a/client/src/routes/ProtectedRoute.tsx b/client/src/routes/ProtectedRoute.tsx new file mode 100644 index 0000000..f9e71cf --- /dev/null +++ b/client/src/routes/ProtectedRoute.tsx @@ -0,0 +1,36 @@ +import { useEffect } from 'react'; +import { Outlet } from 'react-router-dom'; +import { Alert, Box, CircularProgress } from '@mui/material'; +import { useAuth } from '../hooks/useAuth'; + +interface ProtectedRouteProps { + permission?: string; +} + +const managerUrl = import.meta.env.VITE_MANAGER_URL ?? 'http://localhost:5174'; + +export function ProtectedRoute({ permission }: ProtectedRouteProps) { + const { isAuthenticated, hasPermission } = useAuth(); + + useEffect(() => { + if (!isAuthenticated) { + window.location.href = managerUrl; + } + }, [isAuthenticated]); + + if (!isAuthenticated) { + return ( + + + + ); + } + if (permission && !hasPermission(permission)) { + return ( + + You do not have permission to view this page. + + ); + } + return ; +} diff --git a/client/src/store/authStore.ts b/client/src/store/authStore.ts new file mode 100644 index 0000000..41eb3df --- /dev/null +++ b/client/src/store/authStore.ts @@ -0,0 +1,32 @@ +import { create } from 'zustand'; + +export interface AuthUser { + id: number; + email: string; + fullName?: string; + roles: string[]; + permissions: string[]; + allowedBranchSegmentValueIds: number[] | null; +} + +interface AuthState { + accessToken: string | null; + refreshToken: string | null; + user: AuthUser | null; + setSession: (session: { accessToken: string; refreshToken: string; user: AuthUser }) => void; + setAccessToken: (accessToken: string) => void; + clearSession: () => void; + hasPermission: (permissionKey: string) => boolean; +} + +// Tokens are kept in memory only (not localStorage) to limit XSS exposure — a page reload +// requires signing in again in Phase 1. See the implementation plan §4.5. +export const useAuthStore = create((set, get) => ({ + accessToken: null, + refreshToken: null, + user: null, + setSession: ({ accessToken, refreshToken, user }) => set({ accessToken, refreshToken, user }), + setAccessToken: (accessToken) => set({ accessToken }), + clearSession: () => set({ accessToken: null, refreshToken: null, user: null }), + hasPermission: (permissionKey) => get().user?.permissions.includes(permissionKey) ?? false, +})); diff --git a/client/src/store/branchStore.ts b/client/src/store/branchStore.ts new file mode 100644 index 0000000..cadfe95 --- /dev/null +++ b/client/src/store/branchStore.ts @@ -0,0 +1,25 @@ +import { create } from 'zustand'; +import { persist } from 'zustand/middleware'; + +export type BranchSelection = 'MAIN' | number; + +interface BranchState { + selected: BranchSelection; + setSelected: (selection: BranchSelection) => void; +} + +// Persisted to localStorage — this is just a per-viewer UI convenience (last-selected +// branch), never anything sensitive, so unlike auth tokens it's fine to persist. +export const useBranchStore = create()( + persist( + (set) => ({ + selected: 'MAIN', + setSelected: (selection) => set({ selected: selection }), + }), + { name: 'cfm-branch-selection' }, + ), +); + +export function branchScopeQueryParam(selection: BranchSelection): string { + return selection === 'MAIN' ? 'MAIN' : String(selection); +} diff --git a/client/src/theme.ts b/client/src/theme.ts new file mode 100644 index 0000000..0d07c12 --- /dev/null +++ b/client/src/theme.ts @@ -0,0 +1,58 @@ +import { createTheme } from '@mui/material/styles'; + +// Mirrors temp/mockups/Cross Financial Manage Mockup.png: navy sidebar, blue accent, +// card-based content on a light page background, soft status pills. +export const NAVY = '#0f1d3d'; +export const NAVY_SURFACE = '#152a52'; +export const ACCENT_BLUE = '#2f6fed'; + +export const theme = createTheme({ + palette: { + mode: 'light', + primary: { main: ACCENT_BLUE, dark: '#1f52c4' }, + secondary: { main: '#2e7d32' }, + background: { default: '#f4f6fb', paper: '#ffffff' }, + text: { primary: '#1a2233', secondary: '#64748b' }, + divider: '#e6e9f2', + }, + shape: { borderRadius: 10 }, + typography: { + fontFamily: ['Inter', 'Segoe UI', 'Roboto', 'Helvetica', 'Arial', 'sans-serif'].join(','), + h5: { fontWeight: 700 }, + h6: { fontWeight: 700 }, + subtitle1: { fontWeight: 600 }, + }, + components: { + MuiPaper: { + styleOverrides: { + root: { backgroundImage: 'none' }, + elevation1: { boxShadow: '0 1px 2px rgba(15, 29, 61, 0.06)', border: '1px solid #e6e9f2' }, + }, + }, + MuiCard: { + styleOverrides: { + root: { boxShadow: '0 1px 2px rgba(15, 29, 61, 0.06)', border: '1px solid #e6e9f2' }, + }, + }, + MuiButton: { + styleOverrides: { + root: { textTransform: 'none', fontWeight: 600, borderRadius: 8 }, + }, + }, + MuiChip: { + styleOverrides: { + root: { fontWeight: 600 }, + }, + }, + MuiAppBar: { + styleOverrides: { + root: { boxShadow: 'none', borderBottom: '1px solid #e6e9f2' }, + }, + }, + MuiTableCell: { + styleOverrides: { + head: { fontWeight: 700, color: '#64748b', fontSize: '0.75rem', textTransform: 'uppercase', letterSpacing: 0.4 }, + }, + }, + }, +}); diff --git a/client/src/types/api.ts b/client/src/types/api.ts new file mode 100644 index 0000000..fd2cd24 --- /dev/null +++ b/client/src/types/api.ts @@ -0,0 +1,379 @@ +export type GLAccountType = 'ASSET' | 'LIABILITY' | 'EQUITY' | 'INCOME' | 'EXPENSE'; +export type DebitCredit = 'DEBIT' | 'CREDIT'; +export type ControlAccountType = 'AR' | 'AP' | 'STOCK' | 'TAX_OUTPUT' | 'TAX_INPUT' | 'BANK' | 'RETAINED_EARNINGS'; +export type SegmentFormat = 'NUMERIC' | 'ALPHA' | 'ALPHANUMERIC'; +export type JournalType = 'GENERAL' | 'SALES' | 'PURCHASES' | 'CASH_RECEIPT' | 'CASH_PAYMENT' | 'STOCK' | 'BANK' | 'CUSTOM'; +export type JournalEntryStatus = 'DRAFT' | 'POSTED' | 'REVERSED'; +export type ARDocumentStatus = 'DRAFT' | 'POSTED' | 'VOID'; +export type APDocumentStatus = 'DRAFT' | 'POSTED' | 'VOID'; + +export interface AccountSegmentValue { + id: number; + segmentDefId: number; + code: string; + description: string; + isActive: boolean; +} + +export interface AccountSegmentDefinition { + id: number; + segmentKey: string; + label: string; + order: number; + length: number; + format: SegmentFormat; + isBranchSegment: boolean; + isActive: boolean; + values: AccountSegmentValue[]; +} + +export interface GLAccountSegmentValue { + segmentDefId: number; + segmentValueId: number; + segmentValue: AccountSegmentValue; + segmentDef: AccountSegmentDefinition; +} + +export interface GLAccount { + id: number; + accountCode: string; + accountName: string; + accountType: GLAccountType; + normalBalance: DebitCredit; + isControlAccount: boolean; + controlType: ControlAccountType | null; + isActive: boolean; + isPostable: boolean; + segmentValues: GLAccountSegmentValue[]; +} + +export interface Journal { + id: number; + code: string; + name: string; + journalType: JournalType; + defaultBranchSegmentValueId: number | null; + isActive: boolean; +} + +export interface JournalEntryLine { + id: number; + journalEntryId: number; + lineNumber: number; + glAccountId: number; + glAccount: GLAccount; + debit: string; + credit: string; + description: string | null; + branchSegmentValueId: number | null; +} + +export interface JournalEntry { + id: number; + entryNumber: string; + journalId: number; + journal: Journal; + entryDate: string; + description: string; + status: JournalEntryStatus; + totalDebits: string; + totalCredits: string; + createdAt: string; + lines: JournalEntryLine[]; +} + +export interface FiscalPeriod { + id: number; + periodNumber: number; + startDate: string; + endDate: string; + status: 'OPEN' | 'CLOSED'; +} + +export interface FiscalYear { + id: number; + year: number; + startDate: string; + endDate: string; + status: 'OPEN' | 'LOCKED' | 'CLOSED'; + periods: FiscalPeriod[]; +} + +export interface Role { + id: number; + name: string; + permissions: { permission: { id: number; key: string } }[]; +} + +export interface Permission { + id: number; + key: string; +} + +export interface TaxCode { + id: number; + code: string; + name: string; + ratePercent: string; + isActive: boolean; +} + +export interface Customer { + id: number; + code: string; + name: string; + email: string | null; + phone: string | null; + address: string | null; + taxNumber: string | null; + branchSegmentValueId: number; + creditLimit: string; + paymentTermsDays: number; + isActive: boolean; + createdAt: string; +} + +export interface ARInvoiceLine { + id: number; + invoiceId: number; + lineNumber: number; + description: string; + quantity: string; + unitPrice: string; + revenueGLAccountId: number; + revenueGLAccount?: GLAccount; + taxCodeId: number | null; + taxCode?: TaxCode | null; + lineSubtotal: string; + lineTax: string; + lineTotal: string; +} + +export interface ARAllocation { + id: number; + invoiceId: number; + invoice?: ARInvoice; + receiptId: number | null; + receipt?: ARReceipt | null; + creditNoteId: number | null; + creditNote?: ARCreditNote | null; + amount: string; + allocatedAt: string; +} + +export interface ARInvoice { + id: number; + invoiceNumber: string; + customerId: number; + customer?: Customer; + branchSegmentValueId: number; + invoiceDate: string; + dueDate: string; + reference: string | null; + status: ARDocumentStatus; + subtotal: string; + taxTotal: string; + total: string; + balance: string; + journalEntryId: number | null; + lines: ARInvoiceLine[]; + allocations?: ARAllocation[]; + createdAt: string; +} + +export interface ARCreditNoteLine { + id: number; + creditNoteId: number; + lineNumber: number; + description: string; + quantity: string; + unitPrice: string; + revenueGLAccountId: number; + revenueGLAccount?: GLAccount; + taxCodeId: number | null; + taxCode?: TaxCode | null; + lineSubtotal: string; + lineTax: string; + lineTotal: string; +} + +export interface ARCreditNote { + id: number; + creditNoteNumber: string; + customerId: number; + customer?: Customer; + branchSegmentValueId: number; + creditNoteDate: string; + reference: string | null; + reason: string | null; + status: ARDocumentStatus; + subtotal: string; + taxTotal: string; + total: string; + balance: string; + journalEntryId: number | null; + lines: ARCreditNoteLine[]; + allocations?: ARAllocation[]; + createdAt: string; +} + +export interface ARReceipt { + id: number; + receiptNumber: string; + customerId: number; + customer?: Customer; + branchSegmentValueId: number; + receiptDate: string; + amount: string; + unallocatedAmount: string; + bankGLAccountId: number; + bankGLAccount?: GLAccount; + reference: string | null; + status: ARDocumentStatus; + journalEntryId: number | null; + allocations?: ARAllocation[]; + createdAt: string; +} + +export interface CustomerDetail { + customer: Customer; + invoices: ARInvoice[]; + creditNotes: ARCreditNote[]; + receipts: ARReceipt[]; + outstandingBalance: number; + overdueBalance: number; +} + +export interface Supplier { + id: number; + code: string; + name: string; + email: string | null; + phone: string | null; + address: string | null; + taxNumber: string | null; + branchSegmentValueId: number; + paymentTermsDays: number; + isActive: boolean; + createdAt: string; +} + +export interface APInvoiceLine { + id: number; + invoiceId: number; + lineNumber: number; + description: string; + quantity: string; + unitPrice: string; + expenseGLAccountId: number; + expenseGLAccount?: GLAccount; + taxCodeId: number | null; + taxCode?: TaxCode | null; + lineSubtotal: string; + lineTax: string; + lineTotal: string; +} + +export interface APAllocation { + id: number; + invoiceId: number; + invoice?: APInvoice; + paymentId: number | null; + payment?: APPayment | null; + debitNoteId: number | null; + debitNote?: APDebitNote | null; + amount: string; + allocatedAt: string; +} + +export interface APInvoice { + id: number; + invoiceNumber: string; + supplierReference: string | null; + supplierId: number; + supplier?: Supplier; + branchSegmentValueId: number; + invoiceDate: string; + dueDate: string; + status: APDocumentStatus; + subtotal: string; + taxTotal: string; + total: string; + balance: string; + journalEntryId: number | null; + lines: APInvoiceLine[]; + allocations?: APAllocation[]; + createdAt: string; +} + +export interface APDebitNoteLine { + id: number; + debitNoteId: number; + lineNumber: number; + description: string; + quantity: string; + unitPrice: string; + expenseGLAccountId: number; + expenseGLAccount?: GLAccount; + taxCodeId: number | null; + taxCode?: TaxCode | null; + lineSubtotal: string; + lineTax: string; + lineTotal: string; +} + +export interface APDebitNote { + id: number; + debitNoteNumber: string; + supplierId: number; + supplier?: Supplier; + branchSegmentValueId: number; + debitNoteDate: string; + reference: string | null; + reason: string | null; + status: APDocumentStatus; + subtotal: string; + taxTotal: string; + total: string; + balance: string; + journalEntryId: number | null; + lines: APDebitNoteLine[]; + allocations?: APAllocation[]; + createdAt: string; +} + +export interface APPayment { + id: number; + paymentNumber: string; + supplierId: number; + supplier?: Supplier; + branchSegmentValueId: number; + paymentDate: string; + amount: string; + unallocatedAmount: string; + bankGLAccountId: number; + bankGLAccount?: GLAccount; + reference: string | null; + status: APDocumentStatus; + journalEntryId: number | null; + allocations?: APAllocation[]; + createdAt: string; +} + +export interface SupplierDetail { + supplier: Supplier; + invoices: APInvoice[]; + debitNotes: APDebitNote[]; + payments: APPayment[]; + outstandingBalance: number; + overdueBalance: number; +} + +export interface AppUser { + id: number; + email: string; + fullName: string; + isActive: boolean; + roles: { role: Role }[]; + branchRestrictions: { branchSegmentValueId: number }[]; +} diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json new file mode 100644 index 0000000..6830b6f --- /dev/null +++ b/client/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "allowArbitraryExtensions": true, + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 0000000..8455dcb --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "module": "nodenext", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000..9982072 --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,7 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..2da0204 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,10 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + rootDir: '.', + testMatch: ['/tests/unit/**/*.spec.ts'], + modulePathIgnorePatterns: ['/client/', '/manager/'], + setupFilesAfterEnv: [], + clearMocks: true, +}; diff --git a/jest.integration.config.js b/jest.integration.config.js new file mode 100644 index 0000000..a09460e --- /dev/null +++ b/jest.integration.config.js @@ -0,0 +1,9 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + rootDir: '.', + testMatch: ['/tests/integration/**/*.spec.ts'], + modulePathIgnorePatterns: ['/client/', '/manager/'], + clearMocks: true, +}; diff --git a/manager/.env.example b/manager/.env.example new file mode 100644 index 0000000..c0c9f89 --- /dev/null +++ b/manager/.env.example @@ -0,0 +1,30 @@ +DATABASE_URL="postgresql://USER:PASSWORD@localhost:5432/cfm_manager?schema=public" +PORT="5100" + +# Manager-internal session tokens (Person sessions on the Manager app itself — never leave the Manager) +JWT_ACCESS_SECRET="change-me-access-secret" +JWT_REFRESH_SECRET="change-me-refresh-secret" +JWT_ACCESS_TTL="15m" +JWT_REFRESH_TTL="7d" + +# RS256 keypair used to sign/verify handoff tokens. Generate once with: +# openssl genrsa -out manager/keys/handoff-private.pem 2048 +# openssl rsa -in manager/keys/handoff-private.pem -pubout -out manager/keys/handoff-public.pem +# Both files are gitignored. Every company app is given a copy of the PUBLIC key only. +HANDOFF_PRIVATE_KEY_PATH="./keys/handoff-private.pem" +HANDOFF_PUBLIC_KEY_PATH="./keys/handoff-public.pem" +HANDOFF_TOKEN_TTL_SECONDS="90" + +TOTP_ISSUER="Cross Financial Manager" + +GOOGLE_CLIENT_ID="" +GOOGLE_CLIENT_SECRET="" +GOOGLE_REDIRECT_URI="http://localhost:5100/api/auth/oauth/google/callback" + +MICROSOFT_CLIENT_ID="" +MICROSOFT_CLIENT_SECRET="" +MICROSOFT_TENANT="common" +MICROSOFT_REDIRECT_URI="http://localhost:5100/api/auth/oauth/microsoft/callback" + +# Where the Manager's own frontend lives, used to build OAuth-return / redirect URLs +MANAGER_WEB_URL="http://localhost:5174" diff --git a/manager/.eslintrc.json b/manager/.eslintrc.json new file mode 100644 index 0000000..1b11a27 --- /dev/null +++ b/manager/.eslintrc.json @@ -0,0 +1,21 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "env": { + "node": true, + "es2022": true, + "jest": true + }, + "rules": { + "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }] + } +} diff --git a/manager/.gitignore b/manager/.gitignore new file mode 100644 index 0000000..fd32dd5 --- /dev/null +++ b/manager/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +dist/ +.env +*.log +coverage/ +keys/ +client/node_modules/ +client/dist/ diff --git a/manager/SETUP.md b/manager/SETUP.md new file mode 100644 index 0000000..d27ba31 --- /dev/null +++ b/manager/SETUP.md @@ -0,0 +1,38 @@ +# Setup — Account Manager (Phase A) + +## Prerequisites +- Node.js 18+ (tested on v22) +- A reachable PostgreSQL 15+ database, separate from any company app's database +- The company app checked out as a sibling (`../` from this directory) — Phase A wires this + Manager to exactly one manually-provisioned company + +## First-time setup +1. `npm install` +2. `npm run generate-handoff-keys` — generates `keys/handoff-private.pem` (kept here, gitignored, + never shared) and `keys/handoff-public.pem` (copy this into every company app's + `keys/handoff-public.pem`, referenced by its `HANDOFF_PUBLIC_KEY_PATHS`). +3. Copy `.env.example` to `.env`, fill in a real `DATABASE_URL`, random JWT secrets, and (optional + for now) Google/Microsoft OAuth credentials. +4. `npm run prisma:migrate` then `npm run prisma:seed` — seeds one operator `Person` + (`joosth2002@icloud.com` / `ChangeMe123!` — change this) and one `Company` row pointing at the + company app on `http://localhost:5173` (the frontend, since `/handoff` is a frontend route). +5. `npm run dev` — API on `http://localhost:5100`. +6. `cd client && npm install && npm run dev` — Manager frontend on `http://localhost:5174`. + +## Verifying it works +- `npm test` — unit tests (handoff token sign/verify, tampering, expiry — no DB required). +- `npm run test:integration` — against the real Manager DB: login, list companies, issue a + handoff token, reject a handoff to a company with no membership. +- The company app has its own integration test (`../tests/integration/handoff.spec.ts`) that + mints a token with this Manager's real private key and exchanges it against the real company + app DB — proving both sides of the handoff agree, replay is rejected, and a token minted for a + different `companySlug` is rejected there. +- Manual browser smoke: with both this Manager (`5100`/`5174`) and the company app (`5000`/`5173`) + running, open `http://localhost:5174`, sign in with the seeded operator, pick "Demo Company," + and confirm you land inside the company app already authenticated (and that + `http://localhost:5173/login` no longer exists — it's `/handoff` now). +- `GET /health` — basic liveness check. + +## Adding a second company (still manual in Phase A) +Phase B automates this. Until then: stand up another copy of the company app on a different +port/database by hand, then insert matching `Company` and `PersonCompanyMembership` rows here. diff --git a/manager/client/.env.example b/manager/client/.env.example new file mode 100644 index 0000000..528603d --- /dev/null +++ b/manager/client/.env.example @@ -0,0 +1 @@ +VITE_API_BASE_URL="http://localhost:5100/api" diff --git a/manager/client/.gitignore b/manager/client/.gitignore new file mode 100644 index 0000000..438657a --- /dev/null +++ b/manager/client/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +.env + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/manager/client/.oxlintrc.json b/manager/client/.oxlintrc.json new file mode 100644 index 0000000..6fa991d --- /dev/null +++ b/manager/client/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "typescript", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/manager/client/README.md b/manager/client/README.md new file mode 100644 index 0000000..d6af7e3 --- /dev/null +++ b/manager/client/README.md @@ -0,0 +1,32 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the Oxlint configuration + +If you are developing a production application, we recommend enabling type-aware lint rules by installing `oxlint-tsgolint` and editing `.oxlintrc.json`: + +```json +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "typescript", "oxc"], + "options": { + "typeAware": true + }, + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} +``` + +See the [Oxlint rules documentation](https://oxc.rs/docs/guide/usage/linter/rules) for the full list of rules and categories. diff --git a/manager/client/index.html b/manager/client/index.html new file mode 100644 index 0000000..6476681 --- /dev/null +++ b/manager/client/index.html @@ -0,0 +1,13 @@ + + + + + + + Cross Financial Manager — Account Manager + + +
+ + + diff --git a/manager/client/package-lock.json b/manager/client/package-lock.json new file mode 100644 index 0000000..c5ce6a6 --- /dev/null +++ b/manager/client/package-lock.json @@ -0,0 +1,2663 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/material": "^9.4.0", + "@tanstack/react-query": "^5.102.8", + "axios": "^1.20.0", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.3", + "zustand": "^5.0.15" + }, + "devDependencies": { + "@types/node": "^24.13.3", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.1.0", + "oxlint": "^1.79.0", + "typescript": "~6.0.2", + "vite": "^8.2.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.4.0.tgz", + "integrity": "sha512-d+gIYM1raJP87yrVQcVg+Q3vycVMArMkgu/TjJLi2vTvO9FHKWNRR1xs9nnN4eLpM9nGxxm02UMvc9BrmcUKvQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.4.0.tgz", + "integrity": "sha512-6KKUIvkQ2r/s48s9VZV9JEZ1W2dRa7RndVsF+Ipx4CYxDOQeozeRsS5r9NiheFf8A5hpbqJJIGoX7hjg5X4XUw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/core-downloads-tracker": "^9.4.0", + "@mui/system": "^9.4.0", + "@mui/types": "^9.4.0", + "@mui/utils": "^9.4.0", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.8", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^9.4.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.4.0.tgz", + "integrity": "sha512-qQpX/2XPGDz5F2OIWzo4kkorURlDeXGKytRQudXCdLS5TuwKsMKaZyx77LZEVSB73c7o3UrLWwQ/goRuHBdtjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/utils": "^9.4.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.4.0.tgz", + "integrity": "sha512-SlqVEYqnyEgXMFW4JuIDMelyhKzoWBJ85v2mNCQd0XtU0uk7U9E1zaJZ06XqodhA8oJrb+4Q+3E/JlwBe4jWkw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.4.0.tgz", + "integrity": "sha512-AZz9z13oGS1J0BYeAFHTbV7PegCtPiE/uMEIi7TJ1kTx3Vkt+jUpLyXF/2uV8B6Y79iTh98kVeOH9fX3x3zXXg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/private-theming": "^9.4.0", + "@mui/styled-engine": "^9.4.0", + "@mui/types": "^9.4.0", + "@mui/utils": "^9.4.0", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-9.4.0.tgz", + "integrity": "sha512-13DH0Oniua4WmGqeYbQAZqmiN7r4nfd0zwIoGJ5QeJwyIHgEmf+LkRw/jV1HZb6AiUoHX8Oxf4xgalq3vYHcIw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.4.0.tgz", + "integrity": "sha512-WkzY8uYtqUDyGKPShrRQRBomfMQHddlsyKu/gRRESYO24tDPD2z0xRE8CBoUsWqpBa+YrFs9KixiS7kQRjsPAQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "@mui/types": "^9.4.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.8" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@oxc-project/types": { + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz", + "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.81.0.tgz", + "integrity": "sha512-IcCRsXiedJoJopY6mpZUBEeVFsUrutmrG7dZ87zMuKJlhg70Ora9bBl1WcCxZQtyI10YpnVdEso5oCg7YcfSHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.81.0.tgz", + "integrity": "sha512-GRrIPyTGVhx3L3h+0T5xT2A0jFAcdPv4+IfuXpGDLIdl6XeYhgg/zw72A5ILZoUgRqZuM8F1y+V/gfDriXSxzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.81.0.tgz", + "integrity": "sha512-qNQ9tXRgLuKbqSV1S2h9h4KPHjbovO7RRR2/enUOtHzTkFZ7B9X5zqqHJua8dRyc7dBy7Aoyq5pqTSLFVcAzGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.81.0.tgz", + "integrity": "sha512-q0QTm32jWga2Gv4j7IaVZN0jYMi9UV73sWVgFtDA4iIfqwMCLLZ3ve+9KwfYtsaKZSgQhmPaogeZWqDZpcY1Pw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.81.0.tgz", + "integrity": "sha512-/+8wVWDXEC7wHVAhOc59Fw/SkMc1arLkFD8iQCaSsmzenK1X4doFqquL9H1wrtGUzaiycVqkf/sSpcILK6W1UA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.81.0.tgz", + "integrity": "sha512-4xt422FEgioRq9hAL4Tq7fujGUWnc8z1BJ+Oi8RN8vB8axaP+sdK6a2xdlcQCCYnJg9QMuMFS0AucuIFx/EacA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.81.0.tgz", + "integrity": "sha512-u3vna8KdGplH4DRCW9K54D68fcMo7IxVrkCJWwXnIhwtBdnDnYrmzOUA/XjmBlPpcLsgw9Z5BNdY4za9+Dj+MQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.81.0.tgz", + "integrity": "sha512-3j9k+gsYsE7nv71GWotXsqsa2l9/aJenD7dVHNt/CBvsb0SgRjSMnHFeP59IXUAl1wvVFhqGl2wJNMwWU3UBlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.81.0.tgz", + "integrity": "sha512-k5iAp3dNxW0/uDCBY+WSm8jKB2szu7SkEQZdgRRpDXvuDd69vvDcqhB3A/pWCfCwXyenjNjFn9Td1fVoyAc+Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.81.0.tgz", + "integrity": "sha512-TFqLja3uYmVSte6nof9GWrex9Z8WgdZrNiLC6Te5rXGDqXB2y4j/26iFhwosXiAFqDhE9JJVuuCkDKLwptTn1g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.81.0.tgz", + "integrity": "sha512-UEcySvGS0NOVo7h7n7CYyJL9+6gFAh7Zc/ToDXVScFvzHSTIxtzkMVU30rmQ6+nQ1LF+UdiRDdJajpDu+OylLg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.81.0.tgz", + "integrity": "sha512-H+diDbhD00+wI1IRP8Kz88x/lat+DgtoBJzoTthS16xkTJGNaEkfb8gzmd1rzc/2uDQQMl7GNl+JFUacVeWxIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.81.0.tgz", + "integrity": "sha512-8znJ/5TekjOKg1j1Acho4PJMdiAHLtlcXuWEiipOhAMV6rQcXdmDdXCbheyDczN6TjBwiNfjcP81k4AthrKRzw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.81.0.tgz", + "integrity": "sha512-Q2Wj70yFsvn5QjlmifFzbj4H+kJy53bwqc41o1fzoM7MpLV1NIbhg/LpWXRfC6KOkSAdUx1Wd8VJsdPmhp/HRA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.81.0.tgz", + "integrity": "sha512-cPInHp/ddEe5qkyK2IiyQ8Q3Mp2oLLEhhsGgTK2oZx4L6+llGam1H1yBvJZ7qHfOXj8N3hxBS8sj4tO+gtFlIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.81.0.tgz", + "integrity": "sha512-0CQxSX4ajqm07AHBf5U33qQzXKdd7wtq/oTL/7vpY6RNNuxrRi8W4bqUV1Jyu/vj+9KmxQyDhxfeVX1nQL6kfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.81.0.tgz", + "integrity": "sha512-l0hbeISm9673hVrrQU8j/p2M7YH9Ouoj7p7E/QM55NTrKVLP+P3PF8hLu+OY+x0VtGRW+ggiQKZqmdYps9H+TA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.81.0.tgz", + "integrity": "sha512-ksqPP5jbFXcYreEQ7zdJh06rJQBymCTyGRCdaXjfcf2aG4f8KxUWY5wcgYHmaTK+FJ4bPG5sUAdOX+6trnH1JA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.81.0.tgz", + "integrity": "sha512-IZuUCwGw9emG5JtCp+fYGB+Z4OWEoeEcM8R5BA1pYw63/ieYFVdcU2ylxTpHbVHSenZnsYE+ZZ20uHAJszQ4cA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", + "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz", + "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", + "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", + "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz", + "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz", + "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", + "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", + "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz", + "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz", + "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", + "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", + "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz", + "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", + "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", + "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tanstack/query-core": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.8.tgz", + "integrity": "sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.102.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.8.tgz", + "integrity": "sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.102.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oxlint": { + "version": "1.81.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.81.0.tgz", + "integrity": "sha512-HyrJYqeoOCL0iqaLEzGewGT48ZX99P3hxYh8udAF9RGGIghSamkXE4ClUyBpEDNqasamThgmlPbuMOe7SAZmHg==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/oxc-project" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.81.0", + "@oxlint/binding-android-arm64": "1.81.0", + "@oxlint/binding-darwin-arm64": "1.81.0", + "@oxlint/binding-darwin-x64": "1.81.0", + "@oxlint/binding-freebsd-x64": "1.81.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.81.0", + "@oxlint/binding-linux-arm-musleabihf": "1.81.0", + "@oxlint/binding-linux-arm64-gnu": "1.81.0", + "@oxlint/binding-linux-arm64-musl": "1.81.0", + "@oxlint/binding-linux-ppc64-gnu": "1.81.0", + "@oxlint/binding-linux-riscv64-gnu": "1.81.0", + "@oxlint/binding-linux-riscv64-musl": "1.81.0", + "@oxlint/binding-linux-s390x-gnu": "1.81.0", + "@oxlint/binding-linux-x64-gnu": "1.81.0", + "@oxlint/binding-linux-x64-musl": "1.81.0", + "@oxlint/binding-openharmony-arm64": "1.81.0", + "@oxlint/binding-win32-arm64-msvc": "1.81.0", + "@oxlint/binding-win32-ia32-msvc": "1.81.0", + "@oxlint/binding-win32-x64-msvc": "1.81.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-is": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT" + }, + "node_modules/react-router": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.3.tgz", + "integrity": "sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.3.tgz", + "integrity": "sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz", + "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.148.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.7", + "@rolldown/binding-android-arm64": "1.2.7", + "@rolldown/binding-darwin-arm64": "1.2.7", + "@rolldown/binding-darwin-x64": "1.2.7", + "@rolldown/binding-freebsd-x64": "1.2.7", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", + "@rolldown/binding-linux-arm64-gnu": "1.2.7", + "@rolldown/binding-linux-arm64-musl": "1.2.7", + "@rolldown/binding-linux-ppc64-gnu": "1.2.7", + "@rolldown/binding-linux-s390x-gnu": "1.2.7", + "@rolldown/binding-linux-x64-gnu": "1.2.7", + "@rolldown/binding-linux-x64-musl": "1.2.7", + "@rolldown/binding-openharmony-arm64": "1.2.7", + "@rolldown/binding-win32-arm64-msvc": "1.2.7", + "@rolldown/binding-win32-x64-msvc": "1.2.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zustand": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.15.tgz", + "integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/manager/client/package.json b/manager/client/package.json new file mode 100644 index 0000000..8f87e4b --- /dev/null +++ b/manager/client/package.json @@ -0,0 +1,32 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/material": "^9.4.0", + "@tanstack/react-query": "^5.102.8", + "axios": "^1.20.0", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.3", + "zustand": "^5.0.15" + }, + "devDependencies": { + "@types/node": "^24.13.3", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@vitejs/plugin-react": "^6.1.0", + "oxlint": "^1.79.0", + "typescript": "~6.0.2", + "vite": "^8.2.2" + } +} diff --git a/manager/client/public/favicon.svg b/manager/client/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/manager/client/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/manager/client/public/icons.svg b/manager/client/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/manager/client/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/manager/client/src/App.tsx b/manager/client/src/App.tsx new file mode 100644 index 0000000..98e26ef --- /dev/null +++ b/manager/client/src/App.tsx @@ -0,0 +1,15 @@ +import { BrowserRouter } from 'react-router-dom'; +import { ThemeProvider, CssBaseline } from '@mui/material'; +import { theme } from './theme'; +import { AppRouter } from './routes/AppRouter'; + +export default function App() { + return ( + + + + + + + ); +} diff --git a/manager/client/src/api/auth.api.ts b/manager/client/src/api/auth.api.ts new file mode 100644 index 0000000..1857e87 --- /dev/null +++ b/manager/client/src/api/auth.api.ts @@ -0,0 +1,39 @@ +import { apiClient } from './client'; +import type { AuthPerson } from '../store/authStore'; + +export type LoginResult = + | { requiresTwoFactor: true; twoFactorToken: string } + | { requiresTwoFactor: false; accessToken: string; refreshToken: string; person: AuthPerson }; + +export async function login(email: string, password: string): Promise { + const response = await apiClient.post('/auth/login', { email, password }); + return response.data; +} + +export async function verifyTwoFactor(twoFactorToken: string, code: string) { + const response = await apiClient.post<{ accessToken: string; refreshToken: string; person: AuthPerson }>( + '/auth/2fa/verify', + { twoFactorToken, code }, + ); + return response.data; +} + +export async function fetchMe(): Promise { + const response = await apiClient.get<{ person: AuthPerson }>('/auth/me'); + return response.data.person; +} + +export async function enrollTwoFactor() { + const response = await apiClient.post<{ secret: string; otpauthUrl: string }>('/auth/2fa/enroll'); + return response.data; +} + +export async function enableTwoFactor(code: string) { + const response = await apiClient.post<{ backupCodes: string[] }>('/auth/2fa/enable', { code }); + return response.data; +} + +const apiBaseUrl = import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:5100/api'; + +export const googleLoginUrl = `${apiBaseUrl}/auth/oauth/google`; +export const microsoftLoginUrl = `${apiBaseUrl}/auth/oauth/microsoft`; diff --git a/manager/client/src/api/client.ts b/manager/client/src/api/client.ts new file mode 100644 index 0000000..359d8d7 --- /dev/null +++ b/manager/client/src/api/client.ts @@ -0,0 +1,53 @@ +import axios, { type AxiosError, type InternalAxiosRequestConfig } from 'axios'; +import { useAuthStore } from '../store/authStore'; + +const baseURL = import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:5100/api'; + +export const apiClient = axios.create({ baseURL }); + +apiClient.interceptors.request.use((config: InternalAxiosRequestConfig) => { + const { accessToken } = useAuthStore.getState(); + if (accessToken) { + config.headers.set('Authorization', `Bearer ${accessToken}`); + } + return config; +}); + +let refreshInFlight: Promise | null = null; + +async function refreshAccessToken(): Promise { + const { refreshToken, setAccessToken, clearSession } = useAuthStore.getState(); + if (!refreshToken) { + clearSession(); + throw new Error('No refresh token available'); + } + try { + const response = await axios.post<{ accessToken: string }>(`${baseURL}/auth/refresh`, { refreshToken }); + setAccessToken(response.data.accessToken); + return response.data.accessToken; + } catch (error) { + clearSession(); + throw error; + } +} + +apiClient.interceptors.response.use( + (response) => response, + async (error: AxiosError) => { + const originalRequest = error.config as (InternalAxiosRequestConfig & { _retried?: boolean }) | undefined; + if (error.response?.status === 401 && originalRequest && !originalRequest._retried) { + originalRequest._retried = true; + try { + refreshInFlight ??= refreshAccessToken().finally(() => { + refreshInFlight = null; + }); + const accessToken = await refreshInFlight; + originalRequest.headers.set('Authorization', `Bearer ${accessToken}`); + return apiClient(originalRequest); + } catch { + return Promise.reject(error); + } + } + return Promise.reject(error); + }, +); diff --git a/manager/client/src/api/companies.api.ts b/manager/client/src/api/companies.api.ts new file mode 100644 index 0000000..ff7b486 --- /dev/null +++ b/manager/client/src/api/companies.api.ts @@ -0,0 +1,18 @@ +import { apiClient } from './client'; + +export interface MyCompany { + companyId: number; + name: string; + slug: string; + status: 'PROVISIONING' | 'ACTIVE' | 'STOPPED' | 'FAILED' | 'DECOMMISSIONED'; +} + +export async function fetchMyCompanies(): Promise { + const response = await apiClient.get('/companies'); + return response.data; +} + +export async function requestHandoff(companyId: number): Promise<{ token: string; redirectUrl: string }> { + const response = await apiClient.post<{ token: string; redirectUrl: string }>(`/companies/${companyId}/handoff`); + return response.data; +} diff --git a/manager/client/src/features/auth/LoginPage.tsx b/manager/client/src/features/auth/LoginPage.tsx new file mode 100644 index 0000000..9771b8e --- /dev/null +++ b/manager/client/src/features/auth/LoginPage.tsx @@ -0,0 +1,66 @@ +import { useState } from 'react'; +import { Navigate, useNavigate } from 'react-router-dom'; +import { Alert, Box, Button, Divider, Paper, Stack, TextField, Typography } from '@mui/material'; +import { useAuth } from '../../hooks/useAuth'; +import { googleLoginUrl, microsoftLoginUrl } from '../../api/auth.api'; + +export function LoginPage() { + const { isAuthenticated, login, isLoggingIn, loginError } = useAuth(); + const navigate = useNavigate(); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + + if (isAuthenticated) { + return ; + } + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + try { + const result = await login({ email, password }); + if (result.requiresTwoFactor) { + navigate('/2fa', { state: { twoFactorToken: result.twoFactorToken } }); + } else { + navigate('/companies'); + } + } catch { + // surfaced via loginError below + } + }; + + return ( + + + + Cross Financial Manager + + + Sign in to continue + + {loginError && ( + + Invalid email or password + + )} + + setEmail(e.target.value)} /> + setPassword(e.target.value)} /> + + + + or continue with + + + + + + + + ); +} diff --git a/manager/client/src/features/auth/OAuthCallbackPage.tsx b/manager/client/src/features/auth/OAuthCallbackPage.tsx new file mode 100644 index 0000000..364f4f8 --- /dev/null +++ b/manager/client/src/features/auth/OAuthCallbackPage.tsx @@ -0,0 +1,59 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { Alert, Box, CircularProgress, Typography } from '@mui/material'; +import { fetchMe } from '../../api/auth.api'; +import { useAuthStore } from '../../store/authStore'; + +/** + * The Manager's own Google/Microsoft OAuth callback lands here (redirected by the backend + * after it exchanges the provider's code) carrying either a full session or a 2FA challenge. + */ +export function OAuthCallbackPage() { + const [searchParams] = useSearchParams(); + const navigate = useNavigate(); + const { setAccessToken, setSession } = useAuthStore(); + const [error, setError] = useState(null); + const attempted = useRef(false); + + useEffect(() => { + if (attempted.current) return; + attempted.current = true; + + const twoFactorToken = searchParams.get('twoFactorToken'); + if (twoFactorToken) { + navigate('/2fa', { state: { twoFactorToken }, replace: true }); + return; + } + + const accessToken = searchParams.get('accessToken'); + const refreshToken = searchParams.get('refreshToken'); + if (!accessToken || !refreshToken) { + setError('Sign-in did not complete. Please try again.'); + return; + } + + setAccessToken(accessToken); + fetchMe() + .then((person) => { + setSession({ accessToken, refreshToken, person }); + navigate('/companies', { replace: true }); + }) + .catch(() => setError('Sign-in did not complete. Please try again.')); + }, [searchParams, navigate, setAccessToken, setSession]); + + return ( + + {!error && ( + <> + + Completing sign-in… + + )} + {error && ( + + {error} + + )} + + ); +} diff --git a/manager/client/src/features/auth/SecuritySettingsPage.tsx b/manager/client/src/features/auth/SecuritySettingsPage.tsx new file mode 100644 index 0000000..991b7af --- /dev/null +++ b/manager/client/src/features/auth/SecuritySettingsPage.tsx @@ -0,0 +1,75 @@ +import { useState } from 'react'; +import { Alert, Box, Button, Container, Paper, Stack, TextField, Typography } from '@mui/material'; +import { useMutation } from '@tanstack/react-query'; +import { enableTwoFactor, enrollTwoFactor } from '../../api/auth.api'; + +export function SecuritySettingsPage() { + const [otpauthUrl, setOtpauthUrl] = useState(null); + const [secret, setSecret] = useState(null); + const [code, setCode] = useState(''); + const [backupCodes, setBackupCodes] = useState(null); + + const enrollMutation = useMutation({ + mutationFn: enrollTwoFactor, + onSuccess: (result) => { + setOtpauthUrl(result.otpauthUrl); + setSecret(result.secret); + }, + }); + + const enableMutation = useMutation({ + mutationFn: (enteredCode: string) => enableTwoFactor(enteredCode), + onSuccess: (result) => setBackupCodes(result.backupCodes), + }); + + return ( + + + Two-factor authentication + + + {!otpauthUrl && !backupCodes && ( + + )} + + {otpauthUrl && !backupCodes && ( + + + Add this account to your authenticator app, either by scanning a QR code for this URL or entering the + secret manually, then confirm with a generated code: + + {otpauthUrl} + + Secret: {secret} + + + setCode(e.target.value)} size="small" /> + + + {enableMutation.isError && Invalid code — try again.} + + )} + + {backupCodes && ( + + + Two-factor authentication is enabled. + + + Save these one-time backup codes somewhere safe — each can be used once if you lose access to your + authenticator app: + + + {backupCodes.map((backupCode) => ( +
{backupCode}
+ ))} +
+
+ )} +
+ ); +} diff --git a/manager/client/src/features/auth/TwoFactorChallengePage.tsx b/manager/client/src/features/auth/TwoFactorChallengePage.tsx new file mode 100644 index 0000000..467ddd9 --- /dev/null +++ b/manager/client/src/features/auth/TwoFactorChallengePage.tsx @@ -0,0 +1,60 @@ +import { useState } from 'react'; +import { Navigate, useLocation, useNavigate } from 'react-router-dom'; +import { Alert, Box, Button, Paper, Stack, TextField, Typography } from '@mui/material'; +import { useAuth } from '../../hooks/useAuth'; + +interface LocationState { + twoFactorToken?: string; +} + +export function TwoFactorChallengePage() { + const location = useLocation(); + const navigate = useNavigate(); + const { verifyTwoFactor, isVerifyingTwoFactor, twoFactorError } = useAuth(); + const [code, setCode] = useState(''); + const twoFactorToken = (location.state as LocationState | null)?.twoFactorToken; + + if (!twoFactorToken) { + return ; + } + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + try { + await verifyTwoFactor({ twoFactorToken, code }); + navigate('/companies'); + } catch { + // surfaced via twoFactorError below + } + }; + + return ( + + + + Two-factor verification + + + Enter the 6-digit code from your authenticator app, or one of your backup codes. + + {twoFactorError && ( + + Invalid code + + )} + + setCode(e.target.value)} + autoFocus + inputMode="numeric" + /> + + + + + ); +} diff --git a/manager/client/src/features/companies/CompanyPickerPage.tsx b/manager/client/src/features/companies/CompanyPickerPage.tsx new file mode 100644 index 0000000..b675e69 --- /dev/null +++ b/manager/client/src/features/companies/CompanyPickerPage.tsx @@ -0,0 +1,123 @@ +import { useState } from 'react'; +import { + AppBar, + Alert, + Avatar, + Box, + Button, + Card, + CardActionArea, + CardContent, + Chip, + CircularProgress, + Container, + IconButton, + Menu, + MenuItem, + Radio, + Stack, + Toolbar, + Typography, +} from '@mui/material'; +import { Link as RouterLink } from 'react-router-dom'; +import { useMyCompanies, useRequestHandoff } from '../../hooks/useCompanies'; +import { useAuth } from '../../hooks/useAuth'; +import type { MyCompany } from '../../api/companies.api'; + +const STATUS_COLOR: Record = { + ACTIVE: 'success', + PROVISIONING: 'warning', + STOPPED: 'default', + FAILED: 'error', + DECOMMISSIONED: 'default', +}; + +export function CompanyPickerPage() { + const { person, logout } = useAuth(); + const { data: companies, isLoading } = useMyCompanies(); + const requestHandoff = useRequestHandoff(); + const [selectedId, setSelectedId] = useState(null); + const [menuAnchor, setMenuAnchor] = useState(null); + const [error, setError] = useState(null); + + const handleContinue = async () => { + if (selectedId === null) return; + setError(null); + try { + const { token, redirectUrl } = await requestHandoff.mutateAsync(selectedId); + window.location.href = `${redirectUrl}/handoff?token=${encodeURIComponent(token)}`; + } catch { + setError('Could not reach that company right now. Please try again.'); + } + }; + + return ( + + + + + Cross Financial Manager + + setMenuAnchor(event.currentTarget)}> + {person?.email?.[0]?.toUpperCase()} + + setMenuAnchor(null)}> + {person?.email} + setMenuAnchor(null)}> + Security (2FA) + + Sign out + + + + + + + Select an organisation + + + Choose which company you want to work in. + + + {isLoading && } + + {!isLoading && (companies?.length ?? 0) === 0 && You are not a member of any company yet.} + + + {(companies ?? []).map((company) => ( + + setSelectedId(company.companyId)} sx={{ p: 0.5 }}> + + + + {company.name} + + {company.slug} + + + + + + + ))} + + + {error && ( + + {error} + + )} + + + + + ); +} diff --git a/manager/client/src/hooks/useAuth.ts b/manager/client/src/hooks/useAuth.ts new file mode 100644 index 0000000..1f1e254 --- /dev/null +++ b/manager/client/src/hooks/useAuth.ts @@ -0,0 +1,33 @@ +import { useMutation } from '@tanstack/react-query'; +import * as authApi from '../api/auth.api'; +import { useAuthStore } from '../store/authStore'; + +export function useAuth() { + const { person, accessToken, setSession, clearSession } = useAuthStore(); + + const loginMutation = useMutation({ + mutationFn: ({ email, password }: { email: string; password: string }) => authApi.login(email, password), + onSuccess: (result) => { + if (!result.requiresTwoFactor) setSession(result); + }, + }); + + const twoFactorMutation = useMutation({ + mutationFn: ({ twoFactorToken, code }: { twoFactorToken: string; code: string }) => + authApi.verifyTwoFactor(twoFactorToken, code), + onSuccess: (session) => setSession(session), + }); + + return { + person, + isAuthenticated: Boolean(accessToken && person), + login: loginMutation.mutateAsync, + isLoggingIn: loginMutation.isPending, + loginError: loginMutation.error, + verifyTwoFactor: twoFactorMutation.mutateAsync, + isVerifyingTwoFactor: twoFactorMutation.isPending, + twoFactorError: twoFactorMutation.error, + setSession, + logout: clearSession, + }; +} diff --git a/manager/client/src/hooks/useCompanies.ts b/manager/client/src/hooks/useCompanies.ts new file mode 100644 index 0000000..7960428 --- /dev/null +++ b/manager/client/src/hooks/useCompanies.ts @@ -0,0 +1,10 @@ +import { useMutation, useQuery } from '@tanstack/react-query'; +import { fetchMyCompanies, requestHandoff } from '../api/companies.api'; + +export function useMyCompanies() { + return useQuery({ queryKey: ['myCompanies'], queryFn: fetchMyCompanies }); +} + +export function useRequestHandoff() { + return useMutation({ mutationFn: (companyId: number) => requestHandoff(companyId) }); +} diff --git a/manager/client/src/index.css b/manager/client/src/index.css new file mode 100644 index 0000000..e4a5833 --- /dev/null +++ b/manager/client/src/index.css @@ -0,0 +1,7 @@ +html, body, #root { + height: 100%; +} + +body { + margin: 0; +} diff --git a/manager/client/src/main.tsx b/manager/client/src/main.tsx new file mode 100644 index 0000000..1374365 --- /dev/null +++ b/manager/client/src/main.tsx @@ -0,0 +1,17 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import './index.css'; +import App from './App.tsx'; + +const queryClient = new QueryClient({ + defaultOptions: { queries: { retry: 1, refetchOnWindowFocus: false } }, +}); + +createRoot(document.getElementById('root')!).render( + + + + + , +); diff --git a/manager/client/src/routes/AppRouter.tsx b/manager/client/src/routes/AppRouter.tsx new file mode 100644 index 0000000..f78ea75 --- /dev/null +++ b/manager/client/src/routes/AppRouter.tsx @@ -0,0 +1,25 @@ +import { Navigate, Route, Routes } from 'react-router-dom'; +import { ProtectedRoute } from './ProtectedRoute'; +import { LoginPage } from '../features/auth/LoginPage'; +import { TwoFactorChallengePage } from '../features/auth/TwoFactorChallengePage'; +import { OAuthCallbackPage } from '../features/auth/OAuthCallbackPage'; +import { SecuritySettingsPage } from '../features/auth/SecuritySettingsPage'; +import { CompanyPickerPage } from '../features/companies/CompanyPickerPage'; + +export function AppRouter() { + return ( + + } /> + } /> + } /> + + }> + } /> + } /> + } /> + + + } /> + + ); +} diff --git a/manager/client/src/routes/ProtectedRoute.tsx b/manager/client/src/routes/ProtectedRoute.tsx new file mode 100644 index 0000000..e6c1cbf --- /dev/null +++ b/manager/client/src/routes/ProtectedRoute.tsx @@ -0,0 +1,10 @@ +import { Navigate, Outlet } from 'react-router-dom'; +import { useAuth } from '../hooks/useAuth'; + +export function ProtectedRoute() { + const { isAuthenticated } = useAuth(); + if (!isAuthenticated) { + return ; + } + return ; +} diff --git a/manager/client/src/store/authStore.ts b/manager/client/src/store/authStore.ts new file mode 100644 index 0000000..9e139fa --- /dev/null +++ b/manager/client/src/store/authStore.ts @@ -0,0 +1,28 @@ +import { create } from 'zustand'; + +export interface AuthPerson { + id: number; + email: string; + fullName: string; + isOperator: boolean; +} + +interface AuthState { + accessToken: string | null; + refreshToken: string | null; + person: AuthPerson | null; + setSession: (session: { accessToken: string; refreshToken: string; person: AuthPerson }) => void; + setAccessToken: (accessToken: string) => void; + clearSession: () => void; +} + +// Tokens kept in memory only, same rationale as the company app: limits XSS exposure at the +// cost of needing to sign in again on a hard page reload. +export const useAuthStore = create((set) => ({ + accessToken: null, + refreshToken: null, + person: null, + setSession: ({ accessToken, refreshToken, person }) => set({ accessToken, refreshToken, person }), + setAccessToken: (accessToken) => set({ accessToken }), + clearSession: () => set({ accessToken: null, refreshToken: null, person: null }), +})); diff --git a/manager/client/src/theme.ts b/manager/client/src/theme.ts new file mode 100644 index 0000000..ab6b818 --- /dev/null +++ b/manager/client/src/theme.ts @@ -0,0 +1,14 @@ +import { createTheme } from '@mui/material/styles'; + +export const theme = createTheme({ + palette: { + mode: 'light', + primary: { main: '#1e3a5f' }, + secondary: { main: '#2e7d32' }, + background: { default: '#f5f6f8' }, + }, + shape: { borderRadius: 6 }, + typography: { + fontFamily: ['Inter', 'Segoe UI', 'Roboto', 'Helvetica', 'Arial', 'sans-serif'].join(','), + }, +}); diff --git a/manager/client/tsconfig.app.json b/manager/client/tsconfig.app.json new file mode 100644 index 0000000..6830b6f --- /dev/null +++ b/manager/client/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "allowArbitraryExtensions": true, + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/manager/client/tsconfig.json b/manager/client/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/manager/client/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/manager/client/tsconfig.node.json b/manager/client/tsconfig.node.json new file mode 100644 index 0000000..8455dcb --- /dev/null +++ b/manager/client/tsconfig.node.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "module": "nodenext", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/manager/client/vite.config.ts b/manager/client/vite.config.ts new file mode 100644 index 0000000..021686a --- /dev/null +++ b/manager/client/vite.config.ts @@ -0,0 +1,10 @@ +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + port: 5174, + }, +}) diff --git a/manager/jest.config.js b/manager/jest.config.js new file mode 100644 index 0000000..16d4b53 --- /dev/null +++ b/manager/jest.config.js @@ -0,0 +1,8 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + rootDir: '.', + testMatch: ['/tests/unit/**/*.spec.ts'], + clearMocks: true, +}; diff --git a/manager/jest.integration.config.js b/manager/jest.integration.config.js new file mode 100644 index 0000000..1a248d3 --- /dev/null +++ b/manager/jest.integration.config.js @@ -0,0 +1,8 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + rootDir: '.', + testMatch: ['/tests/integration/**/*.spec.ts'], + clearMocks: true, +}; diff --git a/manager/package-lock.json b/manager/package-lock.json new file mode 100644 index 0000000..cecb706 --- /dev/null +++ b/manager/package-lock.json @@ -0,0 +1,7147 @@ +{ + "name": "cfm-account-manager", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cfm-account-manager", + "version": "1.0.0", + "dependencies": { + "@prisma/client": "^5.20.0", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", + "otplib": "^12.0.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.13", + "@types/jsonwebtoken": "^9.0.7", + "@types/node": "^22.7.4", + "@types/supertest": "^6.0.2", + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", + "eslint": "^8.57.1", + "jest": "^29.7.0", + "prisma": "^5.20.0", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "typescript": "^5.6.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@otplib/core": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz", + "integrity": "sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA==", + "license": "MIT" + }, + "node_modules/@otplib/plugin-crypto": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz", + "integrity": "sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==", + "deprecated": "Please upgrade to v13 of otplib. Refer to otplib docs for migration paths", + "license": "MIT", + "dependencies": { + "@otplib/core": "^12.0.1" + } + }, + "node_modules/@otplib/plugin-thirty-two": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz", + "integrity": "sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==", + "deprecated": "Please upgrade to v13 of otplib. Refer to otplib docs for migration paths", + "license": "MIT", + "dependencies": { + "@otplib/core": "^12.0.1", + "thirty-two": "^1.0.2" + } + }, + "node_modules/@otplib/preset-default": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@otplib/preset-default/-/preset-default-12.0.1.tgz", + "integrity": "sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==", + "deprecated": "Please upgrade to v13 of otplib. Refer to otplib docs for migration paths", + "license": "MIT", + "dependencies": { + "@otplib/core": "^12.0.1", + "@otplib/plugin-crypto": "^12.0.1", + "@otplib/plugin-thirty-two": "^12.0.1" + } + }, + "node_modules/@otplib/preset-v11": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@otplib/preset-v11/-/preset-v11-12.0.1.tgz", + "integrity": "sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==", + "license": "MIT", + "dependencies": { + "@otplib/core": "^12.0.1", + "@otplib/plugin-crypto": "^12.0.1", + "@otplib/plugin-thirty-two": "^12.0.1" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@prisma/client": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", + "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", + "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/fetch-engine": "5.22.0", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", + "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", + "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", + "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.13.tgz", + "integrity": "sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.9", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz", + "integrity": "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.11", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.11.tgz", + "integrity": "sha512-KA7srSW/HENDtOw9DOqaFLgWuMqN9WgjEw62lh9dpvRaZDkhdOkazASd7X7i2eMUYLHa1U37ZttnePsH5zTDHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz", + "integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/type-utils": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.69.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz", + "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz", + "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.69.0", + "@typescript-eslint/types": "^8.69.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz", + "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz", + "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz", + "integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz", + "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz", + "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.69.0", + "@typescript-eslint/tsconfig-utils": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz", + "integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz", + "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.420", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", + "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", + "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", + "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/otplib": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/otplib/-/otplib-12.0.1.tgz", + "integrity": "sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==", + "license": "MIT", + "dependencies": { + "@otplib/core": "^12.0.1", + "@otplib/preset-default": "^12.0.1", + "@otplib/preset-v11": "^12.0.1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", + "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/engines": "5.22.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thirty-two": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz", + "integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==", + "engines": { + "node": ">=0.2.6" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-jest": { + "version": "29.4.12", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.12.tgz", + "integrity": "sha512-Ov6ClY53Fflh6BGAnY2DlTq1hYDrTycz2PVTXBWFW2CU+9zrEqAp9fWdGXl42EXO5RLSFAcAZ2JFKbP+zBTFfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.5", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/manager/package.json b/manager/package.json new file mode 100644 index 0000000..e729240 --- /dev/null +++ b/manager/package.json @@ -0,0 +1,53 @@ +{ + "name": "cfm-account-manager", + "version": "1.0.0", + "description": "Central Account Manager — login gateway (2FA, Google/Microsoft SSO), company registry, and handoff issuance for Cross Financial Management", + "main": "dist/server.js", + "private": true, + "scripts": { + "dev": "ts-node-dev --respawn --transpile-only src/server.ts", + "build": "tsc -p tsconfig.json", + "start": "node dist/server.js", + "test": "jest --runInBand", + "test:integration": "jest --runInBand --config jest.integration.config.js", + "lint": "eslint \"src/**/*.ts\"", + "prisma:generate": "prisma generate", + "prisma:migrate": "prisma migrate dev", + "prisma:deploy": "prisma migrate deploy", + "prisma:seed": "prisma db seed", + "generate-handoff-keys": "ts-node scripts/generateHandoffKeys.ts" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@prisma/client": "^5.20.0", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", + "otplib": "^12.0.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.13", + "@types/jsonwebtoken": "^9.0.7", + "@types/node": "^22.7.4", + "@types/supertest": "^6.0.2", + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", + "eslint": "^8.57.1", + "jest": "^29.7.0", + "prisma": "^5.20.0", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "typescript": "^5.6.2" + } +} diff --git a/manager/prisma/migrations/20260902134429_init/migration.sql b/manager/prisma/migrations/20260902134429_init/migration.sql new file mode 100644 index 0000000..48bfdc8 --- /dev/null +++ b/manager/prisma/migrations/20260902134429_init/migration.sql @@ -0,0 +1,155 @@ +-- CreateEnum +CREATE TYPE "OAuthProvider" AS ENUM ('GOOGLE', 'MICROSOFT'); + +-- CreateEnum +CREATE TYPE "CompanyStatus" AS ENUM ('PROVISIONING', 'ACTIVE', 'STOPPED', 'FAILED', 'DECOMMISSIONED'); + +-- CreateEnum +CREATE TYPE "ProvisioningAction" AS ENUM ('COMPANY_CREATED', 'DB_CREATED', 'MIGRATIONS_RUN', 'SEED_RUN', 'PM2_STARTED', 'PM2_STOPPED', 'PM2_RESTARTED', 'FRP_PROXY_REGISTERED', 'IMPORT_FILE_GENERATED', 'HANDOFF_ISSUED', 'COMPANY_DECOMMISSIONED'); + +-- CreateTable +CREATE TABLE "Person" ( + "id" SERIAL NOT NULL, + "email" TEXT NOT NULL, + "fullName" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "isOperator" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Person_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PasswordCredential" ( + "id" SERIAL NOT NULL, + "personId" INTEGER NOT NULL, + "passwordHash" TEXT NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "PasswordCredential_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TwoFactorCredential" ( + "id" SERIAL NOT NULL, + "personId" INTEGER NOT NULL, + "totpSecret" TEXT NOT NULL, + "backupCodes" TEXT[], + "isEnabled" BOOLEAN NOT NULL DEFAULT false, + "enabledAt" TIMESTAMP(3), + + CONSTRAINT "TwoFactorCredential_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "OAuthAccount" ( + "id" SERIAL NOT NULL, + "personId" INTEGER NOT NULL, + "provider" "OAuthProvider" NOT NULL, + "providerAccountId" TEXT NOT NULL, + "email" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "OAuthAccount_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Company" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "status" "CompanyStatus" NOT NULL DEFAULT 'PROVISIONING', + "port" INTEGER, + "databaseName" TEXT, + "databaseUrl" TEXT, + "pm2ProcessName" TEXT, + "frpProxyName" TEXT, + "frpToken" TEXT, + "publicUrl" TEXT, + "provisionedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Company_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PersonCompanyMembership" ( + "id" SERIAL NOT NULL, + "personId" INTEGER NOT NULL, + "companyId" INTEGER NOT NULL, + "companyUserEmail" TEXT, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PersonCompanyMembership_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ProvisioningAuditLog" ( + "id" SERIAL NOT NULL, + "companyId" INTEGER, + "actorId" INTEGER, + "action" "ProvisioningAction" NOT NULL, + "detail" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ProvisioningAuditLog_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Person_email_key" ON "Person"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "PasswordCredential_personId_key" ON "PasswordCredential"("personId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TwoFactorCredential_personId_key" ON "TwoFactorCredential"("personId"); + +-- CreateIndex +CREATE UNIQUE INDEX "OAuthAccount_provider_providerAccountId_key" ON "OAuthAccount"("provider", "providerAccountId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Company_slug_key" ON "Company"("slug"); + +-- CreateIndex +CREATE UNIQUE INDEX "Company_port_key" ON "Company"("port"); + +-- CreateIndex +CREATE UNIQUE INDEX "Company_databaseName_key" ON "Company"("databaseName"); + +-- CreateIndex +CREATE UNIQUE INDEX "Company_pm2ProcessName_key" ON "Company"("pm2ProcessName"); + +-- CreateIndex +CREATE UNIQUE INDEX "Company_frpProxyName_key" ON "Company"("frpProxyName"); + +-- CreateIndex +CREATE UNIQUE INDEX "PersonCompanyMembership_personId_companyId_key" ON "PersonCompanyMembership"("personId", "companyId"); + +-- CreateIndex +CREATE INDEX "ProvisioningAuditLog_companyId_idx" ON "ProvisioningAuditLog"("companyId"); + +-- CreateIndex +CREATE INDEX "ProvisioningAuditLog_action_idx" ON "ProvisioningAuditLog"("action"); + +-- AddForeignKey +ALTER TABLE "PasswordCredential" ADD CONSTRAINT "PasswordCredential_personId_fkey" FOREIGN KEY ("personId") REFERENCES "Person"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TwoFactorCredential" ADD CONSTRAINT "TwoFactorCredential_personId_fkey" FOREIGN KEY ("personId") REFERENCES "Person"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "OAuthAccount" ADD CONSTRAINT "OAuthAccount_personId_fkey" FOREIGN KEY ("personId") REFERENCES "Person"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PersonCompanyMembership" ADD CONSTRAINT "PersonCompanyMembership_personId_fkey" FOREIGN KEY ("personId") REFERENCES "Person"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PersonCompanyMembership" ADD CONSTRAINT "PersonCompanyMembership_companyId_fkey" FOREIGN KEY ("companyId") REFERENCES "Company"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProvisioningAuditLog" ADD CONSTRAINT "ProvisioningAuditLog_companyId_fkey" FOREIGN KEY ("companyId") REFERENCES "Company"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProvisioningAuditLog" ADD CONSTRAINT "ProvisioningAuditLog_actorId_fkey" FOREIGN KEY ("actorId") REFERENCES "Person"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/manager/prisma/migrations/migration_lock.toml b/manager/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/manager/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/manager/prisma/schema.prisma b/manager/prisma/schema.prisma new file mode 100644 index 0000000..78388b3 --- /dev/null +++ b/manager/prisma/schema.prisma @@ -0,0 +1,129 @@ +// Central Account Manager — a platform-wide identity store (Person) and company registry, +// fully separate from any single company's own isolated database and User table. +// See the implementation plan, "Phase A — Account Manager: foundation & handoff". + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Person { + id Int @id @default(autoincrement()) + email String @unique + fullName String + isActive Boolean @default(true) + isOperator Boolean @default(false) + credential PasswordCredential? + twoFactor TwoFactorCredential? + oauthAccounts OAuthAccount[] + memberships PersonCompanyMembership[] + auditLogs ProvisioningAuditLog[] + createdAt DateTime @default(now()) +} + +model PasswordCredential { + id Int @id @default(autoincrement()) + personId Int @unique + person Person @relation(fields: [personId], references: [id]) + passwordHash String + updatedAt DateTime @updatedAt +} + +model TwoFactorCredential { + id Int @id @default(autoincrement()) + personId Int @unique + person Person @relation(fields: [personId], references: [id]) + totpSecret String + backupCodes String[] // hashed, one-time use + isEnabled Boolean @default(false) + enabledAt DateTime? +} + +enum OAuthProvider { + GOOGLE + MICROSOFT +} + +model OAuthAccount { + id Int @id @default(autoincrement()) + personId Int + person Person @relation(fields: [personId], references: [id]) + provider OAuthProvider + providerAccountId String + email String + createdAt DateTime @default(now()) + + @@unique([provider, providerAccountId]) +} + +enum CompanyStatus { + PROVISIONING + ACTIVE + STOPPED + FAILED + DECOMMISSIONED +} + +model Company { + id Int @id @default(autoincrement()) + name String + slug String @unique + status CompanyStatus @default(PROVISIONING) + port Int? @unique + databaseName String? @unique + databaseUrl String? // plain column for now — see plan's "later hardening" note + pm2ProcessName String? @unique + frpProxyName String? @unique + frpToken String? + publicUrl String? + provisionedAt DateTime? + memberships PersonCompanyMembership[] + auditLogs ProvisioningAuditLog[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model PersonCompanyMembership { + id Int @id @default(autoincrement()) + personId Int + person Person @relation(fields: [personId], references: [id]) + companyId Int + company Company @relation(fields: [companyId], references: [id]) + companyUserEmail String? // override; defaults to Person.email when resolving the company-local User + isActive Boolean @default(true) + createdAt DateTime @default(now()) + + @@unique([personId, companyId]) +} + +enum ProvisioningAction { + COMPANY_CREATED + DB_CREATED + MIGRATIONS_RUN + SEED_RUN + PM2_STARTED + PM2_STOPPED + PM2_RESTARTED + FRP_PROXY_REGISTERED + IMPORT_FILE_GENERATED + HANDOFF_ISSUED + COMPANY_DECOMMISSIONED +} + +model ProvisioningAuditLog { + id Int @id @default(autoincrement()) + companyId Int? + company Company? @relation(fields: [companyId], references: [id]) + actorId Int? + actor Person? @relation(fields: [actorId], references: [id]) + action ProvisioningAction + detail Json? + createdAt DateTime @default(now()) + + @@index([companyId]) + @@index([action]) +} diff --git a/manager/prisma/seed.ts b/manager/prisma/seed.ts new file mode 100644 index 0000000..1bc59d7 --- /dev/null +++ b/manager/prisma/seed.ts @@ -0,0 +1,53 @@ +import { PrismaClient } from '@prisma/client'; +import bcrypt from 'bcryptjs'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('Seeding operator Person...'); + const operatorEmail = 'joosth2002@icloud.com'; + const passwordHash = await bcrypt.hash('ChangeMe123!', 12); + + const operator = await prisma.person.upsert({ + where: { email: operatorEmail }, + create: { email: operatorEmail, fullName: 'System Administrator', isOperator: true }, + update: { isOperator: true }, + }); + + await prisma.passwordCredential.upsert({ + where: { personId: operator.id }, + create: { personId: operator.id, passwordHash }, + update: {}, + }); + + console.log('Seeding the one manually-provisioned company (Phase A)...'); + const company = await prisma.company.upsert({ + where: { slug: 'demo' }, + create: { + name: 'Demo Company', + slug: 'demo', + status: 'ACTIVE', + port: 5000, + publicUrl: 'http://localhost:5173', + provisionedAt: new Date(), + }, + update: { status: 'ACTIVE', publicUrl: 'http://localhost:5173' }, + }); + + await prisma.personCompanyMembership.upsert({ + where: { personId_companyId: { personId: operator.id, companyId: company.id } }, + create: { personId: operator.id, companyId: company.id }, + update: { isActive: true }, + }); + + console.log(`Seed complete. Sign in as ${operatorEmail} with temporary password "ChangeMe123!" — change it after first login.`); +} + +main() + .catch((error) => { + console.error(error); + process.exitCode = 1; + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/manager/scripts/generateHandoffKeys.ts b/manager/scripts/generateHandoffKeys.ts new file mode 100644 index 0000000..d0ec2bf --- /dev/null +++ b/manager/scripts/generateHandoffKeys.ts @@ -0,0 +1,40 @@ +/** + * Generates the RSA keypair used to sign (Manager) and verify (every company app) handoff + * tokens. Run once per environment: npm run generate-handoff-keys + */ +import fs from 'fs'; +import path from 'path'; +import crypto from 'crypto'; + +const keysDir = path.resolve(__dirname, '..', 'keys'); + +function main() { + if (!fs.existsSync(keysDir)) { + fs.mkdirSync(keysDir, { recursive: true }); + } + + const privateKeyPath = path.join(keysDir, 'handoff-private.pem'); + const publicKeyPath = path.join(keysDir, 'handoff-public.pem'); + + if (fs.existsSync(privateKeyPath) || fs.existsSync(publicKeyPath)) { + console.log('Handoff keypair already exists at manager/keys/ — not overwriting.'); + console.log(` Private: ${privateKeyPath}`); + console.log(` Public: ${publicKeyPath}`); + return; + } + + const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { + modulusLength: 2048, + publicKeyEncoding: { type: 'spki', format: 'pem' }, + privateKeyEncoding: { type: 'pkcs8', format: 'pem' }, + }); + + fs.writeFileSync(privateKeyPath, privateKey, { mode: 0o600 }); + fs.writeFileSync(publicKeyPath, publicKey); + + console.log('Generated handoff RS256 keypair:'); + console.log(` Private (Manager only, never share): ${privateKeyPath}`); + console.log(` Public (copy into every company app's HANDOFF_PUBLIC_KEYS): ${publicKeyPath}`); +} + +main(); diff --git a/manager/src/app.ts b/manager/src/app.ts new file mode 100644 index 0000000..b5d8a5f --- /dev/null +++ b/manager/src/app.ts @@ -0,0 +1,24 @@ +import cors from 'cors'; +import express, { Express } from 'express'; +import helmet from 'helmet'; +import { errorHandler } from './middleware/errorHandler'; +import { authRouter } from './modules/auth/auth.routes'; +import { companiesRouter } from './modules/companies/companies.routes'; + +export function createApp(): Express { + const app = express(); + + app.use(helmet()); + app.use(cors()); + app.use(express.json()); + + app.get('/health', (req, res) => res.json({ status: 'ok' })); + + app.use('/api/auth', authRouter); + app.use('/api/companies', companiesRouter); + + app.use((req, res) => res.status(404).json({ error: 'Not found' })); + app.use(errorHandler); + + return app; +} diff --git a/manager/src/config/env.ts b/manager/src/config/env.ts new file mode 100644 index 0000000..d56534d --- /dev/null +++ b/manager/src/config/env.ts @@ -0,0 +1,37 @@ +import 'dotenv/config'; +import path from 'path'; + +function required(name: string): string { + const value = process.env[name]; + if (!value) { + throw new Error(`Missing required environment variable: ${name}`); + } + return value; +} + +export const env = { + port: Number(process.env.PORT ?? 5100), + databaseUrl: required('DATABASE_URL'), + + jwtAccessSecret: required('JWT_ACCESS_SECRET'), + jwtRefreshSecret: required('JWT_REFRESH_SECRET'), + jwtAccessTtl: process.env.JWT_ACCESS_TTL ?? '15m', + jwtRefreshTtl: process.env.JWT_REFRESH_TTL ?? '7d', + + handoffPrivateKeyPath: path.resolve(process.cwd(), process.env.HANDOFF_PRIVATE_KEY_PATH ?? './keys/handoff-private.pem'), + handoffPublicKeyPath: path.resolve(process.cwd(), process.env.HANDOFF_PUBLIC_KEY_PATH ?? './keys/handoff-public.pem'), + handoffTokenTtlSeconds: Number(process.env.HANDOFF_TOKEN_TTL_SECONDS ?? 90), + + totpIssuer: process.env.TOTP_ISSUER ?? 'Cross Financial Manager', + + googleClientId: process.env.GOOGLE_CLIENT_ID ?? '', + googleClientSecret: process.env.GOOGLE_CLIENT_SECRET ?? '', + googleRedirectUri: process.env.GOOGLE_REDIRECT_URI ?? '', + + microsoftClientId: process.env.MICROSOFT_CLIENT_ID ?? '', + microsoftClientSecret: process.env.MICROSOFT_CLIENT_SECRET ?? '', + microsoftTenant: process.env.MICROSOFT_TENANT ?? 'common', + microsoftRedirectUri: process.env.MICROSOFT_REDIRECT_URI ?? '', + + managerWebUrl: process.env.MANAGER_WEB_URL ?? 'http://localhost:5174', +}; diff --git a/manager/src/lib/asyncHandler.ts b/manager/src/lib/asyncHandler.ts new file mode 100644 index 0000000..118019e --- /dev/null +++ b/manager/src/lib/asyncHandler.ts @@ -0,0 +1,10 @@ +import { NextFunction, Request, Response } from 'express'; + +type Handler = (req: Request, res: Response, next: NextFunction) => Promise | void; + +/** Wraps an async route/controller handler so a rejected promise reaches errorHandler via next(). */ +export function asyncHandler(handler: Handler) { + return (req: Request, res: Response, next: NextFunction): void => { + Promise.resolve(handler(req, res, next)).catch(next); + }; +} diff --git a/manager/src/lib/handoffToken.ts b/manager/src/lib/handoffToken.ts new file mode 100644 index 0000000..aae29c3 --- /dev/null +++ b/manager/src/lib/handoffToken.ts @@ -0,0 +1,39 @@ +import fs from 'fs'; +import crypto from 'crypto'; +import jwt from 'jsonwebtoken'; +import { env } from '../config/env'; + +export interface HandoffTokenClaims { + sub: string; // resolved company-local email + pid: number; // Person.id + cid: number; // Company.id + companySlug: string; +} + +let cachedPrivateKey: string | null = null; + +function loadPrivateKey(): string { + if (cachedPrivateKey) return cachedPrivateKey; + if (!fs.existsSync(env.handoffPrivateKeyPath)) { + throw new Error( + `Handoff private key not found at ${env.handoffPrivateKeyPath}. Run "npm run generate-handoff-keys" first.`, + ); + } + cachedPrivateKey = fs.readFileSync(env.handoffPrivateKeyPath, 'utf8'); + return cachedPrivateKey; +} + +/** + * Mints a short-lived, single-use RS256 handoff token. Only the Manager ever holds the private + * key — every company app holds only the public key and can verify but never mint, so + * compromising one isolated company instance can't be used to forge a session for any other. + */ +export function signHandoffToken(claims: HandoffTokenClaims): { token: string; jti: string } { + const jti = crypto.randomUUID(); + const token = jwt.sign(claims, loadPrivateKey(), { + algorithm: 'RS256', + expiresIn: env.handoffTokenTtlSeconds, + jwtid: jti, + }); + return { token, jti }; +} diff --git a/manager/src/lib/jwt.ts b/manager/src/lib/jwt.ts new file mode 100644 index 0000000..8f572b5 --- /dev/null +++ b/manager/src/lib/jwt.ts @@ -0,0 +1,52 @@ +import jwt, { SignOptions } from 'jsonwebtoken'; +import { env } from '../config/env'; + +type Purpose = 'access' | 'refresh' | '2fa_challenge'; + +interface SessionTokenPayload { + sub: string; + purpose: Purpose; +} + +function sign(personId: number, purpose: Purpose, secret: string, ttl: string | number): string { + const options: SignOptions = { expiresIn: ttl as SignOptions['expiresIn'] }; + return jwt.sign({ sub: String(personId), purpose } satisfies SessionTokenPayload, secret, options); +} + +/** Verifies the token AND that it was issued for the expected purpose — a 2FA-challenge token + * must never be accepted as a real access token, and vice versa. */ +function verify(token: string, secret: string, expectedPurpose: Purpose): number { + const payload = jwt.verify(token, secret) as unknown as SessionTokenPayload; + if (payload.purpose !== expectedPurpose) { + throw new Error(`Expected a ${expectedPurpose} token, got ${payload.purpose}`); + } + return Number(payload.sub); +} + +export const signAccessToken = (personId: number): string => sign(personId, 'access', env.jwtAccessSecret, env.jwtAccessTtl); +export const signRefreshToken = (personId: number): string => sign(personId, 'refresh', env.jwtRefreshSecret, env.jwtRefreshTtl); +export const verifyAccessToken = (token: string): number => verify(token, env.jwtAccessSecret, 'access'); +export const verifyRefreshToken = (token: string): number => verify(token, env.jwtRefreshSecret, 'refresh'); + +/** A short-lived token identifying a person who passed password auth but still owes a 2FA code. */ +export const signTwoFactorChallengeToken = (personId: number): string => + sign(personId, '2fa_challenge', env.jwtAccessSecret, '5m'); +export const verifyTwoFactorChallengeToken = (token: string): number => verify(token, env.jwtAccessSecret, '2fa_challenge'); + +/** + * CSRF protection for the OAuth authorize/callback round trip, without needing server-side + * session storage: a self-verifying signed nonce, not tied to any person yet. + */ +export function signOAuthStateToken(): string { + return jwt.sign({ purpose: 'oauth_state', nonce: Math.random().toString(36).slice(2) }, env.jwtAccessSecret, { + expiresIn: '10m', + }); +} +export function verifyOAuthStateToken(token: string): boolean { + try { + const payload = jwt.verify(token, env.jwtAccessSecret) as { purpose?: string }; + return payload.purpose === 'oauth_state'; + } catch { + return false; + } +} diff --git a/manager/src/lib/oauth.ts b/manager/src/lib/oauth.ts new file mode 100644 index 0000000..252b148 --- /dev/null +++ b/manager/src/lib/oauth.ts @@ -0,0 +1,102 @@ +import { env } from '../config/env'; +import { signOAuthStateToken, verifyOAuthStateToken } from './jwt'; + +export interface OAuthProfile { + providerAccountId: string; + email: string; + name: string; +} + +export class OAuthStateError extends Error { + constructor() { + super('Invalid or expired OAuth state'); + this.name = 'OAuthStateError'; + } +} + +// --------------------------------------------------------------------------- +// Google +// --------------------------------------------------------------------------- + +export function googleAuthorizeUrl(): string { + const state = signOAuthStateToken(); + const params = new URLSearchParams({ + client_id: env.googleClientId, + redirect_uri: env.googleRedirectUri, + response_type: 'code', + scope: 'openid email profile', + state, + access_type: 'online', + prompt: 'select_account', + }); + return `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`; +} + +export async function exchangeGoogleCode(code: string, state: string): Promise { + if (!verifyOAuthStateToken(state)) throw new OAuthStateError(); + + const tokenResponse = await fetch('https://oauth2.googleapis.com/token', { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: new URLSearchParams({ + client_id: env.googleClientId, + client_secret: env.googleClientSecret, + code, + redirect_uri: env.googleRedirectUri, + grant_type: 'authorization_code', + }), + }); + if (!tokenResponse.ok) throw new Error(`Google token exchange failed: ${await tokenResponse.text()}`); + const { access_token: accessToken } = (await tokenResponse.json()) as { access_token: string }; + + const userInfoResponse = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + if (!userInfoResponse.ok) throw new Error(`Google userinfo fetch failed: ${await userInfoResponse.text()}`); + const profile = (await userInfoResponse.json()) as { sub: string; email: string; name?: string }; + + return { providerAccountId: profile.sub, email: profile.email, name: profile.name ?? profile.email }; +} + +// --------------------------------------------------------------------------- +// Microsoft (Azure AD v2.0 endpoint) +// --------------------------------------------------------------------------- + +export function microsoftAuthorizeUrl(): string { + const state = signOAuthStateToken(); + const params = new URLSearchParams({ + client_id: env.microsoftClientId, + redirect_uri: env.microsoftRedirectUri, + response_type: 'code', + scope: 'openid email profile', + state, + response_mode: 'query', + }); + return `https://login.microsoftonline.com/${env.microsoftTenant}/oauth2/v2.0/authorize?${params.toString()}`; +} + +export async function exchangeMicrosoftCode(code: string, state: string): Promise { + if (!verifyOAuthStateToken(state)) throw new OAuthStateError(); + + const tokenResponse = await fetch(`https://login.microsoftonline.com/${env.microsoftTenant}/oauth2/v2.0/token`, { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: new URLSearchParams({ + client_id: env.microsoftClientId, + client_secret: env.microsoftClientSecret, + code, + redirect_uri: env.microsoftRedirectUri, + grant_type: 'authorization_code', + }), + }); + if (!tokenResponse.ok) throw new Error(`Microsoft token exchange failed: ${await tokenResponse.text()}`); + const { access_token: accessToken } = (await tokenResponse.json()) as { access_token: string }; + + const userInfoResponse = await fetch('https://graph.microsoft.com/oidc/userinfo', { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + if (!userInfoResponse.ok) throw new Error(`Microsoft userinfo fetch failed: ${await userInfoResponse.text()}`); + const profile = (await userInfoResponse.json()) as { sub: string; email: string; name?: string }; + + return { providerAccountId: profile.sub, email: profile.email, name: profile.name ?? profile.email }; +} diff --git a/manager/src/lib/prisma.ts b/manager/src/lib/prisma.ts new file mode 100644 index 0000000..769cdc6 --- /dev/null +++ b/manager/src/lib/prisma.ts @@ -0,0 +1,12 @@ +import { PrismaClient } from '@prisma/client'; + +declare global { + // eslint-disable-next-line no-var + var __managerPrisma__: PrismaClient | undefined; +} + +export const prisma = global.__managerPrisma__ ?? new PrismaClient(); + +if (process.env.NODE_ENV !== 'production') { + global.__managerPrisma__ = prisma; +} diff --git a/manager/src/lib/totp.ts b/manager/src/lib/totp.ts new file mode 100644 index 0000000..79186b3 --- /dev/null +++ b/manager/src/lib/totp.ts @@ -0,0 +1,40 @@ +import { authenticator } from 'otplib'; +import bcrypt from 'bcryptjs'; +import crypto from 'crypto'; +import { env } from '../config/env'; + +export function generateTotpSecret(): string { + return authenticator.generateSecret(); +} + +export function totpKeyUri(accountEmail: string, secret: string): string { + return authenticator.keyuri(accountEmail, env.totpIssuer, secret); +} + +export function verifyTotpToken(token: string, secret: string): boolean { + try { + return authenticator.check(token, secret); + } catch { + return false; + } +} + +const BACKUP_CODE_COUNT = 10; + +/** Returns { plainCodes, hashedCodes } — plainCodes shown to the person once, hashedCodes stored. */ +export async function generateBackupCodes(): Promise<{ plainCodes: string[]; hashedCodes: string[] }> { + const plainCodes = Array.from({ length: BACKUP_CODE_COUNT }, () => crypto.randomBytes(5).toString('hex')); + const hashedCodes = await Promise.all(plainCodes.map((code) => bcrypt.hash(code, 10))); + return { plainCodes, hashedCodes }; +} + +/** Returns the index of the matching hashed backup code, or -1 if none matched. */ +export async function findMatchingBackupCode(code: string, hashedCodes: string[]): Promise { + for (let i = 0; i < hashedCodes.length; i += 1) { + // eslint-disable-next-line no-await-in-loop + if (await bcrypt.compare(code, hashedCodes[i])) { + return i; + } + } + return -1; +} diff --git a/manager/src/middleware/auth.ts b/manager/src/middleware/auth.ts new file mode 100644 index 0000000..a6bcbbc --- /dev/null +++ b/manager/src/middleware/auth.ts @@ -0,0 +1,31 @@ +import { NextFunction, Request, Response } from 'express'; +import { prisma } from '../lib/prisma'; +import { verifyAccessToken } from '../lib/jwt'; +import { AuthPerson } from '../types/express'; + +export async function loadAuthPerson(personId: number): Promise { + const person = await prisma.person.findUnique({ where: { id: personId } }); + if (!person || !person.isActive) return null; + return { id: person.id, email: person.email, fullName: person.fullName, isOperator: person.isOperator }; +} + +export async function requireAuth(req: Request, res: Response, next: NextFunction): Promise { + const header = req.headers.authorization; + if (!header?.startsWith('Bearer ')) { + res.status(401).json({ error: 'Missing bearer token' }); + return; + } + + try { + const personId = verifyAccessToken(header.slice('Bearer '.length)); + const person = await loadAuthPerson(personId); + if (!person) { + res.status(401).json({ error: 'Person not found or inactive' }); + return; + } + req.person = person; + next(); + } catch { + res.status(401).json({ error: 'Invalid or expired token' }); + } +} diff --git a/manager/src/middleware/errorHandler.ts b/manager/src/middleware/errorHandler.ts new file mode 100644 index 0000000..bc6658e --- /dev/null +++ b/manager/src/middleware/errorHandler.ts @@ -0,0 +1,20 @@ +import { NextFunction, Request, Response } from 'express'; +import { Prisma } from '@prisma/client'; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function errorHandler(error: unknown, req: Request, res: Response, next: NextFunction): void { + if (error instanceof Prisma.PrismaClientKnownRequestError) { + if (error.code === 'P2002') { + res.status(409).json({ error: 'A record with this value already exists', meta: error.meta }); + return; + } + if (error.code === 'P2025') { + res.status(404).json({ error: 'Record not found' }); + return; + } + } + + // eslint-disable-next-line no-console + console.error(error); + res.status(500).json({ error: 'Internal server error' }); +} diff --git a/manager/src/middleware/requireOperator.ts b/manager/src/middleware/requireOperator.ts new file mode 100644 index 0000000..0f884c6 --- /dev/null +++ b/manager/src/middleware/requireOperator.ts @@ -0,0 +1,13 @@ +import { NextFunction, Request, Response } from 'express'; + +export function requireOperator(req: Request, res: Response, next: NextFunction): void { + if (!req.person) { + res.status(401).json({ error: 'Not authenticated' }); + return; + } + if (!req.person.isOperator) { + res.status(403).json({ error: 'Operator access required' }); + return; + } + next(); +} diff --git a/manager/src/middleware/validate.ts b/manager/src/middleware/validate.ts new file mode 100644 index 0000000..4e402fb --- /dev/null +++ b/manager/src/middleware/validate.ts @@ -0,0 +1,19 @@ +import { NextFunction, Request, Response } from 'express'; +import { AnyZodObject, ZodError } from 'zod'; + +type Section = 'body' | 'query' | 'params'; + +export function validate(schema: AnyZodObject, section: Section = 'body') { + return (req: Request, res: Response, next: NextFunction): void => { + try { + req[section] = schema.parse(req[section]); + next(); + } catch (error) { + if (error instanceof ZodError) { + res.status(400).json({ error: 'Validation failed', details: error.flatten() }); + return; + } + next(error); + } + }; +} diff --git a/manager/src/modules/auth/auth.controller.ts b/manager/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000..2136a61 --- /dev/null +++ b/manager/src/modules/auth/auth.controller.ts @@ -0,0 +1,122 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as authService from './auth.service'; +import { googleAuthorizeUrl, microsoftAuthorizeUrl, exchangeGoogleCode, exchangeMicrosoftCode } from '../../lib/oauth'; +import { env } from '../../config/env'; + +export const loginSchema = z.object({ + email: z.string().email(), + password: z.string().min(1), +}); + +export const twoFactorVerifySchema = z.object({ + twoFactorToken: z.string().min(1), + code: z.string().min(1), +}); + +export const twoFactorEnableSchema = z.object({ + code: z.string().min(1), +}); + +export const refreshSchema = z.object({ + refreshToken: z.string().min(1), +}); + +export async function loginHandler(req: Request, res: Response): Promise { + try { + const { email, password } = req.body as z.infer; + res.json(await authService.login(email, password)); + } catch (error) { + if (error instanceof authService.InvalidCredentialsError) { + res.status(401).json({ error: error.message }); + return; + } + throw error; + } +} + +export async function twoFactorVerifyHandler(req: Request, res: Response): Promise { + try { + const { twoFactorToken, code } = req.body as z.infer; + res.json(await authService.completeTwoFactorChallenge(twoFactorToken, code)); + } catch (error) { + if (error instanceof authService.InvalidTwoFactorCodeError) { + res.status(401).json({ error: error.message }); + return; + } + throw error; + } +} + +export function refreshHandler(req: Request, res: Response): void { + try { + const { refreshToken } = req.body as z.infer; + res.json({ accessToken: authService.refreshSessionToken(refreshToken) }); + } catch { + res.status(401).json({ error: 'Invalid or expired refresh token' }); + } +} + +export function meHandler(req: Request, res: Response): void { + res.json({ person: req.person }); +} + +export async function twoFactorEnrollHandler(req: Request, res: Response): Promise { + const enrollment = await authService.startTwoFactorEnrollment(req.person!.id, req.person!.email); + res.json(enrollment); +} + +export async function twoFactorEnableHandler(req: Request, res: Response): Promise { + try { + const { code } = req.body as z.infer; + const backupCodes = await authService.confirmTwoFactorEnrollment(req.person!.id, code); + res.json({ backupCodes }); + } catch (error) { + if (error instanceof authService.InvalidTwoFactorCodeError) { + res.status(401).json({ error: error.message }); + return; + } + throw error; + } +} + +function redirectWithLoginResult(res: Response, result: Awaited>): void { + const url = new URL('/oauth/callback', env.managerWebUrl); + if (result.requiresTwoFactor) { + url.searchParams.set('twoFactorToken', result.twoFactorToken); + } else { + url.searchParams.set('accessToken', result.accessToken); + url.searchParams.set('refreshToken', result.refreshToken); + } + res.redirect(url.toString()); +} + +export function googleAuthorizeHandler(req: Request, res: Response): void { + res.redirect(googleAuthorizeUrl()); +} + +export async function googleCallbackHandler(req: Request, res: Response): Promise { + const { code, state } = req.query as { code?: string; state?: string }; + if (!code || !state) { + res.status(400).json({ error: 'Missing code or state' }); + return; + } + const profile = await exchangeGoogleCode(code, state); + const result = await authService.handleOAuthCallback('GOOGLE', profile); + redirectWithLoginResult(res, result); +} + +export function microsoftAuthorizeHandler(req: Request, res: Response): void { + res.redirect(microsoftAuthorizeUrl()); +} + +export async function microsoftCallbackHandler(req: Request, res: Response): Promise { + const { code, state } = req.query as { code?: string; state?: string }; + if (!code || !state) { + res.status(400).json({ error: 'Missing code or state' }); + return; + } + const profile = await exchangeMicrosoftCode(code, state); + const result = await authService.handleOAuthCallback('MICROSOFT', profile); + redirectWithLoginResult(res, result); +} diff --git a/manager/src/modules/auth/auth.routes.ts b/manager/src/modules/auth/auth.routes.ts new file mode 100644 index 0000000..0a62820 --- /dev/null +++ b/manager/src/modules/auth/auth.routes.ts @@ -0,0 +1,35 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + googleAuthorizeHandler, + googleCallbackHandler, + loginHandler, + loginSchema, + meHandler, + microsoftAuthorizeHandler, + microsoftCallbackHandler, + refreshHandler, + refreshSchema, + twoFactorEnableHandler, + twoFactorEnableSchema, + twoFactorEnrollHandler, + twoFactorVerifyHandler, + twoFactorVerifySchema, +} from './auth.controller'; + +export const authRouter = Router(); + +authRouter.post('/login', validate(loginSchema), asyncHandler(loginHandler)); +authRouter.post('/2fa/verify', validate(twoFactorVerifySchema), asyncHandler(twoFactorVerifyHandler)); +authRouter.post('/refresh', validate(refreshSchema), refreshHandler); +authRouter.get('/me', requireAuth, meHandler); + +authRouter.post('/2fa/enroll', requireAuth, asyncHandler(twoFactorEnrollHandler)); +authRouter.post('/2fa/enable', requireAuth, validate(twoFactorEnableSchema), asyncHandler(twoFactorEnableHandler)); + +authRouter.get('/oauth/google', googleAuthorizeHandler); +authRouter.get('/oauth/google/callback', asyncHandler(googleCallbackHandler)); +authRouter.get('/oauth/microsoft', microsoftAuthorizeHandler); +authRouter.get('/oauth/microsoft/callback', asyncHandler(microsoftCallbackHandler)); diff --git a/manager/src/modules/auth/auth.service.ts b/manager/src/modules/auth/auth.service.ts new file mode 100644 index 0000000..9f8306d --- /dev/null +++ b/manager/src/modules/auth/auth.service.ts @@ -0,0 +1,145 @@ +import bcrypt from 'bcryptjs'; +import { OAuthProvider } from '@prisma/client'; +import { prisma } from '../../lib/prisma'; +import { + signAccessToken, + signRefreshToken, + signTwoFactorChallengeToken, + verifyRefreshToken, + verifyTwoFactorChallengeToken, +} from '../../lib/jwt'; +import { findMatchingBackupCode, generateBackupCodes, generateTotpSecret, totpKeyUri, verifyTotpToken } from '../../lib/totp'; +import { loadAuthPerson } from '../../middleware/auth'; +import { OAuthProfile } from '../../lib/oauth'; + +export class InvalidCredentialsError extends Error { + constructor() { + super('Invalid email or password'); + this.name = 'InvalidCredentialsError'; + } +} + +export class InvalidTwoFactorCodeError extends Error { + constructor() { + super('Invalid two-factor code'); + this.name = 'InvalidTwoFactorCodeError'; + } +} + +type LoginResult = + | { requiresTwoFactor: true; twoFactorToken: string } + | { requiresTwoFactor: false; accessToken: string; refreshToken: string; person: NonNullable>> }; + +async function issueSessionOrChallenge(personId: number): Promise { + const twoFactor = await prisma.twoFactorCredential.findUnique({ where: { personId } }); + if (twoFactor?.isEnabled) { + return { requiresTwoFactor: true, twoFactorToken: signTwoFactorChallengeToken(personId) }; + } + + const person = await loadAuthPerson(personId); + if (!person) throw new InvalidCredentialsError(); + return { + requiresTwoFactor: false, + accessToken: signAccessToken(personId), + refreshToken: signRefreshToken(personId), + person, + }; +} + +export async function login(email: string, password: string): Promise { + const person = await prisma.person.findUnique({ where: { email }, include: { credential: true } }); + if (!person || !person.isActive || !person.credential) { + throw new InvalidCredentialsError(); + } + + const passwordMatches = await bcrypt.compare(password, person.credential.passwordHash); + if (!passwordMatches) { + throw new InvalidCredentialsError(); + } + + return issueSessionOrChallenge(person.id); +} + +export async function completeTwoFactorChallenge(twoFactorToken: string, code: string) { + let personId: number; + try { + personId = verifyTwoFactorChallengeToken(twoFactorToken); + } catch { + throw new InvalidTwoFactorCodeError(); + } + + const twoFactor = await prisma.twoFactorCredential.findUnique({ where: { personId } }); + if (!twoFactor?.isEnabled) { + throw new InvalidTwoFactorCodeError(); + } + + if (verifyTotpToken(code, twoFactor.totpSecret)) { + return finalizeSession(personId); + } + + const backupIndex = await findMatchingBackupCode(code, twoFactor.backupCodes); + if (backupIndex === -1) { + throw new InvalidTwoFactorCodeError(); + } + + const remainingCodes = twoFactor.backupCodes.filter((_, index) => index !== backupIndex); + await prisma.twoFactorCredential.update({ where: { personId }, data: { backupCodes: remainingCodes } }); + + return finalizeSession(personId); +} + +async function finalizeSession(personId: number) { + const person = await loadAuthPerson(personId); + if (!person) throw new InvalidTwoFactorCodeError(); + return { accessToken: signAccessToken(personId), refreshToken: signRefreshToken(personId), person }; +} + +export function refreshSessionToken(refreshToken: string): string { + const personId = verifyRefreshToken(refreshToken); + return signAccessToken(personId); +} + +export async function startTwoFactorEnrollment(personId: number, email: string) { + const secret = generateTotpSecret(); + await prisma.twoFactorCredential.upsert({ + where: { personId }, + create: { personId, totpSecret: secret, backupCodes: [], isEnabled: false }, + update: { totpSecret: secret, isEnabled: false, backupCodes: [] }, + }); + return { secret, otpauthUrl: totpKeyUri(email, secret) }; +} + +export async function confirmTwoFactorEnrollment(personId: number, code: string): Promise { + const twoFactor = await prisma.twoFactorCredential.findUnique({ where: { personId } }); + if (!twoFactor || !verifyTotpToken(code, twoFactor.totpSecret)) { + throw new InvalidTwoFactorCodeError(); + } + const { plainCodes, hashedCodes } = await generateBackupCodes(); + await prisma.twoFactorCredential.update({ + where: { personId }, + data: { isEnabled: true, enabledAt: new Date(), backupCodes: hashedCodes }, + }); + return plainCodes; +} + +export async function handleOAuthCallback(provider: OAuthProvider, profile: OAuthProfile): Promise { + const existingAccount = await prisma.oAuthAccount.findUnique({ + where: { provider_providerAccountId: { provider, providerAccountId: profile.providerAccountId } }, + }); + + if (existingAccount) { + return issueSessionOrChallenge(existingAccount.personId); + } + + const person = await prisma.person.upsert({ + where: { email: profile.email }, + create: { email: profile.email, fullName: profile.name }, + update: {}, + }); + + await prisma.oAuthAccount.create({ + data: { personId: person.id, provider, providerAccountId: profile.providerAccountId, email: profile.email }, + }); + + return issueSessionOrChallenge(person.id); +} diff --git a/manager/src/modules/companies/companies.controller.ts b/manager/src/modules/companies/companies.controller.ts new file mode 100644 index 0000000..04e1c41 --- /dev/null +++ b/manager/src/modules/companies/companies.controller.ts @@ -0,0 +1,32 @@ +import { Request, Response } from 'express'; +import * as companiesService from './companies.service'; + +export async function listMyCompaniesHandler(req: Request, res: Response): Promise { + const memberships = await companiesService.listMyCompanies(req.person!.id); + res.json( + memberships.map((membership) => ({ + companyId: membership.company.id, + name: membership.company.name, + slug: membership.company.slug, + status: membership.company.status, + })), + ); +} + +export async function handoffHandler(req: Request, res: Response): Promise { + try { + const companyId = Number(req.params.id); + const result = await companiesService.issueHandoff(req.person!.id, companyId); + res.json(result); + } catch (error) { + if (error instanceof companiesService.MembershipNotFoundError) { + res.status(403).json({ error: error.message }); + return; + } + if (error instanceof companiesService.CompanyNotReadyError) { + res.status(409).json({ error: error.message }); + return; + } + throw error; + } +} diff --git a/manager/src/modules/companies/companies.routes.ts b/manager/src/modules/companies/companies.routes.ts new file mode 100644 index 0000000..b659664 --- /dev/null +++ b/manager/src/modules/companies/companies.routes.ts @@ -0,0 +1,11 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { handoffHandler, listMyCompaniesHandler } from './companies.controller'; + +export const companiesRouter = Router(); + +companiesRouter.use(requireAuth); + +companiesRouter.get('/', asyncHandler(listMyCompaniesHandler)); +companiesRouter.post('/:id/handoff', asyncHandler(handoffHandler)); diff --git a/manager/src/modules/companies/companies.service.ts b/manager/src/modules/companies/companies.service.ts new file mode 100644 index 0000000..6a820a7 --- /dev/null +++ b/manager/src/modules/companies/companies.service.ts @@ -0,0 +1,60 @@ +import { prisma } from '../../lib/prisma'; +import { signHandoffToken } from '../../lib/handoffToken'; + +export class MembershipNotFoundError extends Error { + constructor() { + super('You do not have access to this company'); + this.name = 'MembershipNotFoundError'; + } +} + +export class CompanyNotReadyError extends Error { + constructor() { + super('This company is not currently reachable'); + this.name = 'CompanyNotReadyError'; + } +} + +export function listMyCompanies(personId: number) { + return prisma.personCompanyMembership.findMany({ + where: { personId, isActive: true }, + include: { company: true }, + orderBy: { company: { name: 'asc' } }, + }); +} + +export async function issueHandoff(personId: number, companyId: number) { + const [person, membership] = await Promise.all([ + prisma.person.findUniqueOrThrow({ where: { id: personId } }), + prisma.personCompanyMembership.findUnique({ + where: { personId_companyId: { personId, companyId } }, + include: { company: true }, + }), + ]); + + if (!membership || !membership.isActive) { + throw new MembershipNotFoundError(); + } + if (!membership.company.publicUrl || membership.company.status !== 'ACTIVE') { + throw new CompanyNotReadyError(); + } + + const resolvedEmail = membership.companyUserEmail ?? person.email; + const { token, jti } = signHandoffToken({ + sub: resolvedEmail, + pid: person.id, + cid: membership.company.id, + companySlug: membership.company.slug, + }); + + await prisma.provisioningAuditLog.create({ + data: { + companyId: membership.company.id, + actorId: person.id, + action: 'HANDOFF_ISSUED', + detail: { jti, resolvedEmail }, + }, + }); + + return { token, redirectUrl: membership.company.publicUrl }; +} diff --git a/manager/src/server.ts b/manager/src/server.ts new file mode 100644 index 0000000..703b7ed --- /dev/null +++ b/manager/src/server.ts @@ -0,0 +1,9 @@ +import { createApp } from './app'; +import { env } from './config/env'; + +const app = createApp(); + +app.listen(env.port, () => { + // eslint-disable-next-line no-console + console.log(`Account Manager API listening on http://localhost:${env.port}`); +}); diff --git a/manager/src/types/express.d.ts b/manager/src/types/express.d.ts new file mode 100644 index 0000000..7f09a10 --- /dev/null +++ b/manager/src/types/express.d.ts @@ -0,0 +1,14 @@ +export interface AuthPerson { + id: number; + email: string; + fullName: string; + isOperator: boolean; +} + +declare global { + namespace Express { + interface Request { + person?: AuthPerson; + } + } +} diff --git a/manager/tests/integration/handoff.spec.ts b/manager/tests/integration/handoff.spec.ts new file mode 100644 index 0000000..8aba6eb --- /dev/null +++ b/manager/tests/integration/handoff.spec.ts @@ -0,0 +1,59 @@ +/** + * Requires the real, migrated, seeded Manager database (see SETUP.md) reachable via DATABASE_URL. + * Run with: npm run test:integration + */ +import request from 'supertest'; +import { createApp } from '../../src/app'; +import { prisma } from '../../src/lib/prisma'; + +const app = createApp(); + +const OPERATOR_EMAIL = 'joosth2002@icloud.com'; +const OPERATOR_PASSWORD = 'ChangeMe123!'; + +describe('Manager auth + handoff (real DB)', () => { + afterAll(async () => { + await prisma.$disconnect(); + }); + + it('logs in with the seeded operator credentials', async () => { + const response = await request(app).post('/api/auth/login').send({ email: OPERATOR_EMAIL, password: OPERATOR_PASSWORD }); + expect(response.status).toBe(200); + expect(response.body.requiresTwoFactor).toBe(false); + expect(response.body.accessToken).toBeDefined(); + expect(response.body.person.email).toBe(OPERATOR_EMAIL); + }); + + it('rejects the wrong password', async () => { + const response = await request(app).post('/api/auth/login').send({ email: OPERATOR_EMAIL, password: 'wrong' }); + expect(response.status).toBe(401); + }); + + it('lists the seeded demo company as a membership and issues a working handoff token', async () => { + const login = await request(app).post('/api/auth/login').send({ email: OPERATOR_EMAIL, password: OPERATOR_PASSWORD }); + const accessToken = login.body.accessToken as string; + + const myCompanies = await request(app).get('/api/companies').set('Authorization', `Bearer ${accessToken}`); + expect(myCompanies.status).toBe(200); + expect(myCompanies.body.length).toBeGreaterThanOrEqual(1); + const demo = myCompanies.body.find((c: { slug: string }) => c.slug === 'demo'); + expect(demo).toBeDefined(); + + const handoff = await request(app) + .post(`/api/companies/${demo.companyId}/handoff`) + .set('Authorization', `Bearer ${accessToken}`); + expect(handoff.status).toBe(200); + expect(handoff.body.token).toBeDefined(); + expect(handoff.body.redirectUrl).toBe('http://localhost:5173'); + }); + + it('refuses a handoff for a company the person has no membership in', async () => { + const login = await request(app).post('/api/auth/login').send({ email: OPERATOR_EMAIL, password: OPERATOR_PASSWORD }); + const accessToken = login.body.accessToken as string; + + const response = await request(app) + .post('/api/companies/999999/handoff') + .set('Authorization', `Bearer ${accessToken}`); + expect(response.status).toBe(403); + }); +}); diff --git a/manager/tests/unit/handoffToken.spec.ts b/manager/tests/unit/handoffToken.spec.ts new file mode 100644 index 0000000..fd796a3 --- /dev/null +++ b/manager/tests/unit/handoffToken.spec.ts @@ -0,0 +1,52 @@ +import fs from 'fs'; +import path from 'path'; +import crypto from 'crypto'; +import jwt from 'jsonwebtoken'; +import { signHandoffToken } from '../../src/lib/handoffToken'; + +const publicKeyPath = path.resolve(__dirname, '../../keys/handoff-public.pem'); +const privateKeyPath = path.resolve(__dirname, '../../keys/handoff-private.pem'); +const publicKey = fs.readFileSync(publicKeyPath, 'utf8'); +const privateKey = fs.readFileSync(privateKeyPath, 'utf8'); + +const claims = { sub: 'person@example.com', pid: 1, cid: 1, companySlug: 'demo' }; + +describe('signHandoffToken', () => { + it('produces an RS256 token whose claims round-trip through the public key', () => { + const { token, jti } = signHandoffToken(claims); + + const decoded = jwt.verify(token, publicKey, { algorithms: ['RS256'] }) as typeof claims & { jti: string }; + expect(decoded.sub).toBe(claims.sub); + expect(decoded.pid).toBe(claims.pid); + expect(decoded.cid).toBe(claims.cid); + expect(decoded.companySlug).toBe(claims.companySlug); + expect(decoded.jti).toBe(jti); + }); + + it('mints a distinct jti on every call (single-use tokens)', () => { + const first = signHandoffToken(claims); + const second = signHandoffToken(claims); + expect(first.jti).not.toBe(second.jti); + }); + + it('cannot be verified against a different keypair', () => { + const { publicKey: wrongPublicKey } = crypto.generateKeyPairSync('rsa', { + modulusLength: 2048, + publicKeyEncoding: { type: 'spki', format: 'pem' }, + privateKeyEncoding: { type: 'pkcs8', format: 'pem' }, + }); + const { token } = signHandoffToken(claims); + expect(() => jwt.verify(token, wrongPublicKey, { algorithms: ['RS256'] })).toThrow(); + }); + + it('rejects a tampered token', () => { + const { token } = signHandoffToken(claims); + const tampered = `${token.slice(0, -4)}abcd`; + expect(() => jwt.verify(tampered, publicKey, { algorithms: ['RS256'] })).toThrow(); + }); + + it('rejects an expired token', () => { + const expired = jwt.sign(claims, privateKey, { algorithm: 'RS256', expiresIn: -10, jwtid: 'expired-test' }); + expect(() => jwt.verify(expired, publicKey, { algorithms: ['RS256'] })).toThrow(/expired/i); + }); +}); diff --git a/manager/tsconfig.json b/manager/tsconfig.json new file mode 100644 index 0000000..ce0ad22 --- /dev/null +++ b/manager/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node", + "lib": ["ES2022"], + "outDir": "dist", + "rootDir": ".", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": false, + "sourceMap": true + }, + "include": ["src/**/*.ts", "prisma/seed.ts", "scripts/**/*.ts"], + "exclude": ["node_modules", "dist", "client"] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1c210f9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8785 @@ +{ + "name": "cross-financial-management", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cross-financial-management", + "version": "1.0.0", + "dependencies": { + "@prisma/client": "^5.20.0", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.13", + "@types/jsonwebtoken": "^9.0.7", + "@types/node": "^22.7.4", + "@types/supertest": "^6.0.2", + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", + "eslint": "^8.57.1", + "eslint-plugin-import": "^2.31.0", + "jest": "^29.7.0", + "prisma": "^5.20.0", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "typescript": "^5.6.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@prisma/client": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", + "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", + "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/fetch-engine": "5.22.0", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", + "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", + "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", + "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.13.tgz", + "integrity": "sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.9", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz", + "integrity": "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.11", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.11.tgz", + "integrity": "sha512-KA7srSW/HENDtOw9DOqaFLgWuMqN9WgjEw62lh9dpvRaZDkhdOkazASd7X7i2eMUYLHa1U37ZttnePsH5zTDHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz", + "integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/type-utils": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.69.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz", + "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz", + "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.69.0", + "@typescript-eslint/types": "^8.69.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz", + "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz", + "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz", + "integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz", + "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz", + "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.69.0", + "@typescript-eslint/tsconfig-utils": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz", + "integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz", + "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.418", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.418.tgz", + "integrity": "sha512-UzS26r3AEbG5wSoGVpJKqwHIU9zwQN7LHdVIThDrJpS0I5KdlXFMEb8543fhc9dVnIIAST6ar8rhwa00AL5MlA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", + "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", + "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", + "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/engines": "5.22.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-jest": { + "version": "29.4.12", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.12.tgz", + "integrity": "sha512-Ov6ClY53Fflh6BGAnY2DlTq1hYDrTycz2PVTXBWFW2CU+9zrEqAp9fWdGXl42EXO5RLSFAcAZ2JFKbP+zBTFfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.8.5", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d1b4b2a --- /dev/null +++ b/package.json @@ -0,0 +1,54 @@ +{ + "name": "cross-financial-management", + "version": "1.0.0", + "description": "Financial management (accounting) system API — GL, AR, AP, stock control", + "main": "dist/server.js", + "private": true, + "scripts": { + "dev": "ts-node-dev --respawn --transpile-only src/server.ts", + "build": "tsc -p tsconfig.json", + "start": "node dist/server.js", + "test": "jest --runInBand", + "test:watch": "jest --runInBand --watch", + "test:integration": "jest --runInBand --config jest.integration.config.js", + "lint": "eslint \"src/**/*.ts\"", + "prisma:generate": "prisma generate", + "prisma:migrate": "prisma migrate dev", + "prisma:deploy": "prisma migrate deploy", + "prisma:seed": "prisma db seed", + "smoke": "ts-node scripts/smokeTest.ts" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "dependencies": { + "@prisma/client": "^5.20.0", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.6", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.13", + "@types/jsonwebtoken": "^9.0.7", + "@types/node": "^22.7.4", + "@types/supertest": "^6.0.2", + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", + "eslint": "^8.57.1", + "eslint-plugin-import": "^2.31.0", + "jest": "^29.7.0", + "prisma": "^5.20.0", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "typescript": "^5.6.2" + } +} diff --git a/prisma/manual-sql/add_journal_balance_trigger.sql b/prisma/manual-sql/add_journal_balance_trigger.sql new file mode 100644 index 0000000..b23de5d --- /dev/null +++ b/prisma/manual-sql/add_journal_balance_trigger.sql @@ -0,0 +1,53 @@ +-- Layer 2 + Layer 3 of the double-entry enforcement design (see the implementation plan, +-- section "Double-Entry Enforcement"). Layer 1 is PostingService.postEntry() in +-- src/modules/gl/posting.service.ts, which is the primary guard. These are the DB-level +-- backstops that make an unbalanced journal impossible to persist even via a bypass of +-- that service (raw SQL, a future bug, a manual DB edit). +-- +-- Not expressible in Prisma's schema.prisma DSL, so this is applied as hand-written SQL +-- inside an otherwise-empty Prisma migration. See SETUP.md for how to wire this in. + +-- Layer 2: row-level guards on JournalEntryLine. +ALTER TABLE "JournalEntryLine" + ADD CONSTRAINT chk_line_nonnegative + CHECK (debit >= 0 AND credit >= 0); + +ALTER TABLE "JournalEntryLine" + ADD CONSTRAINT chk_line_debit_xor_credit + CHECK ((debit > 0 AND credit = 0) OR (credit > 0 AND debit = 0)); + +-- Layer 3: deferred trigger that re-sums debits/credits per journal_entry_id at commit +-- and rejects the transaction if they don't match. This is the real hard guarantee. +CREATE OR REPLACE FUNCTION trg_check_journal_entry_balance() RETURNS trigger AS $$ +DECLARE + affected_entry_id INTEGER; + total_debit NUMERIC(18,2); + total_credit NUMERIC(18,2); +BEGIN + affected_entry_id := COALESCE(NEW."journalEntryId", OLD."journalEntryId"); + + SELECT COALESCE(SUM(debit), 0), COALESCE(SUM(credit), 0) + INTO total_debit, total_credit + FROM "JournalEntryLine" + WHERE "journalEntryId" = affected_entry_id; + + IF total_debit <> total_credit THEN + RAISE EXCEPTION 'JournalEntry % does not balance: debits % != credits %', + affected_entry_id, total_debit, total_credit; + END IF; + + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +CREATE CONSTRAINT TRIGGER journal_entry_line_balance_check + AFTER INSERT OR UPDATE OR DELETE ON "JournalEntryLine" + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW + EXECUTE FUNCTION trg_check_journal_entry_balance(); + +-- Extra guard: at most one AccountSegmentDefinition may be flagged as the branch segment. +-- Prisma's schema DSL can't express a partial unique index, so it's added here. +CREATE UNIQUE INDEX one_branch_segment_only + ON "AccountSegmentDefinition" (("isBranchSegment")) + WHERE "isBranchSegment" = true; diff --git a/prisma/migrations/20260901183415_init/migration.sql b/prisma/migrations/20260901183415_init/migration.sql new file mode 100644 index 0000000..e7a2f18 --- /dev/null +++ b/prisma/migrations/20260901183415_init/migration.sql @@ -0,0 +1,353 @@ +-- CreateEnum +CREATE TYPE "FiscalYearStatus" AS ENUM ('OPEN', 'LOCKED', 'CLOSED'); + +-- CreateEnum +CREATE TYPE "PeriodStatus" AS ENUM ('OPEN', 'CLOSED'); + +-- CreateEnum +CREATE TYPE "SegmentFormat" AS ENUM ('NUMERIC', 'ALPHA', 'ALPHANUMERIC'); + +-- CreateEnum +CREATE TYPE "GLAccountType" AS ENUM ('ASSET', 'LIABILITY', 'EQUITY', 'INCOME', 'EXPENSE'); + +-- CreateEnum +CREATE TYPE "DebitCredit" AS ENUM ('DEBIT', 'CREDIT'); + +-- CreateEnum +CREATE TYPE "ControlAccountType" AS ENUM ('AR', 'AP', 'STOCK', 'TAX', 'BANK', 'RETAINED_EARNINGS'); + +-- CreateEnum +CREATE TYPE "JournalType" AS ENUM ('GENERAL', 'SALES', 'PURCHASES', 'CASH_RECEIPT', 'CASH_PAYMENT', 'STOCK', 'BANK', 'CUSTOM'); + +-- CreateEnum +CREATE TYPE "SourceModule" AS ENUM ('GL', 'AR', 'AP', 'STOCK', 'SYSTEM'); + +-- CreateEnum +CREATE TYPE "JournalEntryStatus" AS ENUM ('DRAFT', 'POSTED', 'REVERSED'); + +-- CreateTable +CREATE TABLE "CompanySettings" ( + "id" INTEGER NOT NULL DEFAULT 1, + "companyName" TEXT NOT NULL, + "baseCurrencyCode" TEXT NOT NULL DEFAULT 'ZAR', + "fiscalYearStartMonth" INTEGER NOT NULL DEFAULT 1, + "currentFiscalYear" INTEGER NOT NULL, + "accountCodeSeparator" TEXT NOT NULL DEFAULT '-', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "CompanySettings_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FiscalYear" ( + "id" SERIAL NOT NULL, + "year" INTEGER NOT NULL, + "startDate" TIMESTAMP(3) NOT NULL, + "endDate" TIMESTAMP(3) NOT NULL, + "status" "FiscalYearStatus" NOT NULL DEFAULT 'OPEN', + + CONSTRAINT "FiscalYear_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FiscalPeriod" ( + "id" SERIAL NOT NULL, + "fiscalYearId" INTEGER NOT NULL, + "periodNumber" INTEGER NOT NULL, + "startDate" TIMESTAMP(3) NOT NULL, + "endDate" TIMESTAMP(3) NOT NULL, + "status" "PeriodStatus" NOT NULL DEFAULT 'OPEN', + + CONSTRAINT "FiscalPeriod_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AccountSegmentDefinition" ( + "id" SERIAL NOT NULL, + "segmentKey" TEXT NOT NULL, + "label" TEXT NOT NULL, + "order" INTEGER NOT NULL, + "length" INTEGER NOT NULL, + "format" "SegmentFormat" NOT NULL DEFAULT 'NUMERIC', + "isBranchSegment" BOOLEAN NOT NULL DEFAULT false, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "AccountSegmentDefinition_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AccountSegmentValue" ( + "id" SERIAL NOT NULL, + "segmentDefId" INTEGER NOT NULL, + "code" TEXT NOT NULL, + "description" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "AccountSegmentValue_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BranchProfile" ( + "id" SERIAL NOT NULL, + "segmentValueId" INTEGER NOT NULL, + "address" TEXT, + "contactName" TEXT, + "isConsolidatable" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "BranchProfile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "GLAccount" ( + "id" SERIAL NOT NULL, + "accountCode" TEXT NOT NULL, + "accountName" TEXT NOT NULL, + "accountType" "GLAccountType" NOT NULL, + "normalBalance" "DebitCredit" NOT NULL, + "isControlAccount" BOOLEAN NOT NULL DEFAULT false, + "controlType" "ControlAccountType", + "isActive" BOOLEAN NOT NULL DEFAULT true, + "isPostable" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "GLAccount_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "GLAccountSegmentValue" ( + "id" SERIAL NOT NULL, + "glAccountId" INTEGER NOT NULL, + "segmentDefId" INTEGER NOT NULL, + "segmentValueId" INTEGER NOT NULL, + + CONSTRAINT "GLAccountSegmentValue_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Journal" ( + "id" SERIAL NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + "journalType" "JournalType" NOT NULL, + "defaultBranchSegmentValueId" INTEGER, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "Journal_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "JournalEntry" ( + "id" SERIAL NOT NULL, + "entryNumber" TEXT NOT NULL, + "journalId" INTEGER NOT NULL, + "fiscalPeriodId" INTEGER NOT NULL, + "entryDate" TIMESTAMP(3) NOT NULL, + "description" TEXT NOT NULL, + "sourceModule" "SourceModule" NOT NULL, + "sourceType" TEXT, + "sourceId" INTEGER, + "status" "JournalEntryStatus" NOT NULL DEFAULT 'POSTED', + "reversalOfId" INTEGER, + "totalDebits" DECIMAL(18,2) NOT NULL, + "totalCredits" DECIMAL(18,2) NOT NULL, + "createdById" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "JournalEntry_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "JournalEntryLine" ( + "id" SERIAL NOT NULL, + "journalEntryId" INTEGER NOT NULL, + "lineNumber" INTEGER NOT NULL, + "glAccountId" INTEGER NOT NULL, + "debit" DECIMAL(18,2) NOT NULL DEFAULT 0, + "credit" DECIMAL(18,2) NOT NULL DEFAULT 0, + "description" TEXT, + "branchSegmentValueId" INTEGER, + "arInvoiceId" INTEGER, + "apInvoiceId" INTEGER, + "stockMovementId" INTEGER, + "currencyCode" TEXT NOT NULL DEFAULT 'BASE', + "exchangeRateToBase" DECIMAL(18,6) NOT NULL DEFAULT 1, + + CONSTRAINT "JournalEntryLine_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Sequence" ( + "id" SERIAL NOT NULL, + "key" TEXT NOT NULL, + "lastValue" INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT "Sequence_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "email" TEXT NOT NULL, + "passwordHash" TEXT NOT NULL, + "fullName" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Role" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "Role_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Permission" ( + "id" SERIAL NOT NULL, + "key" TEXT NOT NULL, + + CONSTRAINT "Permission_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "RolePermission" ( + "roleId" INTEGER NOT NULL, + "permissionId" INTEGER NOT NULL, + + CONSTRAINT "RolePermission_pkey" PRIMARY KEY ("roleId","permissionId") +); + +-- CreateTable +CREATE TABLE "UserRole" ( + "userId" INTEGER NOT NULL, + "roleId" INTEGER NOT NULL, + + CONSTRAINT "UserRole_pkey" PRIMARY KEY ("userId","roleId") +); + +-- CreateTable +CREATE TABLE "UserBranchRestriction" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "branchSegmentValueId" INTEGER NOT NULL, + + CONSTRAINT "UserBranchRestriction_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "FiscalYear_year_key" ON "FiscalYear"("year"); + +-- CreateIndex +CREATE UNIQUE INDEX "FiscalPeriod_fiscalYearId_periodNumber_key" ON "FiscalPeriod"("fiscalYearId", "periodNumber"); + +-- CreateIndex +CREATE UNIQUE INDEX "AccountSegmentDefinition_segmentKey_key" ON "AccountSegmentDefinition"("segmentKey"); + +-- CreateIndex +CREATE INDEX "AccountSegmentDefinition_order_idx" ON "AccountSegmentDefinition"("order"); + +-- CreateIndex +CREATE UNIQUE INDEX "AccountSegmentValue_segmentDefId_code_key" ON "AccountSegmentValue"("segmentDefId", "code"); + +-- CreateIndex +CREATE UNIQUE INDEX "BranchProfile_segmentValueId_key" ON "BranchProfile"("segmentValueId"); + +-- CreateIndex +CREATE UNIQUE INDEX "GLAccount_accountCode_key" ON "GLAccount"("accountCode"); + +-- CreateIndex +CREATE INDEX "GLAccount_accountType_idx" ON "GLAccount"("accountType"); + +-- CreateIndex +CREATE UNIQUE INDEX "GLAccountSegmentValue_glAccountId_segmentDefId_key" ON "GLAccountSegmentValue"("glAccountId", "segmentDefId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Journal_code_key" ON "Journal"("code"); + +-- CreateIndex +CREATE UNIQUE INDEX "JournalEntry_entryNumber_key" ON "JournalEntry"("entryNumber"); + +-- CreateIndex +CREATE UNIQUE INDEX "JournalEntry_reversalOfId_key" ON "JournalEntry"("reversalOfId"); + +-- CreateIndex +CREATE INDEX "JournalEntry_fiscalPeriodId_idx" ON "JournalEntry"("fiscalPeriodId"); + +-- CreateIndex +CREATE INDEX "JournalEntry_sourceModule_sourceType_sourceId_idx" ON "JournalEntry"("sourceModule", "sourceType", "sourceId"); + +-- CreateIndex +CREATE INDEX "JournalEntryLine_journalEntryId_idx" ON "JournalEntryLine"("journalEntryId"); + +-- CreateIndex +CREATE INDEX "JournalEntryLine_glAccountId_idx" ON "JournalEntryLine"("glAccountId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Sequence_key_key" ON "Sequence"("key"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Role_name_key" ON "Role"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "Permission_key_key" ON "Permission"("key"); + +-- CreateIndex +CREATE UNIQUE INDEX "UserBranchRestriction_userId_branchSegmentValueId_key" ON "UserBranchRestriction"("userId", "branchSegmentValueId"); + +-- AddForeignKey +ALTER TABLE "FiscalPeriod" ADD CONSTRAINT "FiscalPeriod_fiscalYearId_fkey" FOREIGN KEY ("fiscalYearId") REFERENCES "FiscalYear"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AccountSegmentValue" ADD CONSTRAINT "AccountSegmentValue_segmentDefId_fkey" FOREIGN KEY ("segmentDefId") REFERENCES "AccountSegmentDefinition"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BranchProfile" ADD CONSTRAINT "BranchProfile_segmentValueId_fkey" FOREIGN KEY ("segmentValueId") REFERENCES "AccountSegmentValue"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GLAccountSegmentValue" ADD CONSTRAINT "GLAccountSegmentValue_glAccountId_fkey" FOREIGN KEY ("glAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GLAccountSegmentValue" ADD CONSTRAINT "GLAccountSegmentValue_segmentDefId_fkey" FOREIGN KEY ("segmentDefId") REFERENCES "AccountSegmentDefinition"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GLAccountSegmentValue" ADD CONSTRAINT "GLAccountSegmentValue_segmentValueId_fkey" FOREIGN KEY ("segmentValueId") REFERENCES "AccountSegmentValue"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JournalEntry" ADD CONSTRAINT "JournalEntry_journalId_fkey" FOREIGN KEY ("journalId") REFERENCES "Journal"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JournalEntry" ADD CONSTRAINT "JournalEntry_fiscalPeriodId_fkey" FOREIGN KEY ("fiscalPeriodId") REFERENCES "FiscalPeriod"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JournalEntry" ADD CONSTRAINT "JournalEntry_reversalOfId_fkey" FOREIGN KEY ("reversalOfId") REFERENCES "JournalEntry"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JournalEntry" ADD CONSTRAINT "JournalEntry_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JournalEntryLine" ADD CONSTRAINT "JournalEntryLine_journalEntryId_fkey" FOREIGN KEY ("journalEntryId") REFERENCES "JournalEntry"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JournalEntryLine" ADD CONSTRAINT "JournalEntryLine_glAccountId_fkey" FOREIGN KEY ("glAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RolePermission" ADD CONSTRAINT "RolePermission_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "Role"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RolePermission" ADD CONSTRAINT "RolePermission_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserRole" ADD CONSTRAINT "UserRole_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserRole" ADD CONSTRAINT "UserRole_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "Role"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserBranchRestriction" ADD CONSTRAINT "UserBranchRestriction_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20260901183438_add_journal_balance_trigger/migration.sql b/prisma/migrations/20260901183438_add_journal_balance_trigger/migration.sql new file mode 100644 index 0000000..b30319a --- /dev/null +++ b/prisma/migrations/20260901183438_add_journal_balance_trigger/migration.sql @@ -0,0 +1,54 @@ +-- Layer 2 + Layer 3 of the double-entry enforcement design (see the implementation plan, +-- section "Double-Entry Enforcement"). Layer 1 is PostingService.postEntry() in +-- src/modules/gl/posting.service.ts, which is the primary guard. These are the DB-level +-- backstops that make an unbalanced journal impossible to persist even via a bypass of +-- that service (raw SQL, a future bug, a manual DB edit). +-- +-- Not expressible in Prisma's schema.prisma DSL, so this is applied as hand-written SQL +-- inside an otherwise-empty Prisma migration. Source copy kept at +-- prisma/manual-sql/add_journal_balance_trigger.sql for reference. + +-- Layer 2: row-level guards on JournalEntryLine. +ALTER TABLE "JournalEntryLine" + ADD CONSTRAINT chk_line_nonnegative + CHECK (debit >= 0 AND credit >= 0); + +ALTER TABLE "JournalEntryLine" + ADD CONSTRAINT chk_line_debit_xor_credit + CHECK ((debit > 0 AND credit = 0) OR (credit > 0 AND debit = 0)); + +-- Layer 3: deferred trigger that re-sums debits/credits per journal_entry_id at commit +-- and rejects the transaction if they don't match. This is the real hard guarantee. +CREATE OR REPLACE FUNCTION trg_check_journal_entry_balance() RETURNS trigger AS $$ +DECLARE + affected_entry_id INTEGER; + total_debit NUMERIC(18,2); + total_credit NUMERIC(18,2); +BEGIN + affected_entry_id := COALESCE(NEW."journalEntryId", OLD."journalEntryId"); + + SELECT COALESCE(SUM(debit), 0), COALESCE(SUM(credit), 0) + INTO total_debit, total_credit + FROM "JournalEntryLine" + WHERE "journalEntryId" = affected_entry_id; + + IF total_debit <> total_credit THEN + RAISE EXCEPTION 'JournalEntry % does not balance: debits % != credits %', + affected_entry_id, total_debit, total_credit; + END IF; + + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +CREATE CONSTRAINT TRIGGER journal_entry_line_balance_check + AFTER INSERT OR UPDATE OR DELETE ON "JournalEntryLine" + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW + EXECUTE FUNCTION trg_check_journal_entry_balance(); + +-- Extra guard: at most one AccountSegmentDefinition may be flagged as the branch segment. +-- Prisma's schema DSL can't express a partial unique index, so it's added here. +CREATE UNIQUE INDEX one_branch_segment_only + ON "AccountSegmentDefinition" (("isBranchSegment")) + WHERE "isBranchSegment" = true; diff --git a/prisma/migrations/20260902134528_add_handoff_auth/migration.sql b/prisma/migrations/20260902134528_add_handoff_auth/migration.sql new file mode 100644 index 0000000..c660f37 --- /dev/null +++ b/prisma/migrations/20260902134528_add_handoff_auth/migration.sql @@ -0,0 +1,17 @@ +-- AlterTable +ALTER TABLE "CompanySettings" ADD COLUMN "autoProvisionOnHandoff" BOOLEAN NOT NULL DEFAULT false; + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "passwordHash" DROP NOT NULL; + +-- CreateTable +CREATE TABLE "HandoffTokenUse" ( + "id" SERIAL NOT NULL, + "jti" TEXT NOT NULL, + "usedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "HandoffTokenUse_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "HandoffTokenUse_jti_key" ON "HandoffTokenUse"("jti"); diff --git a/prisma/migrations/20260903100927_add_ar_module/migration.sql b/prisma/migrations/20260903100927_add_ar_module/migration.sql new file mode 100644 index 0000000..977cf34 --- /dev/null +++ b/prisma/migrations/20260903100927_add_ar_module/migration.sql @@ -0,0 +1,271 @@ +-- CreateEnum +CREATE TYPE "ARDocumentStatus" AS ENUM ('DRAFT', 'POSTED', 'VOID'); + +-- AlterEnum +-- Splits the generic TAX control type into TAX_OUTPUT/TAX_INPUT (AR needs Output Tax +-- Payable, AP will need Input Tax Receivable — a single "TAX" value was ambiguous for +-- control-account lookup). Existing rows are remapped by their seeded account code +-- (2100 = Output Tax Payable, 2200 = Input Tax Receivable) rather than dropped blind. +BEGIN; +CREATE TYPE "ControlAccountType_new" AS ENUM ('AR', 'AP', 'STOCK', 'TAX_OUTPUT', 'TAX_INPUT', 'BANK', 'RETAINED_EARNINGS'); +ALTER TABLE "GLAccount" ALTER COLUMN "controlType" TYPE "ControlAccountType_new" USING ( + CASE + WHEN "controlType"::text = 'TAX' AND "accountCode" LIKE '2100-%' THEN 'TAX_OUTPUT' + WHEN "controlType"::text = 'TAX' AND "accountCode" LIKE '2200-%' THEN 'TAX_INPUT' + ELSE "controlType"::text + END::"ControlAccountType_new" +); +ALTER TYPE "ControlAccountType" RENAME TO "ControlAccountType_old"; +ALTER TYPE "ControlAccountType_new" RENAME TO "ControlAccountType"; +DROP TYPE "ControlAccountType_old"; +COMMIT; + +-- CreateTable +CREATE TABLE "TaxCode" ( + "id" SERIAL NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + "ratePercent" DECIMAL(6,3) NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "TaxCode_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Customer" ( + "id" SERIAL NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT, + "phone" TEXT, + "address" TEXT, + "taxNumber" TEXT, + "branchSegmentValueId" INTEGER NOT NULL, + "creditLimit" DECIMAL(18,2) NOT NULL DEFAULT 0, + "paymentTermsDays" INTEGER NOT NULL DEFAULT 30, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Customer_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ARInvoice" ( + "id" SERIAL NOT NULL, + "invoiceNumber" TEXT NOT NULL, + "customerId" INTEGER NOT NULL, + "branchSegmentValueId" INTEGER NOT NULL, + "invoiceDate" TIMESTAMP(3) NOT NULL, + "dueDate" TIMESTAMP(3) NOT NULL, + "reference" TEXT, + "status" "ARDocumentStatus" NOT NULL DEFAULT 'DRAFT', + "subtotal" DECIMAL(18,2) NOT NULL, + "taxTotal" DECIMAL(18,2) NOT NULL, + "total" DECIMAL(18,2) NOT NULL, + "balance" DECIMAL(18,2) NOT NULL, + "journalEntryId" INTEGER, + "createdById" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ARInvoice_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ARInvoiceLine" ( + "id" SERIAL NOT NULL, + "invoiceId" INTEGER NOT NULL, + "lineNumber" INTEGER NOT NULL, + "description" TEXT NOT NULL, + "quantity" DECIMAL(18,4) NOT NULL DEFAULT 1, + "unitPrice" DECIMAL(18,4) NOT NULL, + "revenueGLAccountId" INTEGER NOT NULL, + "taxCodeId" INTEGER, + "lineSubtotal" DECIMAL(18,2) NOT NULL, + "lineTax" DECIMAL(18,2) NOT NULL, + "lineTotal" DECIMAL(18,2) NOT NULL, + + CONSTRAINT "ARInvoiceLine_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ARCreditNote" ( + "id" SERIAL NOT NULL, + "creditNoteNumber" TEXT NOT NULL, + "customerId" INTEGER NOT NULL, + "branchSegmentValueId" INTEGER NOT NULL, + "creditNoteDate" TIMESTAMP(3) NOT NULL, + "reference" TEXT, + "reason" TEXT, + "status" "ARDocumentStatus" NOT NULL DEFAULT 'DRAFT', + "subtotal" DECIMAL(18,2) NOT NULL, + "taxTotal" DECIMAL(18,2) NOT NULL, + "total" DECIMAL(18,2) NOT NULL, + "balance" DECIMAL(18,2) NOT NULL, + "journalEntryId" INTEGER, + "createdById" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ARCreditNote_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ARCreditNoteLine" ( + "id" SERIAL NOT NULL, + "creditNoteId" INTEGER NOT NULL, + "lineNumber" INTEGER NOT NULL, + "description" TEXT NOT NULL, + "quantity" DECIMAL(18,4) NOT NULL DEFAULT 1, + "unitPrice" DECIMAL(18,4) NOT NULL, + "revenueGLAccountId" INTEGER NOT NULL, + "taxCodeId" INTEGER, + "lineSubtotal" DECIMAL(18,2) NOT NULL, + "lineTax" DECIMAL(18,2) NOT NULL, + "lineTotal" DECIMAL(18,2) NOT NULL, + + CONSTRAINT "ARCreditNoteLine_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ARReceipt" ( + "id" SERIAL NOT NULL, + "receiptNumber" TEXT NOT NULL, + "customerId" INTEGER NOT NULL, + "branchSegmentValueId" INTEGER NOT NULL, + "receiptDate" TIMESTAMP(3) NOT NULL, + "amount" DECIMAL(18,2) NOT NULL, + "unallocatedAmount" DECIMAL(18,2) NOT NULL, + "bankGLAccountId" INTEGER NOT NULL, + "reference" TEXT, + "status" "ARDocumentStatus" NOT NULL DEFAULT 'DRAFT', + "journalEntryId" INTEGER, + "createdById" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ARReceipt_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ARAllocation" ( + "id" SERIAL NOT NULL, + "invoiceId" INTEGER NOT NULL, + "receiptId" INTEGER, + "creditNoteId" INTEGER, + "amount" DECIMAL(18,2) NOT NULL, + "allocatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ARAllocation_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "TaxCode_code_key" ON "TaxCode"("code"); + +-- CreateIndex +CREATE UNIQUE INDEX "Customer_code_key" ON "Customer"("code"); + +-- CreateIndex +CREATE INDEX "Customer_branchSegmentValueId_idx" ON "Customer"("branchSegmentValueId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ARInvoice_invoiceNumber_key" ON "ARInvoice"("invoiceNumber"); + +-- CreateIndex +CREATE INDEX "ARInvoice_customerId_idx" ON "ARInvoice"("customerId"); + +-- CreateIndex +CREATE INDEX "ARInvoice_branchSegmentValueId_idx" ON "ARInvoice"("branchSegmentValueId"); + +-- CreateIndex +CREATE INDEX "ARInvoice_status_idx" ON "ARInvoice"("status"); + +-- CreateIndex +CREATE INDEX "ARInvoiceLine_invoiceId_idx" ON "ARInvoiceLine"("invoiceId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ARCreditNote_creditNoteNumber_key" ON "ARCreditNote"("creditNoteNumber"); + +-- CreateIndex +CREATE INDEX "ARCreditNote_customerId_idx" ON "ARCreditNote"("customerId"); + +-- CreateIndex +CREATE INDEX "ARCreditNote_branchSegmentValueId_idx" ON "ARCreditNote"("branchSegmentValueId"); + +-- CreateIndex +CREATE INDEX "ARCreditNote_status_idx" ON "ARCreditNote"("status"); + +-- CreateIndex +CREATE INDEX "ARCreditNoteLine_creditNoteId_idx" ON "ARCreditNoteLine"("creditNoteId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ARReceipt_receiptNumber_key" ON "ARReceipt"("receiptNumber"); + +-- CreateIndex +CREATE INDEX "ARReceipt_customerId_idx" ON "ARReceipt"("customerId"); + +-- CreateIndex +CREATE INDEX "ARReceipt_branchSegmentValueId_idx" ON "ARReceipt"("branchSegmentValueId"); + +-- CreateIndex +CREATE INDEX "ARReceipt_status_idx" ON "ARReceipt"("status"); + +-- CreateIndex +CREATE INDEX "ARAllocation_invoiceId_idx" ON "ARAllocation"("invoiceId"); + +-- CreateIndex +CREATE INDEX "ARAllocation_receiptId_idx" ON "ARAllocation"("receiptId"); + +-- CreateIndex +CREATE INDEX "ARAllocation_creditNoteId_idx" ON "ARAllocation"("creditNoteId"); + +-- AddForeignKey +ALTER TABLE "JournalEntryLine" ADD CONSTRAINT "JournalEntryLine_arInvoiceId_fkey" FOREIGN KEY ("arInvoiceId") REFERENCES "ARInvoice"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Customer" ADD CONSTRAINT "Customer_branchSegmentValueId_fkey" FOREIGN KEY ("branchSegmentValueId") REFERENCES "AccountSegmentValue"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARInvoice" ADD CONSTRAINT "ARInvoice_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "Customer"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARInvoice" ADD CONSTRAINT "ARInvoice_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARInvoiceLine" ADD CONSTRAINT "ARInvoiceLine_invoiceId_fkey" FOREIGN KEY ("invoiceId") REFERENCES "ARInvoice"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARInvoiceLine" ADD CONSTRAINT "ARInvoiceLine_revenueGLAccountId_fkey" FOREIGN KEY ("revenueGLAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARInvoiceLine" ADD CONSTRAINT "ARInvoiceLine_taxCodeId_fkey" FOREIGN KEY ("taxCodeId") REFERENCES "TaxCode"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARCreditNote" ADD CONSTRAINT "ARCreditNote_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "Customer"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARCreditNote" ADD CONSTRAINT "ARCreditNote_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARCreditNoteLine" ADD CONSTRAINT "ARCreditNoteLine_creditNoteId_fkey" FOREIGN KEY ("creditNoteId") REFERENCES "ARCreditNote"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARCreditNoteLine" ADD CONSTRAINT "ARCreditNoteLine_revenueGLAccountId_fkey" FOREIGN KEY ("revenueGLAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARCreditNoteLine" ADD CONSTRAINT "ARCreditNoteLine_taxCodeId_fkey" FOREIGN KEY ("taxCodeId") REFERENCES "TaxCode"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARReceipt" ADD CONSTRAINT "ARReceipt_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "Customer"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARReceipt" ADD CONSTRAINT "ARReceipt_bankGLAccountId_fkey" FOREIGN KEY ("bankGLAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARReceipt" ADD CONSTRAINT "ARReceipt_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARAllocation" ADD CONSTRAINT "ARAllocation_invoiceId_fkey" FOREIGN KEY ("invoiceId") REFERENCES "ARInvoice"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARAllocation" ADD CONSTRAINT "ARAllocation_receiptId_fkey" FOREIGN KEY ("receiptId") REFERENCES "ARReceipt"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ARAllocation" ADD CONSTRAINT "ARAllocation_creditNoteId_fkey" FOREIGN KEY ("creditNoteId") REFERENCES "ARCreditNote"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20260903104749_add_ap_module/migration.sql b/prisma/migrations/20260903104749_add_ap_module/migration.sql new file mode 100644 index 0000000..65d4ebe --- /dev/null +++ b/prisma/migrations/20260903104749_add_ap_module/migration.sql @@ -0,0 +1,237 @@ +-- CreateEnum +CREATE TYPE "APDocumentStatus" AS ENUM ('DRAFT', 'POSTED', 'VOID'); + +-- CreateTable +CREATE TABLE "Supplier" ( + "id" SERIAL NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT, + "phone" TEXT, + "address" TEXT, + "taxNumber" TEXT, + "branchSegmentValueId" INTEGER NOT NULL, + "paymentTermsDays" INTEGER NOT NULL DEFAULT 30, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Supplier_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "APInvoice" ( + "id" SERIAL NOT NULL, + "invoiceNumber" TEXT NOT NULL, + "supplierReference" TEXT, + "supplierId" INTEGER NOT NULL, + "branchSegmentValueId" INTEGER NOT NULL, + "invoiceDate" TIMESTAMP(3) NOT NULL, + "dueDate" TIMESTAMP(3) NOT NULL, + "status" "APDocumentStatus" NOT NULL DEFAULT 'DRAFT', + "subtotal" DECIMAL(18,2) NOT NULL, + "taxTotal" DECIMAL(18,2) NOT NULL, + "total" DECIMAL(18,2) NOT NULL, + "balance" DECIMAL(18,2) NOT NULL, + "journalEntryId" INTEGER, + "createdById" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "APInvoice_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "APInvoiceLine" ( + "id" SERIAL NOT NULL, + "invoiceId" INTEGER NOT NULL, + "lineNumber" INTEGER NOT NULL, + "description" TEXT NOT NULL, + "quantity" DECIMAL(18,4) NOT NULL DEFAULT 1, + "unitPrice" DECIMAL(18,4) NOT NULL, + "expenseGLAccountId" INTEGER NOT NULL, + "taxCodeId" INTEGER, + "lineSubtotal" DECIMAL(18,2) NOT NULL, + "lineTax" DECIMAL(18,2) NOT NULL, + "lineTotal" DECIMAL(18,2) NOT NULL, + + CONSTRAINT "APInvoiceLine_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "APDebitNote" ( + "id" SERIAL NOT NULL, + "debitNoteNumber" TEXT NOT NULL, + "supplierId" INTEGER NOT NULL, + "branchSegmentValueId" INTEGER NOT NULL, + "debitNoteDate" TIMESTAMP(3) NOT NULL, + "reference" TEXT, + "reason" TEXT, + "status" "APDocumentStatus" NOT NULL DEFAULT 'DRAFT', + "subtotal" DECIMAL(18,2) NOT NULL, + "taxTotal" DECIMAL(18,2) NOT NULL, + "total" DECIMAL(18,2) NOT NULL, + "balance" DECIMAL(18,2) NOT NULL, + "journalEntryId" INTEGER, + "createdById" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "APDebitNote_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "APDebitNoteLine" ( + "id" SERIAL NOT NULL, + "debitNoteId" INTEGER NOT NULL, + "lineNumber" INTEGER NOT NULL, + "description" TEXT NOT NULL, + "quantity" DECIMAL(18,4) NOT NULL DEFAULT 1, + "unitPrice" DECIMAL(18,4) NOT NULL, + "expenseGLAccountId" INTEGER NOT NULL, + "taxCodeId" INTEGER, + "lineSubtotal" DECIMAL(18,2) NOT NULL, + "lineTax" DECIMAL(18,2) NOT NULL, + "lineTotal" DECIMAL(18,2) NOT NULL, + + CONSTRAINT "APDebitNoteLine_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "APPayment" ( + "id" SERIAL NOT NULL, + "paymentNumber" TEXT NOT NULL, + "supplierId" INTEGER NOT NULL, + "branchSegmentValueId" INTEGER NOT NULL, + "paymentDate" TIMESTAMP(3) NOT NULL, + "amount" DECIMAL(18,2) NOT NULL, + "unallocatedAmount" DECIMAL(18,2) NOT NULL, + "bankGLAccountId" INTEGER NOT NULL, + "reference" TEXT, + "status" "APDocumentStatus" NOT NULL DEFAULT 'DRAFT', + "journalEntryId" INTEGER, + "createdById" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "APPayment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "APAllocation" ( + "id" SERIAL NOT NULL, + "invoiceId" INTEGER NOT NULL, + "paymentId" INTEGER, + "debitNoteId" INTEGER, + "amount" DECIMAL(18,2) NOT NULL, + "allocatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "APAllocation_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Supplier_code_key" ON "Supplier"("code"); + +-- CreateIndex +CREATE INDEX "Supplier_branchSegmentValueId_idx" ON "Supplier"("branchSegmentValueId"); + +-- CreateIndex +CREATE UNIQUE INDEX "APInvoice_invoiceNumber_key" ON "APInvoice"("invoiceNumber"); + +-- CreateIndex +CREATE INDEX "APInvoice_supplierId_idx" ON "APInvoice"("supplierId"); + +-- CreateIndex +CREATE INDEX "APInvoice_branchSegmentValueId_idx" ON "APInvoice"("branchSegmentValueId"); + +-- CreateIndex +CREATE INDEX "APInvoice_status_idx" ON "APInvoice"("status"); + +-- CreateIndex +CREATE INDEX "APInvoiceLine_invoiceId_idx" ON "APInvoiceLine"("invoiceId"); + +-- CreateIndex +CREATE UNIQUE INDEX "APDebitNote_debitNoteNumber_key" ON "APDebitNote"("debitNoteNumber"); + +-- CreateIndex +CREATE INDEX "APDebitNote_supplierId_idx" ON "APDebitNote"("supplierId"); + +-- CreateIndex +CREATE INDEX "APDebitNote_branchSegmentValueId_idx" ON "APDebitNote"("branchSegmentValueId"); + +-- CreateIndex +CREATE INDEX "APDebitNote_status_idx" ON "APDebitNote"("status"); + +-- CreateIndex +CREATE INDEX "APDebitNoteLine_debitNoteId_idx" ON "APDebitNoteLine"("debitNoteId"); + +-- CreateIndex +CREATE UNIQUE INDEX "APPayment_paymentNumber_key" ON "APPayment"("paymentNumber"); + +-- CreateIndex +CREATE INDEX "APPayment_supplierId_idx" ON "APPayment"("supplierId"); + +-- CreateIndex +CREATE INDEX "APPayment_branchSegmentValueId_idx" ON "APPayment"("branchSegmentValueId"); + +-- CreateIndex +CREATE INDEX "APPayment_status_idx" ON "APPayment"("status"); + +-- CreateIndex +CREATE INDEX "APAllocation_invoiceId_idx" ON "APAllocation"("invoiceId"); + +-- CreateIndex +CREATE INDEX "APAllocation_paymentId_idx" ON "APAllocation"("paymentId"); + +-- CreateIndex +CREATE INDEX "APAllocation_debitNoteId_idx" ON "APAllocation"("debitNoteId"); + +-- AddForeignKey +ALTER TABLE "JournalEntryLine" ADD CONSTRAINT "JournalEntryLine_apInvoiceId_fkey" FOREIGN KEY ("apInvoiceId") REFERENCES "APInvoice"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Supplier" ADD CONSTRAINT "Supplier_branchSegmentValueId_fkey" FOREIGN KEY ("branchSegmentValueId") REFERENCES "AccountSegmentValue"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APInvoice" ADD CONSTRAINT "APInvoice_supplierId_fkey" FOREIGN KEY ("supplierId") REFERENCES "Supplier"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APInvoice" ADD CONSTRAINT "APInvoice_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APInvoiceLine" ADD CONSTRAINT "APInvoiceLine_invoiceId_fkey" FOREIGN KEY ("invoiceId") REFERENCES "APInvoice"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APInvoiceLine" ADD CONSTRAINT "APInvoiceLine_expenseGLAccountId_fkey" FOREIGN KEY ("expenseGLAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APInvoiceLine" ADD CONSTRAINT "APInvoiceLine_taxCodeId_fkey" FOREIGN KEY ("taxCodeId") REFERENCES "TaxCode"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APDebitNote" ADD CONSTRAINT "APDebitNote_supplierId_fkey" FOREIGN KEY ("supplierId") REFERENCES "Supplier"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APDebitNote" ADD CONSTRAINT "APDebitNote_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APDebitNoteLine" ADD CONSTRAINT "APDebitNoteLine_debitNoteId_fkey" FOREIGN KEY ("debitNoteId") REFERENCES "APDebitNote"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APDebitNoteLine" ADD CONSTRAINT "APDebitNoteLine_expenseGLAccountId_fkey" FOREIGN KEY ("expenseGLAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APDebitNoteLine" ADD CONSTRAINT "APDebitNoteLine_taxCodeId_fkey" FOREIGN KEY ("taxCodeId") REFERENCES "TaxCode"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APPayment" ADD CONSTRAINT "APPayment_supplierId_fkey" FOREIGN KEY ("supplierId") REFERENCES "Supplier"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APPayment" ADD CONSTRAINT "APPayment_bankGLAccountId_fkey" FOREIGN KEY ("bankGLAccountId") REFERENCES "GLAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APPayment" ADD CONSTRAINT "APPayment_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APAllocation" ADD CONSTRAINT "APAllocation_invoiceId_fkey" FOREIGN KEY ("invoiceId") REFERENCES "APInvoice"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APAllocation" ADD CONSTRAINT "APAllocation_paymentId_fkey" FOREIGN KEY ("paymentId") REFERENCES "APPayment"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "APAllocation" ADD CONSTRAINT "APAllocation_debitNoteId_fkey" FOREIGN KEY ("debitNoteId") REFERENCES "APDebitNote"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..e029536 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,681 @@ +// Phase 1: Foundation — auth, company/fiscal setup, segmented Chart of Accounts, GL posting engine, journals. +// AR / AP / Tax / Stock models are added in later phases per the implementation plan. + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +// --------------------------------------------------------------------------- +// Company / fiscal setup +// --------------------------------------------------------------------------- + +model CompanySettings { + id Int @id @default(1) + companyName String + baseCurrencyCode String @default("ZAR") + fiscalYearStartMonth Int @default(1) + currentFiscalYear Int + accountCodeSeparator String @default("-") + // Login now happens at the central Account Manager, which hands this deployment a signed + // token instead of a password (see src/lib/handoffVerify.ts). If false (the default), a + // handoff for an email with no matching User here is rejected rather than auto-creating one. + autoProvisionOnHandoff Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +// Records each handoff token's jti once used, so a captured token can't be replayed. +model HandoffTokenUse { + id Int @id @default(autoincrement()) + jti String @unique + usedAt DateTime @default(now()) +} + +enum FiscalYearStatus { + OPEN + LOCKED + CLOSED +} + +enum PeriodStatus { + OPEN + CLOSED +} + +model FiscalYear { + id Int @id @default(autoincrement()) + year Int @unique + startDate DateTime + endDate DateTime + status FiscalYearStatus @default(OPEN) + periods FiscalPeriod[] +} + +model FiscalPeriod { + id Int @id @default(autoincrement()) + fiscalYearId Int + fiscalYear FiscalYear @relation(fields: [fiscalYearId], references: [id]) + periodNumber Int + startDate DateTime + endDate DateTime + status PeriodStatus @default(OPEN) + journalEntries JournalEntry[] + + @@unique([fiscalYearId, periodNumber]) +} + +// --------------------------------------------------------------------------- +// Segmented Chart of Accounts (Sage 300-style account segments) +// --------------------------------------------------------------------------- + +enum SegmentFormat { + NUMERIC + ALPHA + ALPHANUMERIC +} + +model AccountSegmentDefinition { + id Int @id @default(autoincrement()) + segmentKey String @unique + label String + order Int + length Int + format SegmentFormat @default(NUMERIC) + isBranchSegment Boolean @default(false) + isActive Boolean @default(true) + values AccountSegmentValue[] + glAccountLinks GLAccountSegmentValue[] + + @@index([order]) +} + +model AccountSegmentValue { + id Int @id @default(autoincrement()) + segmentDefId Int + segmentDef AccountSegmentDefinition @relation(fields: [segmentDefId], references: [id]) + code String + description String + isActive Boolean @default(true) + branchProfile BranchProfile? + glAccountLinks GLAccountSegmentValue[] + customers Customer[] + suppliers Supplier[] + + @@unique([segmentDefId, code]) +} + +model BranchProfile { + id Int @id @default(autoincrement()) + segmentValueId Int @unique + segmentValue AccountSegmentValue @relation(fields: [segmentValueId], references: [id]) + address String? + contactName String? + isConsolidatable Boolean @default(true) +} + +enum GLAccountType { + ASSET + LIABILITY + EQUITY + INCOME + EXPENSE +} + +enum DebitCredit { + DEBIT + CREDIT +} + +enum ControlAccountType { + AR + AP + STOCK + TAX_OUTPUT + TAX_INPUT + BANK + RETAINED_EARNINGS +} + +model GLAccount { + id Int @id @default(autoincrement()) + accountCode String @unique + accountName String + accountType GLAccountType + normalBalance DebitCredit + isControlAccount Boolean @default(false) + controlType ControlAccountType? + isActive Boolean @default(true) + isPostable Boolean @default(true) + segmentValues GLAccountSegmentValue[] + journalLines JournalEntryLine[] + arInvoiceLines ARInvoiceLine[] @relation("ARInvoiceLineRevenue") + arCreditNoteLines ARCreditNoteLine[] @relation("ARCreditNoteLineRevenue") + arReceipts ARReceipt[] @relation("ARReceiptBank") + apInvoiceLines APInvoiceLine[] @relation("APInvoiceLineExpense") + apDebitNoteLines APDebitNoteLine[] @relation("APDebitNoteLineExpense") + apPayments APPayment[] @relation("APPaymentBank") + createdAt DateTime @default(now()) + + @@index([accountType]) +} + +model GLAccountSegmentValue { + id Int @id @default(autoincrement()) + glAccountId Int + glAccount GLAccount @relation(fields: [glAccountId], references: [id]) + segmentDefId Int + segmentDef AccountSegmentDefinition @relation(fields: [segmentDefId], references: [id]) + segmentValueId Int + segmentValue AccountSegmentValue @relation(fields: [segmentValueId], references: [id]) + + @@unique([glAccountId, segmentDefId]) +} + +// --------------------------------------------------------------------------- +// Journals / General Ledger posting core +// --------------------------------------------------------------------------- + +enum JournalType { + GENERAL + SALES + PURCHASES + CASH_RECEIPT + CASH_PAYMENT + STOCK + BANK + CUSTOM +} + +model Journal { + id Int @id @default(autoincrement()) + code String @unique + name String + journalType JournalType + defaultBranchSegmentValueId Int? + isActive Boolean @default(true) + entries JournalEntry[] +} + +enum SourceModule { + GL + AR + AP + STOCK + SYSTEM +} + +enum JournalEntryStatus { + DRAFT + POSTED + REVERSED +} + +model JournalEntry { + id Int @id @default(autoincrement()) + entryNumber String @unique + journalId Int + journal Journal @relation(fields: [journalId], references: [id]) + fiscalPeriodId Int + fiscalPeriod FiscalPeriod @relation(fields: [fiscalPeriodId], references: [id]) + entryDate DateTime + description String + sourceModule SourceModule + sourceType String? + sourceId Int? + status JournalEntryStatus @default(POSTED) + reversalOfId Int? @unique + reversalOf JournalEntry? @relation("Reversal", fields: [reversalOfId], references: [id]) + reversedBy JournalEntry? @relation("Reversal") + totalDebits Decimal @db.Decimal(18, 2) + totalCredits Decimal @db.Decimal(18, 2) + createdById Int + createdBy User @relation(fields: [createdById], references: [id]) + createdAt DateTime @default(now()) + lines JournalEntryLine[] + + @@index([fiscalPeriodId]) + @@index([sourceModule, sourceType, sourceId]) +} + +model JournalEntryLine { + id Int @id @default(autoincrement()) + journalEntryId Int + journalEntry JournalEntry @relation(fields: [journalEntryId], references: [id]) + lineNumber Int + glAccountId Int + glAccount GLAccount @relation(fields: [glAccountId], references: [id]) + debit Decimal @default(0) @db.Decimal(18, 2) + credit Decimal @default(0) @db.Decimal(18, 2) + description String? + branchSegmentValueId Int? + // Sub-ledger cross-references for drill-down. arInvoiceId/apInvoiceId are real FKs now that + // AR/AP exist; stockMovementId stays a plain id until Stock lands in its own phase. + arInvoiceId Int? + arInvoice ARInvoice? @relation(fields: [arInvoiceId], references: [id]) + apInvoiceId Int? + apInvoice APInvoice? @relation(fields: [apInvoiceId], references: [id]) + stockMovementId Int? + currencyCode String @default("BASE") + exchangeRateToBase Decimal @default(1) @db.Decimal(18, 6) + + @@index([journalEntryId]) + @@index([glAccountId]) +} + +// --------------------------------------------------------------------------- +// Document numbering +// --------------------------------------------------------------------------- + +// One row per document-number series (e.g. "JE-2026", "ARINV-2026"). Numbers are +// issued via an atomic increment inside the same transaction as the document create, +// so they stay gap-free/race-free under concurrent posting. +model Sequence { + id Int @id @default(autoincrement()) + key String @unique + lastValue Int @default(0) +} + +// --------------------------------------------------------------------------- +// Accounts Receivable +// --------------------------------------------------------------------------- + +model TaxCode { + id Int @id @default(autoincrement()) + code String @unique + name String + ratePercent Decimal @db.Decimal(6, 3) + isActive Boolean @default(true) + arInvoiceLines ARInvoiceLine[] + arCreditNoteLines ARCreditNoteLine[] + apInvoiceLines APInvoiceLine[] + apDebitNoteLines APDebitNoteLine[] +} + +model Customer { + id Int @id @default(autoincrement()) + code String @unique + name String + email String? + phone String? + address String? + taxNumber String? + branchSegmentValueId Int + branchSegmentValue AccountSegmentValue @relation(fields: [branchSegmentValueId], references: [id]) + creditLimit Decimal @default(0) @db.Decimal(18, 2) + paymentTermsDays Int @default(30) + isActive Boolean @default(true) + invoices ARInvoice[] + creditNotes ARCreditNote[] + receipts ARReceipt[] + createdAt DateTime @default(now()) + + @@index([branchSegmentValueId]) +} + +enum ARDocumentStatus { + DRAFT + POSTED + VOID +} + +model ARInvoice { + id Int @id @default(autoincrement()) + invoiceNumber String @unique + customerId Int + customer Customer @relation(fields: [customerId], references: [id]) + branchSegmentValueId Int + invoiceDate DateTime + dueDate DateTime + reference String? + status ARDocumentStatus @default(DRAFT) + subtotal Decimal @db.Decimal(18, 2) + taxTotal Decimal @db.Decimal(18, 2) + total Decimal @db.Decimal(18, 2) + balance Decimal @db.Decimal(18, 2) + journalEntryId Int? + lines ARInvoiceLine[] + allocations ARAllocation[] + journalLines JournalEntryLine[] + createdById Int + createdBy User @relation("ARInvoiceCreatedBy", fields: [createdById], references: [id]) + createdAt DateTime @default(now()) + + @@index([customerId]) + @@index([branchSegmentValueId]) + @@index([status]) +} + +model ARInvoiceLine { + id Int @id @default(autoincrement()) + invoiceId Int + invoice ARInvoice @relation(fields: [invoiceId], references: [id]) + lineNumber Int + description String + quantity Decimal @default(1) @db.Decimal(18, 4) + unitPrice Decimal @db.Decimal(18, 4) + revenueGLAccountId Int + revenueGLAccount GLAccount @relation("ARInvoiceLineRevenue", fields: [revenueGLAccountId], references: [id]) + taxCodeId Int? + taxCode TaxCode? @relation(fields: [taxCodeId], references: [id]) + lineSubtotal Decimal @db.Decimal(18, 2) + lineTax Decimal @db.Decimal(18, 2) + lineTotal Decimal @db.Decimal(18, 2) + + @@index([invoiceId]) +} + +model ARCreditNote { + id Int @id @default(autoincrement()) + creditNoteNumber String @unique + customerId Int + customer Customer @relation(fields: [customerId], references: [id]) + branchSegmentValueId Int + creditNoteDate DateTime + reference String? + reason String? + status ARDocumentStatus @default(DRAFT) + subtotal Decimal @db.Decimal(18, 2) + taxTotal Decimal @db.Decimal(18, 2) + total Decimal @db.Decimal(18, 2) + balance Decimal @db.Decimal(18, 2) + journalEntryId Int? + lines ARCreditNoteLine[] + allocations ARAllocation[] + createdById Int + createdBy User @relation("ARCreditNoteCreatedBy", fields: [createdById], references: [id]) + createdAt DateTime @default(now()) + + @@index([customerId]) + @@index([branchSegmentValueId]) + @@index([status]) +} + +model ARCreditNoteLine { + id Int @id @default(autoincrement()) + creditNoteId Int + creditNote ARCreditNote @relation(fields: [creditNoteId], references: [id]) + lineNumber Int + description String + quantity Decimal @default(1) @db.Decimal(18, 4) + unitPrice Decimal @db.Decimal(18, 4) + revenueGLAccountId Int + revenueGLAccount GLAccount @relation("ARCreditNoteLineRevenue", fields: [revenueGLAccountId], references: [id]) + taxCodeId Int? + taxCode TaxCode? @relation(fields: [taxCodeId], references: [id]) + lineSubtotal Decimal @db.Decimal(18, 2) + lineTax Decimal @db.Decimal(18, 2) + lineTotal Decimal @db.Decimal(18, 2) + + @@index([creditNoteId]) +} + +model ARReceipt { + id Int @id @default(autoincrement()) + receiptNumber String @unique + customerId Int + customer Customer @relation(fields: [customerId], references: [id]) + branchSegmentValueId Int + receiptDate DateTime + amount Decimal @db.Decimal(18, 2) + unallocatedAmount Decimal @db.Decimal(18, 2) + bankGLAccountId Int + bankGLAccount GLAccount @relation("ARReceiptBank", fields: [bankGLAccountId], references: [id]) + reference String? + status ARDocumentStatus @default(DRAFT) + journalEntryId Int? + allocations ARAllocation[] + createdById Int + createdBy User @relation("ARReceiptCreatedBy", fields: [createdById], references: [id]) + createdAt DateTime @default(now()) + + @@index([customerId]) + @@index([branchSegmentValueId]) + @@index([status]) +} + +model ARAllocation { + id Int @id @default(autoincrement()) + invoiceId Int + invoice ARInvoice @relation(fields: [invoiceId], references: [id]) + receiptId Int? + receipt ARReceipt? @relation(fields: [receiptId], references: [id]) + creditNoteId Int? + creditNote ARCreditNote? @relation(fields: [creditNoteId], references: [id]) + amount Decimal @db.Decimal(18, 2) + allocatedAt DateTime @default(now()) + + @@index([invoiceId]) + @@index([receiptId]) + @@index([creditNoteId]) +} + +// --------------------------------------------------------------------------- +// Accounts Payable +// --------------------------------------------------------------------------- + +model Supplier { + id Int @id @default(autoincrement()) + code String @unique + name String + email String? + phone String? + address String? + taxNumber String? + branchSegmentValueId Int + branchSegmentValue AccountSegmentValue @relation(fields: [branchSegmentValueId], references: [id]) + paymentTermsDays Int @default(30) + isActive Boolean @default(true) + invoices APInvoice[] + debitNotes APDebitNote[] + payments APPayment[] + createdAt DateTime @default(now()) + + @@index([branchSegmentValueId]) +} + +enum APDocumentStatus { + DRAFT + POSTED + VOID +} + +model APInvoice { + id Int @id @default(autoincrement()) + invoiceNumber String @unique + supplierReference String? + supplierId Int + supplier Supplier @relation(fields: [supplierId], references: [id]) + branchSegmentValueId Int + invoiceDate DateTime + dueDate DateTime + status APDocumentStatus @default(DRAFT) + subtotal Decimal @db.Decimal(18, 2) + taxTotal Decimal @db.Decimal(18, 2) + total Decimal @db.Decimal(18, 2) + balance Decimal @db.Decimal(18, 2) + journalEntryId Int? + lines APInvoiceLine[] + allocations APAllocation[] + journalLines JournalEntryLine[] + createdById Int + createdBy User @relation("APInvoiceCreatedBy", fields: [createdById], references: [id]) + createdAt DateTime @default(now()) + + @@index([supplierId]) + @@index([branchSegmentValueId]) + @@index([status]) +} + +model APInvoiceLine { + id Int @id @default(autoincrement()) + invoiceId Int + invoice APInvoice @relation(fields: [invoiceId], references: [id]) + lineNumber Int + description String + quantity Decimal @default(1) @db.Decimal(18, 4) + unitPrice Decimal @db.Decimal(18, 4) + expenseGLAccountId Int + expenseGLAccount GLAccount @relation("APInvoiceLineExpense", fields: [expenseGLAccountId], references: [id]) + taxCodeId Int? + taxCode TaxCode? @relation(fields: [taxCodeId], references: [id]) + lineSubtotal Decimal @db.Decimal(18, 2) + lineTax Decimal @db.Decimal(18, 2) + lineTotal Decimal @db.Decimal(18, 2) + + @@index([invoiceId]) +} + +model APDebitNote { + id Int @id @default(autoincrement()) + debitNoteNumber String @unique + supplierId Int + supplier Supplier @relation(fields: [supplierId], references: [id]) + branchSegmentValueId Int + debitNoteDate DateTime + reference String? + reason String? + status APDocumentStatus @default(DRAFT) + subtotal Decimal @db.Decimal(18, 2) + taxTotal Decimal @db.Decimal(18, 2) + total Decimal @db.Decimal(18, 2) + balance Decimal @db.Decimal(18, 2) + journalEntryId Int? + lines APDebitNoteLine[] + allocations APAllocation[] + createdById Int + createdBy User @relation("APDebitNoteCreatedBy", fields: [createdById], references: [id]) + createdAt DateTime @default(now()) + + @@index([supplierId]) + @@index([branchSegmentValueId]) + @@index([status]) +} + +model APDebitNoteLine { + id Int @id @default(autoincrement()) + debitNoteId Int + debitNote APDebitNote @relation(fields: [debitNoteId], references: [id]) + lineNumber Int + description String + quantity Decimal @default(1) @db.Decimal(18, 4) + unitPrice Decimal @db.Decimal(18, 4) + expenseGLAccountId Int + expenseGLAccount GLAccount @relation("APDebitNoteLineExpense", fields: [expenseGLAccountId], references: [id]) + taxCodeId Int? + taxCode TaxCode? @relation(fields: [taxCodeId], references: [id]) + lineSubtotal Decimal @db.Decimal(18, 2) + lineTax Decimal @db.Decimal(18, 2) + lineTotal Decimal @db.Decimal(18, 2) + + @@index([debitNoteId]) +} + +model APPayment { + id Int @id @default(autoincrement()) + paymentNumber String @unique + supplierId Int + supplier Supplier @relation(fields: [supplierId], references: [id]) + branchSegmentValueId Int + paymentDate DateTime + amount Decimal @db.Decimal(18, 2) + unallocatedAmount Decimal @db.Decimal(18, 2) + bankGLAccountId Int + bankGLAccount GLAccount @relation("APPaymentBank", fields: [bankGLAccountId], references: [id]) + reference String? + status APDocumentStatus @default(DRAFT) + journalEntryId Int? + allocations APAllocation[] + createdById Int + createdBy User @relation("APPaymentCreatedBy", fields: [createdById], references: [id]) + createdAt DateTime @default(now()) + + @@index([supplierId]) + @@index([branchSegmentValueId]) + @@index([status]) +} + +model APAllocation { + id Int @id @default(autoincrement()) + invoiceId Int + invoice APInvoice @relation(fields: [invoiceId], references: [id]) + paymentId Int? + payment APPayment? @relation(fields: [paymentId], references: [id]) + debitNoteId Int? + debitNote APDebitNote? @relation(fields: [debitNoteId], references: [id]) + amount Decimal @db.Decimal(18, 2) + allocatedAt DateTime @default(now()) + + @@index([invoiceId]) + @@index([paymentId]) + @@index([debitNoteId]) +} + +// --------------------------------------------------------------------------- +// Auth / RBAC +// --------------------------------------------------------------------------- + +model User { + id Int @id @default(autoincrement()) + email String @unique + // Nullable: login happens at the central Account Manager now, not here (see + // src/modules/auth/auth.service.ts verifyHandoff()). Kept, not dropped, in case a fallback + // local-login path is ever needed again. + passwordHash String? + fullName String + isActive Boolean @default(true) + roles UserRole[] + branchRestrictions UserBranchRestriction[] + journalEntries JournalEntry[] + arInvoices ARInvoice[] @relation("ARInvoiceCreatedBy") + arCreditNotes ARCreditNote[] @relation("ARCreditNoteCreatedBy") + arReceipts ARReceipt[] @relation("ARReceiptCreatedBy") + apInvoices APInvoice[] @relation("APInvoiceCreatedBy") + apDebitNotes APDebitNote[] @relation("APDebitNoteCreatedBy") + apPayments APPayment[] @relation("APPaymentCreatedBy") + createdAt DateTime @default(now()) +} + +model Role { + id Int @id @default(autoincrement()) + name String @unique + permissions RolePermission[] + users UserRole[] +} + +model Permission { + id Int @id @default(autoincrement()) + key String @unique + roles RolePermission[] +} + +model RolePermission { + roleId Int + role Role @relation(fields: [roleId], references: [id]) + permissionId Int + permission Permission @relation(fields: [permissionId], references: [id]) + + @@id([roleId, permissionId]) +} + +model UserRole { + userId Int + user User @relation(fields: [userId], references: [id]) + roleId Int + role Role @relation(fields: [roleId], references: [id]) + + @@id([userId, roleId]) +} + +model UserBranchRestriction { + id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id]) + branchSegmentValueId Int + + @@unique([userId, branchSegmentValueId]) +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..15faabd --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,315 @@ +import { PrismaClient, GLAccountType, DebitCredit, ControlAccountType, JournalType } from '@prisma/client'; + +const prisma = new PrismaClient(); + +const PERMISSIONS = [ + 'admin.segments.manage', + 'admin.fiscalPeriods.manage', + 'admin.users.manage', + 'admin.tax.manage', + 'gl.account.manage', + 'gl.journal.manage', + 'gl.journal.post', + 'ar.customer.manage', + 'ar.invoice.manage', + 'ar.creditnote.manage', + 'ar.receipt.manage', + 'ap.supplier.manage', + 'ap.invoice.manage', + 'ap.debitnote.manage', + 'ap.payment.manage', +] as const; + +const ROLE_PERMISSIONS: Record = { + ADMIN: PERMISSIONS, + ACCOUNTANT: [ + 'gl.account.manage', + 'gl.journal.manage', + 'gl.journal.post', + 'admin.tax.manage', + 'ar.customer.manage', + 'ar.invoice.manage', + 'ar.creditnote.manage', + 'ar.receipt.manage', + 'ap.supplier.manage', + 'ap.invoice.manage', + 'ap.debitnote.manage', + 'ap.payment.manage', + ], + AR_AP_CLERK: [ + 'ar.customer.manage', + 'ar.invoice.manage', + 'ar.creditnote.manage', + 'ar.receipt.manage', + 'ap.supplier.manage', + 'ap.invoice.manage', + 'ap.debitnote.manage', + 'ap.payment.manage', + ], + BRANCH_USER: [], + READ_ONLY: [], +}; + +async function main() { + console.log('Seeding company settings...'); + await prisma.companySettings.upsert({ + where: { id: 1 }, + create: { id: 1, companyName: 'Demo Company', baseCurrencyCode: 'ZAR', fiscalYearStartMonth: 1, currentFiscalYear: 2026 }, + update: {}, + }); + + console.log('Seeding permissions and roles...'); + for (const key of PERMISSIONS) { + await prisma.permission.upsert({ where: { key }, create: { key }, update: {} }); + } + for (const roleName of Object.keys(ROLE_PERMISSIONS)) { + await prisma.role.upsert({ where: { name: roleName }, create: { name: roleName }, update: {} }); + } + for (const [roleName, permissionKeys] of Object.entries(ROLE_PERMISSIONS)) { + const role = await prisma.role.findUniqueOrThrow({ where: { name: roleName } }); + for (const key of permissionKeys) { + const permission = await prisma.permission.findUniqueOrThrow({ where: { key } }); + await prisma.rolePermission.upsert({ + where: { roleId_permissionId: { roleId: role.id, permissionId: permission.id } }, + create: { roleId: role.id, permissionId: permission.id }, + update: {}, + }); + } + } + + console.log('Seeding default account segment structure...'); + const segmentDefs = [ + { segmentKey: 'MASTER', label: 'Master Account', order: 0, length: 4, format: 'NUMERIC' as const, isBranchSegment: false }, + { segmentKey: 'SUB', label: 'Sub Account', order: 1, length: 3, format: 'NUMERIC' as const, isBranchSegment: false }, + { segmentKey: 'SUBSUB', label: 'Sub-Sub Account', order: 2, length: 3, format: 'NUMERIC' as const, isBranchSegment: false }, + { segmentKey: 'BRANCH', label: 'Branch', order: 3, length: 3, format: 'ALPHA' as const, isBranchSegment: true }, + ]; + const defByKey: Record = {}; + for (const def of segmentDefs) { + defByKey[def.segmentKey] = await prisma.accountSegmentDefinition.upsert({ + where: { segmentKey: def.segmentKey }, + create: def, + update: def, + }); + } + + const masterValues = [ + { code: '1000', description: 'Bank / Cash' }, + { code: '1100', description: 'Accounts Receivable Control' }, + { code: '1200', description: 'Inventory / Stock Control' }, + { code: '2000', description: 'Accounts Payable Control' }, + { code: '2100', description: 'Output Tax Payable' }, + { code: '2200', description: 'Input Tax Receivable' }, + { code: '3000', description: 'Retained Earnings' }, + { code: '3100', description: 'Share Capital' }, + { code: '4000', description: 'Sales Income' }, + { code: '5000', description: 'Cost of Goods Sold' }, + { code: '5100', description: 'Operating Expenses' }, + { code: '5200', description: 'Stock Variance' }, + ]; + const masterByCode: Record = {}; + for (const value of masterValues) { + masterByCode[value.code] = await prisma.accountSegmentValue.upsert({ + where: { segmentDefId_code: { segmentDefId: defByKey.MASTER.id, code: value.code } }, + create: { segmentDefId: defByKey.MASTER.id, ...value }, + update: value, + }); + } + + const subDefault = await prisma.accountSegmentValue.upsert({ + where: { segmentDefId_code: { segmentDefId: defByKey.SUB.id, code: '000' } }, + create: { segmentDefId: defByKey.SUB.id, code: '000', description: 'Default' }, + update: {}, + }); + const subsubDefault = await prisma.accountSegmentValue.upsert({ + where: { segmentDefId_code: { segmentDefId: defByKey.SUBSUB.id, code: '000' } }, + create: { segmentDefId: defByKey.SUBSUB.id, code: '000', description: 'Default' }, + update: {}, + }); + + const branchDefs = [ + { code: 'HQ', description: 'Head Office' }, + { code: 'AMA', description: 'Branch AMA (example branch)' }, + ]; + const branchByCode: Record = {}; + for (const branch of branchDefs) { + const value = await prisma.accountSegmentValue.upsert({ + where: { segmentDefId_code: { segmentDefId: defByKey.BRANCH.id, code: branch.code } }, + create: { segmentDefId: defByKey.BRANCH.id, code: branch.code, description: branch.description }, + update: {}, + }); + branchByCode[branch.code] = value; + await prisma.branchProfile.upsert({ + where: { segmentValueId: value.id }, + create: { segmentValueId: value.id }, + update: {}, + }); + } + + console.log('Seeding default Chart of Accounts...'); + const operationalAccounts: Array<{ + masterCode: string; + accountName: string; + accountType: GLAccountType; + normalBalance: DebitCredit; + isControlAccount?: boolean; + controlType?: ControlAccountType; + }> = [ + { masterCode: '1000', accountName: 'Bank / Cash', accountType: 'ASSET', normalBalance: 'DEBIT', controlType: 'BANK' }, + { masterCode: '1100', accountName: 'Accounts Receivable Control', accountType: 'ASSET', normalBalance: 'DEBIT', isControlAccount: true, controlType: 'AR' }, + { masterCode: '1200', accountName: 'Inventory / Stock Control', accountType: 'ASSET', normalBalance: 'DEBIT', isControlAccount: true, controlType: 'STOCK' }, + { masterCode: '2000', accountName: 'Accounts Payable Control', accountType: 'LIABILITY', normalBalance: 'CREDIT', isControlAccount: true, controlType: 'AP' }, + { masterCode: '2100', accountName: 'Output Tax Payable', accountType: 'LIABILITY', normalBalance: 'CREDIT', isControlAccount: true, controlType: 'TAX_OUTPUT' }, + { masterCode: '2200', accountName: 'Input Tax Receivable', accountType: 'ASSET', normalBalance: 'DEBIT', isControlAccount: true, controlType: 'TAX_INPUT' }, + { masterCode: '4000', accountName: 'Sales Income', accountType: 'INCOME', normalBalance: 'CREDIT' }, + { masterCode: '5000', accountName: 'Cost of Goods Sold', accountType: 'EXPENSE', normalBalance: 'DEBIT' }, + { masterCode: '5100', accountName: 'Operating Expenses', accountType: 'EXPENSE', normalBalance: 'DEBIT' }, + { masterCode: '5200', accountName: 'Stock Variance', accountType: 'EXPENSE', normalBalance: 'DEBIT' }, + ]; + + for (const branchCode of Object.keys(branchByCode)) { + for (const account of operationalAccounts) { + const accountCode = [masterByCode[account.masterCode].id, subDefault.id, subsubDefault.id, branchByCode[branchCode].id]; + const fullCode = `${account.masterCode}-000-000-${branchCode}`; + await prisma.gLAccount.upsert({ + where: { accountCode: fullCode }, + create: { + accountCode: fullCode, + accountName: `${account.accountName} — ${branchCode}`, + accountType: account.accountType, + normalBalance: account.normalBalance, + isControlAccount: account.isControlAccount ?? false, + controlType: account.controlType, + segmentValues: { + create: [ + { segmentDefId: defByKey.MASTER.id, segmentValueId: accountCode[0] }, + { segmentDefId: defByKey.SUB.id, segmentValueId: accountCode[1] }, + { segmentDefId: defByKey.SUBSUB.id, segmentValueId: accountCode[2] }, + { segmentDefId: defByKey.BRANCH.id, segmentValueId: accountCode[3] }, + ], + }, + }, + update: {}, + }); + } + } + + // Equity accounts are booked at Head Office only. + const equityAccounts: Array<{ masterCode: string; accountName: string; controlType?: ControlAccountType }> = [ + { masterCode: '3000', accountName: 'Retained Earnings', controlType: 'RETAINED_EARNINGS' }, + { masterCode: '3100', accountName: 'Share Capital' }, + ]; + for (const account of equityAccounts) { + const fullCode = `${account.masterCode}-000-000-HQ`; + await prisma.gLAccount.upsert({ + where: { accountCode: fullCode }, + create: { + accountCode: fullCode, + accountName: account.accountName, + accountType: 'EQUITY', + normalBalance: 'CREDIT', + controlType: account.controlType, + segmentValues: { + create: [ + { segmentDefId: defByKey.MASTER.id, segmentValueId: masterByCode[account.masterCode].id }, + { segmentDefId: defByKey.SUB.id, segmentValueId: subDefault.id }, + { segmentDefId: defByKey.SUBSUB.id, segmentValueId: subsubDefault.id }, + { segmentDefId: defByKey.BRANCH.id, segmentValueId: branchByCode.HQ.id }, + ], + }, + }, + update: {}, + }); + } + + console.log('Seeding journals...'); + await prisma.journal.upsert({ + where: { code: 'GJ' }, + create: { code: 'GJ', name: 'General Journal', journalType: JournalType.GENERAL }, + update: {}, + }); + await prisma.journal.upsert({ + where: { code: 'PC-HQ' }, + create: { + code: 'PC-HQ', + name: 'Petty Cash — Head Office', + journalType: JournalType.CUSTOM, + defaultBranchSegmentValueId: branchByCode.HQ.id, + }, + update: {}, + }); + await prisma.journal.upsert({ + where: { code: 'SALES' }, + create: { code: 'SALES', name: 'Sales Journal', journalType: JournalType.SALES }, + update: {}, + }); + await prisma.journal.upsert({ + where: { code: 'CASH_RECEIPT' }, + create: { code: 'CASH_RECEIPT', name: 'Cash Receipts Journal', journalType: JournalType.CASH_RECEIPT }, + update: {}, + }); + await prisma.journal.upsert({ + where: { code: 'PURCHASES' }, + create: { code: 'PURCHASES', name: 'Purchases Journal', journalType: JournalType.PURCHASES }, + update: {}, + }); + await prisma.journal.upsert({ + where: { code: 'CASH_PAYMENT' }, + create: { code: 'CASH_PAYMENT', name: 'Cash Payments Journal', journalType: JournalType.CASH_PAYMENT }, + update: {}, + }); + + console.log('Seeding tax codes...'); + const taxCodes = [ + { code: 'STD', name: 'Standard Rate (15%)', ratePercent: 15 }, + { code: 'ZERO', name: 'Zero-Rated (0%)', ratePercent: 0 }, + ]; + for (const taxCode of taxCodes) { + await prisma.taxCode.upsert({ where: { code: taxCode.code }, create: taxCode, update: taxCode }); + } + + console.log('Seeding current fiscal year...'); + const fiscalYear = await prisma.fiscalYear.upsert({ + where: { year: 2026 }, + create: { year: 2026, startDate: new Date(Date.UTC(2026, 0, 1)), endDate: new Date(Date.UTC(2026, 11, 31)) }, + update: {}, + }); + for (let month = 0; month < 12; month += 1) { + const startDate = new Date(Date.UTC(2026, month, 1)); + const endDate = new Date(Date.UTC(2026, month + 1, 0)); + await prisma.fiscalPeriod.upsert({ + where: { fiscalYearId_periodNumber: { fiscalYearId: fiscalYear.id, periodNumber: month + 1 } }, + create: { fiscalYearId: fiscalYear.id, periodNumber: month + 1, startDate, endDate }, + update: {}, + }); + } + + console.log('Seeding admin user...'); + // No password here — identity is established by the Account Manager's handoff token and + // matched to this User by email (see src/modules/auth/auth.service.ts verifyHandoff()). + // This email must match the Person who logs into the Manager for the mapping to resolve. + const adminEmail = 'joosth2002@icloud.com'; + const adminRole = await prisma.role.findUniqueOrThrow({ where: { name: 'ADMIN' } }); + const existingAdmin = await prisma.user.findUnique({ where: { email: adminEmail } }); + if (!existingAdmin) { + await prisma.user.create({ + data: { + email: adminEmail, + fullName: 'System Administrator', + roles: { create: { roleId: adminRole.id } }, + }, + }); + console.log(`Created admin user ${adminEmail} — signs in via the Account Manager, no local password.`); + } + + console.log('Seed complete.'); +} + +main() + .catch((error) => { + console.error(error); + process.exitCode = 1; + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/scripts/smokeTest.ts b/scripts/smokeTest.ts new file mode 100644 index 0000000..25b3a46 --- /dev/null +++ b/scripts/smokeTest.ts @@ -0,0 +1,95 @@ +/** + * Phase 1 smoke test: posts a balanced manual journal entry, confirms an unbalanced one is + * rejected, then prints a simple Main + per-branch debit/credit sum to confirm everything + * still balances. Run after `npm run prisma:seed` against a real database: + * npm run smoke + */ +import { PrismaClient } from '@prisma/client'; +import { PostingService } from '../src/modules/gl/posting.service'; +import { UnbalancedEntryError } from '../src/modules/gl/posting.types'; + +const prisma = new PrismaClient(); + +async function getAccount(accountCode: string) { + return prisma.gLAccount.findUniqueOrThrow({ where: { accountCode } }); +} + +async function main() { + const admin = await prisma.user.findUniqueOrThrow({ where: { email: 'joosth2002@icloud.com' } }); + const bankHQ = await getAccount('1000-000-000-HQ'); + const salesHQ = await getAccount('4000-000-000-HQ'); + const bankAMA = await getAccount('1000-000-000-AMA'); + const salesAMA = await getAccount('4000-000-000-AMA'); + + console.log('Posting a balanced entry at HQ...'); + const hqEntry = await PostingService.postEntry({ + journalCode: 'GJ', + entryDate: new Date(), + description: 'Smoke test cash sale — HQ', + sourceModule: 'GL', + sourceType: 'SmokeTest', + createdById: admin.id, + lines: [ + { glAccountId: bankHQ.id, debit: 1000, credit: 0, branchSegmentValueId: bankHQ.id }, + { glAccountId: salesHQ.id, debit: 0, credit: 1000, branchSegmentValueId: salesHQ.id }, + ], + }); + console.log(` Posted ${hqEntry.entryNumber}: debits ${hqEntry.totalDebits} / credits ${hqEntry.totalCredits}`); + + console.log('Posting a balanced entry at AMA...'); + const amaEntry = await PostingService.postEntry({ + journalCode: 'GJ', + entryDate: new Date(), + description: 'Smoke test cash sale — AMA', + sourceModule: 'GL', + sourceType: 'SmokeTest', + createdById: admin.id, + lines: [ + { glAccountId: bankAMA.id, debit: 400, credit: 0 }, + { glAccountId: salesAMA.id, debit: 0, credit: 400 }, + ], + }); + console.log(` Posted ${amaEntry.entryNumber}: debits ${amaEntry.totalDebits} / credits ${amaEntry.totalCredits}`); + + console.log('Attempting an unbalanced entry (should be rejected)...'); + try { + await PostingService.postEntry({ + journalCode: 'GJ', + entryDate: new Date(), + description: 'This should never persist', + sourceModule: 'GL', + sourceType: 'SmokeTest', + createdById: admin.id, + lines: [ + { glAccountId: bankHQ.id, debit: 100, credit: 0 }, + { glAccountId: salesHQ.id, debit: 0, credit: 50 }, + ], + }); + throw new Error('Unbalanced entry was accepted — this is a bug in PostingService'); + } catch (error) { + if (error instanceof UnbalancedEntryError) { + console.log(` Correctly rejected: ${error.message}`); + } else { + throw error; + } + } + + console.log('Trial balance check (sum of all posted lines, grouped by account type)...'); + const lines = await prisma.journalEntryLine.findMany({ include: { glAccount: true } }); + const totalDebits = lines.reduce((total, line) => total + Number(line.debit), 0); + const totalCredits = lines.reduce((total, line) => total + Number(line.credit), 0); + console.log(` Main: total debits ${totalDebits.toFixed(2)}, total credits ${totalCredits.toFixed(2)}`); + if (totalDebits !== totalCredits) { + throw new Error('Trial balance does not sum to zero — double-entry invariant violated'); + } + console.log('Smoke test passed: every posted entry balances.'); +} + +main() + .catch((error) => { + console.error(error); + process.exitCode = 1; + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..f014e75 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,54 @@ +import cors from 'cors'; +import express, { Express } from 'express'; +import helmet from 'helmet'; +import { errorHandler } from './middleware/errorHandler'; +import { authRouter } from './modules/auth/auth.routes'; +import { segmentsRouter } from './modules/company/segments.routes'; +import { fiscalPeriodsRouter } from './modules/company/fiscalPeriods.routes'; +import { glAccountsRouter } from './modules/gl/glAccounts.routes'; +import { journalsRouter } from './modules/gl/journals.routes'; +import { journalEntriesRouter } from './modules/gl/journalEntries.routes'; +import { usersRouter } from './modules/users/users.routes'; +import { rolesRouter } from './modules/users/roles.routes'; +import { taxCodesRouter } from './modules/tax/taxCodes.routes'; +import { customersRouter } from './modules/ar/customers.routes'; +import { arInvoicesRouter } from './modules/ar/arInvoices.routes'; +import { arCreditNotesRouter } from './modules/ar/arCreditNotes.routes'; +import { arReceiptsRouter } from './modules/ar/arReceipts.routes'; +import { suppliersRouter } from './modules/ap/suppliers.routes'; +import { apInvoicesRouter } from './modules/ap/apInvoices.routes'; +import { apDebitNotesRouter } from './modules/ap/apDebitNotes.routes'; +import { apPaymentsRouter } from './modules/ap/apPayments.routes'; + +export function createApp(): Express { + const app = express(); + + app.use(helmet()); + app.use(cors()); + app.use(express.json()); + + app.get('/health', (req, res) => res.json({ status: 'ok' })); + + app.use('/api/auth', authRouter); + app.use('/api/company', segmentsRouter); + app.use('/api/company', fiscalPeriodsRouter); + app.use('/api/gl/accounts', glAccountsRouter); + app.use('/api/gl/journals', journalsRouter); + app.use('/api/gl/journal-entries', journalEntriesRouter); + app.use('/api/users', usersRouter); + app.use('/api/roles', rolesRouter); + app.use('/api/tax/codes', taxCodesRouter); + app.use('/api/ar/customers', customersRouter); + app.use('/api/ar/invoices', arInvoicesRouter); + app.use('/api/ar/credit-notes', arCreditNotesRouter); + app.use('/api/ar/receipts', arReceiptsRouter); + app.use('/api/ap/suppliers', suppliersRouter); + app.use('/api/ap/invoices', apInvoicesRouter); + app.use('/api/ap/debit-notes', apDebitNotesRouter); + app.use('/api/ap/payments', apPaymentsRouter); + + app.use((req, res) => res.status(404).json({ error: 'Not found' })); + app.use(errorHandler); + + return app; +} diff --git a/src/config/env.ts b/src/config/env.ts new file mode 100644 index 0000000..5b35cc6 --- /dev/null +++ b/src/config/env.ts @@ -0,0 +1,34 @@ +import 'dotenv/config'; +import fs from 'fs'; +import path from 'path'; + +function required(name: string): string { + const value = process.env[name]; + if (!value) { + throw new Error(`Missing required environment variable: ${name}`); + } + return value; +} + +function loadHandoffPublicKeys(): string[] { + const rawPaths = required('HANDOFF_PUBLIC_KEY_PATHS'); + return rawPaths + .split(',') + .map((entry) => entry.trim()) + .filter(Boolean) + .map((entry) => fs.readFileSync(path.resolve(process.cwd(), entry), 'utf8')); +} + +export const env = { + port: Number(process.env.PORT ?? 4000), + databaseUrl: required('DATABASE_URL'), + jwtAccessSecret: required('JWT_ACCESS_SECRET'), + jwtRefreshSecret: required('JWT_REFRESH_SECRET'), + jwtAccessTtl: process.env.JWT_ACCESS_TTL ?? '15m', + jwtRefreshTtl: process.env.JWT_REFRESH_TTL ?? '7d', + companySlug: required('COMPANY_SLUG'), + // Public keys this deployment trusts to verify a handoff token's RS256 signature — a comma + // separated list of PEM file paths, so a key can be rotated by trusting the old and new key + // simultaneously during the overlap window. The Manager alone holds the matching private key. + handoffPublicKeys: loadHandoffPublicKeys(), +}; diff --git a/src/lib/asyncHandler.ts b/src/lib/asyncHandler.ts new file mode 100644 index 0000000..118019e --- /dev/null +++ b/src/lib/asyncHandler.ts @@ -0,0 +1,10 @@ +import { NextFunction, Request, Response } from 'express'; + +type Handler = (req: Request, res: Response, next: NextFunction) => Promise | void; + +/** Wraps an async route/controller handler so a rejected promise reaches errorHandler via next(). */ +export function asyncHandler(handler: Handler) { + return (req: Request, res: Response, next: NextFunction): void => { + Promise.resolve(handler(req, res, next)).catch(next); + }; +} diff --git a/src/lib/branchFilter.ts b/src/lib/branchFilter.ts new file mode 100644 index 0000000..fe22ab8 --- /dev/null +++ b/src/lib/branchFilter.ts @@ -0,0 +1,41 @@ +import { Request } from 'express'; + +export type BranchScope = { mode: 'MAIN' } | { mode: 'BRANCH'; branchSegmentValueId: number }; + +export class ForbiddenBranchScopeError extends Error { + constructor(message = 'You are not permitted to view this branch') { + super(message); + this.name = 'ForbiddenBranchScopeError'; + } +} + +/** + * Resolves the requested "Main" (all branches) vs single-branch scope from the + * `branchScope` query param, then forces it down to what the user is actually + * permitted to see. A BRANCH_USER can never widen their view to MAIN or to a + * branch outside their UserBranchRestriction rows, regardless of what the client asked for. + */ +export function resolveBranchScope(req: Request): BranchScope { + const requested = req.query.branchScope; + const allowed = req.user?.allowedBranchSegmentValueIds ?? null; + + if (requested === undefined || requested === 'MAIN') { + if (allowed === null) return { mode: 'MAIN' }; + if (allowed.length === 1) return { mode: 'BRANCH', branchSegmentValueId: allowed[0] }; + throw new ForbiddenBranchScopeError('Select a single branch — you do not have access to the Main consolidated view'); + } + + const branchSegmentValueId = Number(requested); + if (!Number.isInteger(branchSegmentValueId)) { + throw new ForbiddenBranchScopeError('Invalid branchScope value'); + } + if (allowed !== null && !allowed.includes(branchSegmentValueId)) { + throw new ForbiddenBranchScopeError(); + } + return { mode: 'BRANCH', branchSegmentValueId }; +} + +/** Prisma `where` fragment for a column-level branch filter (AR/AP/Stock tables). */ +export function branchWhere(scope: BranchScope, column = 'branchSegmentValueId'): Record { + return scope.mode === 'MAIN' ? {} : { [column]: scope.branchSegmentValueId }; +} diff --git a/src/lib/controlAccounts.ts b/src/lib/controlAccounts.ts new file mode 100644 index 0000000..d898acb --- /dev/null +++ b/src/lib/controlAccounts.ts @@ -0,0 +1,35 @@ +import { ControlAccountType, GLAccount, Prisma } from '@prisma/client'; + +type TxClient = Prisma.TransactionClient; + +export class ControlAccountNotFoundError extends Error { + constructor(controlType: ControlAccountType, branchSegmentValueId: number) { + super(`No active ${controlType} control account is configured for branch segment value ${branchSegmentValueId}`); + this.name = 'ControlAccountNotFoundError'; + } +} + +/** + * Every branch gets its own full set of control accounts (see prisma/seed.ts — accounts are + * created per branch segment value), so AR/AP/Stock postings resolve "the AR control account" + * as "the control account of this type whose segments include this branch," not a single + * global account. + */ +export async function resolveControlAccount( + tx: TxClient, + branchSegmentValueId: number, + controlType: ControlAccountType, +): Promise { + const account = await tx.gLAccount.findFirst({ + where: { + controlType, + isControlAccount: true, + isActive: true, + segmentValues: { some: { segmentValueId: branchSegmentValueId } }, + }, + }); + if (!account) { + throw new ControlAccountNotFoundError(controlType, branchSegmentValueId); + } + return account; +} diff --git a/src/lib/handoffVerify.ts b/src/lib/handoffVerify.ts new file mode 100644 index 0000000..97dcce9 --- /dev/null +++ b/src/lib/handoffVerify.ts @@ -0,0 +1,50 @@ +import jwt from 'jsonwebtoken'; +import { env } from '../config/env'; + +export interface HandoffClaims { + sub: string; + pid: number; + cid: number; + companySlug: string; + jti: string; +} + +export class InvalidHandoffTokenError extends Error { + constructor(message = 'Invalid or expired handoff token') { + super(message); + this.name = 'InvalidHandoffTokenError'; + } +} + +export class WrongCompanyHandoffError extends Error { + constructor() { + super('This handoff token was not issued for this company'); + this.name = 'WrongCompanyHandoffError'; + } +} + +/** + * Verifies a handoff token minted by the Account Manager. Tries every trusted public key (see + * env.handoffPublicKeys) so a key can be rotated without a hard cutover. Only signature/expiry + * and audience (companySlug) are checked here — membership/authorization already happened at + * the Manager before the token was minted. + */ +export function verifyHandoffToken(token: string): HandoffClaims { + for (const publicKey of env.handoffPublicKeys) { + try { + const claims = jwt.verify(token, publicKey, { algorithms: ['RS256'] }) as HandoffClaims & { jti?: string }; + if (!claims.jti) { + throw new InvalidHandoffTokenError(); + } + if (claims.companySlug !== env.companySlug) { + throw new WrongCompanyHandoffError(); + } + return claims as HandoffClaims; + } catch (error) { + if (error instanceof WrongCompanyHandoffError) throw error; + // Signature/expiry failure against this key — try the next trusted key, if any, rather + // than leaking the underlying jsonwebtoken library message to the API response. + } + } + throw new InvalidHandoffTokenError(); +} diff --git a/src/lib/jwt.ts b/src/lib/jwt.ts new file mode 100644 index 0000000..bd61b41 --- /dev/null +++ b/src/lib/jwt.ts @@ -0,0 +1,21 @@ +import jwt, { SignOptions } from 'jsonwebtoken'; +import { env } from '../config/env'; + +export interface TokenPayload { + sub: string; +} + +function sign(userId: number, secret: string, ttl: string): string { + const options: SignOptions = { expiresIn: ttl as SignOptions['expiresIn'] }; + return jwt.sign({ sub: String(userId) } satisfies TokenPayload, secret, options); +} + +function verify(token: string, secret: string): number { + const payload = jwt.verify(token, secret) as unknown as TokenPayload; + return Number(payload.sub); +} + +export const signAccessToken = (userId: number): string => sign(userId, env.jwtAccessSecret, env.jwtAccessTtl); +export const signRefreshToken = (userId: number): string => sign(userId, env.jwtRefreshSecret, env.jwtRefreshTtl); +export const verifyAccessToken = (token: string): number => verify(token, env.jwtAccessSecret); +export const verifyRefreshToken = (token: string): number => verify(token, env.jwtRefreshSecret); diff --git a/src/lib/money.ts b/src/lib/money.ts new file mode 100644 index 0000000..8fb60c4 --- /dev/null +++ b/src/lib/money.ts @@ -0,0 +1,12 @@ +import { Prisma } from '@prisma/client'; + +export type Money = Prisma.Decimal; + +export const money = (value: Prisma.Decimal.Value): Money => new Prisma.Decimal(value); + +export const ZERO = money(0); + +export const sum = (values: Money[]): Money => + values.reduce((total, value) => total.plus(value), ZERO); + +export const isEqual = (a: Money, b: Money): boolean => a.equals(b); diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts new file mode 100644 index 0000000..6e7d688 --- /dev/null +++ b/src/lib/prisma.ts @@ -0,0 +1,12 @@ +import { PrismaClient } from '@prisma/client'; + +declare global { + // eslint-disable-next-line no-var + var __prisma__: PrismaClient | undefined; +} + +export const prisma = global.__prisma__ ?? new PrismaClient(); + +if (process.env.NODE_ENV !== 'production') { + global.__prisma__ = prisma; +} diff --git a/src/lib/sequence.ts b/src/lib/sequence.ts new file mode 100644 index 0000000..1133519 --- /dev/null +++ b/src/lib/sequence.ts @@ -0,0 +1,18 @@ +import { Prisma } from '@prisma/client'; + +type TxClient = Prisma.TransactionClient; + +/** + * Issues the next gap-free number in a named series, e.g. nextNumber(tx, 'JE', 2026) -> "JE-2026-000123". + * Must be called from inside the same transaction as the document it numbers, so a rolled-back + * document doesn't leave a permanent gap-causing side effect outside the transaction boundary. + */ +export async function nextNumber(tx: TxClient, prefix: string, fiscalYear: number): Promise { + const key = `${prefix}-${fiscalYear}`; + const sequence = await tx.sequence.upsert({ + where: { key }, + create: { key, lastValue: 1 }, + update: { lastValue: { increment: 1 } }, + }); + return `${prefix}-${fiscalYear}-${String(sequence.lastValue).padStart(6, '0')}`; +} diff --git a/src/middleware/auth.ts b/src/middleware/auth.ts new file mode 100644 index 0000000..bf4b257 --- /dev/null +++ b/src/middleware/auth.ts @@ -0,0 +1,54 @@ +import { NextFunction, Request, Response } from 'express'; +import { prisma } from '../lib/prisma'; +import { verifyAccessToken } from '../lib/jwt'; +import { AuthUser } from '../types/express'; + +export async function loadAuthUser(userId: number): Promise { + const user = await prisma.user.findUnique({ + where: { id: userId }, + include: { + roles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, + branchRestrictions: true, + }, + }); + if (!user || !user.isActive) return null; + + const roles = user.roles.map((userRole) => userRole.role.name); + const permissions = Array.from( + new Set( + user.roles.flatMap((userRole) => userRole.role.permissions.map((rolePermission) => rolePermission.permission.key)), + ), + ); + const isBranchRestricted = roles.includes('BRANCH_USER') && user.branchRestrictions.length > 0; + + return { + id: user.id, + email: user.email, + roles, + permissions, + allowedBranchSegmentValueIds: isBranchRestricted + ? user.branchRestrictions.map((restriction) => restriction.branchSegmentValueId) + : null, + }; +} + +export async function requireAuth(req: Request, res: Response, next: NextFunction): Promise { + const header = req.headers.authorization; + if (!header?.startsWith('Bearer ')) { + res.status(401).json({ error: 'Missing bearer token' }); + return; + } + + try { + const userId = verifyAccessToken(header.slice('Bearer '.length)); + const authUser = await loadAuthUser(userId); + if (!authUser) { + res.status(401).json({ error: 'User not found or inactive' }); + return; + } + req.user = authUser; + next(); + } catch { + res.status(401).json({ error: 'Invalid or expired token' }); + } +} diff --git a/src/middleware/branchScope.ts b/src/middleware/branchScope.ts new file mode 100644 index 0000000..c0729d8 --- /dev/null +++ b/src/middleware/branchScope.ts @@ -0,0 +1,15 @@ +import { NextFunction, Request, Response } from 'express'; +import { ForbiddenBranchScopeError, resolveBranchScope } from '../lib/branchFilter'; + +export function attachBranchScope(req: Request, res: Response, next: NextFunction): void { + try { + req.branchScope = resolveBranchScope(req); + next(); + } catch (error) { + if (error instanceof ForbiddenBranchScopeError) { + res.status(403).json({ error: error.message }); + return; + } + next(error); + } +} diff --git a/src/middleware/errorHandler.ts b/src/middleware/errorHandler.ts new file mode 100644 index 0000000..5802250 --- /dev/null +++ b/src/middleware/errorHandler.ts @@ -0,0 +1,43 @@ +import { NextFunction, Request, Response } from 'express'; +import { Prisma } from '@prisma/client'; +import { UnbalancedEntryError } from '../modules/gl/posting.types'; +import { ForbiddenBranchScopeError } from '../lib/branchFilter'; +import { ControlAccountNotFoundError } from '../lib/controlAccounts'; +import { ARDocumentStateError, ARAllocationError } from '../modules/ar/ar.errors'; +import { APDocumentStateError, APAllocationError } from '../modules/ap/ap.errors'; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function errorHandler(error: unknown, req: Request, res: Response, next: NextFunction): void { + if (error instanceof UnbalancedEntryError) { + res.status(422).json({ error: error.message }); + return; + } + if (error instanceof ForbiddenBranchScopeError) { + res.status(403).json({ error: error.message }); + return; + } + if ( + error instanceof ControlAccountNotFoundError || + error instanceof ARDocumentStateError || + error instanceof ARAllocationError || + error instanceof APDocumentStateError || + error instanceof APAllocationError + ) { + res.status(422).json({ error: error.message }); + return; + } + if (error instanceof Prisma.PrismaClientKnownRequestError) { + if (error.code === 'P2002') { + res.status(409).json({ error: 'A record with this value already exists', meta: error.meta }); + return; + } + if (error.code === 'P2025') { + res.status(404).json({ error: 'Record not found' }); + return; + } + } + + // eslint-disable-next-line no-console + console.error(error); + res.status(500).json({ error: 'Internal server error' }); +} diff --git a/src/middleware/rbac.ts b/src/middleware/rbac.ts new file mode 100644 index 0000000..a840369 --- /dev/null +++ b/src/middleware/rbac.ts @@ -0,0 +1,15 @@ +import { NextFunction, Request, Response } from 'express'; + +export function requirePermission(permissionKey: string) { + return (req: Request, res: Response, next: NextFunction): void => { + if (!req.user) { + res.status(401).json({ error: 'Not authenticated' }); + return; + } + if (!req.user.permissions.includes(permissionKey)) { + res.status(403).json({ error: `Missing permission: ${permissionKey}` }); + return; + } + next(); + }; +} diff --git a/src/middleware/validate.ts b/src/middleware/validate.ts new file mode 100644 index 0000000..4e402fb --- /dev/null +++ b/src/middleware/validate.ts @@ -0,0 +1,19 @@ +import { NextFunction, Request, Response } from 'express'; +import { AnyZodObject, ZodError } from 'zod'; + +type Section = 'body' | 'query' | 'params'; + +export function validate(schema: AnyZodObject, section: Section = 'body') { + return (req: Request, res: Response, next: NextFunction): void => { + try { + req[section] = schema.parse(req[section]); + next(); + } catch (error) { + if (error instanceof ZodError) { + res.status(400).json({ error: 'Validation failed', details: error.flatten() }); + return; + } + next(error); + } + }; +} diff --git a/src/modules/ap/ap.errors.ts b/src/modules/ap/ap.errors.ts new file mode 100644 index 0000000..970703c --- /dev/null +++ b/src/modules/ap/ap.errors.ts @@ -0,0 +1,13 @@ +export class APDocumentStateError extends Error { + constructor(message: string) { + super(message); + this.name = 'APDocumentStateError'; + } +} + +export class APAllocationError extends Error { + constructor(message: string) { + super(message); + this.name = 'APAllocationError'; + } +} diff --git a/src/modules/ap/apAllocations.service.ts b/src/modules/ap/apAllocations.service.ts new file mode 100644 index 0000000..47e7fe3 --- /dev/null +++ b/src/modules/ap/apAllocations.service.ts @@ -0,0 +1,67 @@ +import { prisma } from '../../lib/prisma'; +import { money } from '../../lib/money'; +import { APAllocationError, APDocumentStateError } from './ap.errors'; + +export interface AllocationInput { + invoiceId: number; + amount: number; +} + +/** + * Applies one or more (invoiceId, amount) allocations against a single payment or debit note. + * Purely sub-ledger bookkeeping — the cash/credit movement already hit the AP control account + * in aggregate when the payment/debit note was posted; this only records which invoice(s) it + * settles and reduces their outstanding balances. No GL entries are created here. + */ +export async function allocate(source: { paymentId?: number; debitNoteId?: number }, allocations: AllocationInput[]) { + if (allocations.length === 0) { + throw new APAllocationError('At least one allocation is required'); + } + + return prisma.$transaction(async (tx) => { + let remaining = money(0); + if (source.paymentId) { + const payment = await tx.aPPayment.findUniqueOrThrow({ where: { id: source.paymentId } }); + if (payment.status !== 'POSTED') throw new APDocumentStateError('Only a posted payment can be allocated'); + remaining = money(payment.unallocatedAmount); + } else if (source.debitNoteId) { + const debitNote = await tx.aPDebitNote.findUniqueOrThrow({ where: { id: source.debitNoteId } }); + if (debitNote.status !== 'POSTED') throw new APDocumentStateError('Only a posted debit note can be allocated'); + remaining = money(debitNote.balance); + } else { + throw new APAllocationError('An allocation must reference a payment or a debit note'); + } + + const totalRequested = allocations.reduce((sum, a) => sum.plus(money(a.amount)), money(0)); + if (totalRequested.greaterThan(remaining)) { + throw new APAllocationError(`Allocation total (${totalRequested.toFixed(2)}) exceeds the unallocated amount (${remaining.toFixed(2)})`); + } + + for (const line of allocations) { + const amount = money(line.amount); + if (amount.lessThanOrEqualTo(0)) { + throw new APAllocationError('Each allocation amount must be greater than zero'); + } + const invoice = await tx.aPInvoice.findUniqueOrThrow({ where: { id: line.invoiceId } }); + if (invoice.status !== 'POSTED') { + throw new APDocumentStateError(`Invoice ${invoice.invoiceNumber} is not posted and cannot receive an allocation`); + } + if (amount.greaterThan(invoice.balance)) { + throw new APAllocationError(`Allocation of ${amount.toFixed(2)} exceeds invoice ${invoice.invoiceNumber}'s balance of ${money(invoice.balance).toFixed(2)}`); + } + + await tx.aPAllocation.create({ + data: { invoiceId: line.invoiceId, paymentId: source.paymentId, debitNoteId: source.debitNoteId, amount }, + }); + await tx.aPInvoice.update({ where: { id: line.invoiceId }, data: { balance: { decrement: amount } } }); + } + + if (source.paymentId) { + await tx.aPPayment.update({ where: { id: source.paymentId }, data: { unallocatedAmount: { decrement: totalRequested } } }); + } else if (source.debitNoteId) { + await tx.aPDebitNote.update({ where: { id: source.debitNoteId }, data: { balance: { decrement: totalRequested } } }); + } + + return tx.aPAllocation.findMany({ where: source.paymentId ? { paymentId: source.paymentId } : { debitNoteId: source.debitNoteId } }); + }); +} diff --git a/src/modules/ap/apDebitNotes.controller.ts b/src/modules/ap/apDebitNotes.controller.ts new file mode 100644 index 0000000..bc4b114 --- /dev/null +++ b/src/modules/ap/apDebitNotes.controller.ts @@ -0,0 +1,59 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as apDebitNotesService from './apDebitNotes.service'; + +const debitNoteLineSchema = z.object({ + description: z.string().min(1), + quantity: z.number().positive(), + unitPrice: z.number().min(0), + expenseGLAccountId: z.number().int(), + taxCodeId: z.number().int().optional(), +}); + +export const createDebitNoteSchema = z.object({ + supplierId: z.number().int(), + debitNoteDate: z.string().datetime().or(z.string().date()), + reference: z.string().optional(), + reason: z.string().optional(), + lines: z.array(debitNoteLineSchema).min(1), +}); + +export const allocateDebitNoteSchema = z.object({ + allocations: z.array(z.object({ invoiceId: z.number().int(), amount: z.number().positive() })).min(1), +}); + +export async function createDebitNoteHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + const debitNote = await apDebitNotesService.createDebitNoteDraft(input, req.user!.id); + res.status(201).json(debitNote); +} + +export async function postDebitNoteHandler(req: Request, res: Response): Promise { + const debitNote = await apDebitNotesService.postDebitNote(Number(req.params.id), req.user!.id); + res.json(debitNote); +} + +export async function voidDebitNoteHandler(req: Request, res: Response): Promise { + const debitNote = await apDebitNotesService.voidDebitNoteDraft(Number(req.params.id)); + res.json(debitNote); +} + +export async function allocateDebitNoteHandler(req: Request, res: Response): Promise { + const { allocations } = req.body as z.infer; + const result = await apDebitNotesService.allocateDebitNote(Number(req.params.id), allocations); + res.status(201).json(result); +} + +export async function listDebitNotesHandler(req: Request, res: Response): Promise { + const supplierId = req.query.supplierId ? Number(req.query.supplierId) : undefined; + res.json(await apDebitNotesService.listDebitNotes(req.branchScope!, supplierId)); +} + +export async function getDebitNoteHandler(req: Request, res: Response): Promise { + const debitNote = await apDebitNotesService.getDebitNote(Number(req.params.id)); + if (!debitNote) { + res.status(404).json({ error: 'Debit note not found' }); + return; + } + res.json(debitNote); +} diff --git a/src/modules/ap/apDebitNotes.routes.ts b/src/modules/ap/apDebitNotes.routes.ts new file mode 100644 index 0000000..08b34d6 --- /dev/null +++ b/src/modules/ap/apDebitNotes.routes.ts @@ -0,0 +1,37 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + allocateDebitNoteHandler, + allocateDebitNoteSchema, + createDebitNoteHandler, + createDebitNoteSchema, + getDebitNoteHandler, + listDebitNotesHandler, + postDebitNoteHandler, + voidDebitNoteHandler, +} from './apDebitNotes.controller'; + +export const apDebitNotesRouter = Router(); + +apDebitNotesRouter.use(requireAuth); + +apDebitNotesRouter.get('/', attachBranchScope, asyncHandler(listDebitNotesHandler)); +apDebitNotesRouter.get('/:id', asyncHandler(getDebitNoteHandler)); +apDebitNotesRouter.post( + '/', + requirePermission('ap.debitnote.manage'), + validate(createDebitNoteSchema), + asyncHandler(createDebitNoteHandler), +); +apDebitNotesRouter.post('/:id/post', requirePermission('ap.debitnote.manage'), asyncHandler(postDebitNoteHandler)); +apDebitNotesRouter.post('/:id/void', requirePermission('ap.debitnote.manage'), asyncHandler(voidDebitNoteHandler)); +apDebitNotesRouter.post( + '/:id/allocations', + requirePermission('ap.debitnote.manage'), + validate(allocateDebitNoteSchema), + asyncHandler(allocateDebitNoteHandler), +); diff --git a/src/modules/ap/apDebitNotes.service.ts b/src/modules/ap/apDebitNotes.service.ts new file mode 100644 index 0000000..71aace9 --- /dev/null +++ b/src/modules/ap/apDebitNotes.service.ts @@ -0,0 +1,119 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; +import { sumLines, calcLine, postDebitNoteToGL } from './apPosting.service'; +import { nextNumber } from '../../lib/sequence'; +import { APDocumentStateError } from './ap.errors'; +import { allocate, AllocationInput } from './apAllocations.service'; + +export interface DebitNoteLineInput { + description: string; + quantity: number; + unitPrice: number; + expenseGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateDebitNoteInput { + supplierId: number; + debitNoteDate: string; + reference?: string; + reason?: string; + lines: DebitNoteLineInput[]; +} + +export async function createDebitNoteDraft(input: CreateDebitNoteInput, createdById: number) { + const supplier = await prisma.supplier.findUniqueOrThrow({ where: { id: input.supplierId } }); + + const taxCodeIds = input.lines.map((line) => line.taxCodeId).filter((id): id is number => id != null); + const taxCodes = await prisma.taxCode.findMany({ where: { id: { in: taxCodeIds } } }); + const taxCodeById = new Map(taxCodes.map((taxCode) => [taxCode.id, taxCode])); + + const computedLines = input.lines.map((line, index) => { + const rate = line.taxCodeId ? taxCodeById.get(line.taxCodeId) : undefined; + const { subtotal, tax, total } = calcLine(line.quantity, line.unitPrice, rate ? Number(rate.ratePercent) : null); + return { + lineNumber: index + 1, + description: line.description, + quantity: line.quantity, + unitPrice: line.unitPrice, + expenseGLAccountId: line.expenseGLAccountId, + taxCodeId: line.taxCodeId, + lineSubtotal: subtotal, + lineTax: tax, + lineTotal: total, + }; + }); + + const subtotal = sumLines(computedLines.map((line) => line.lineSubtotal)); + const taxTotal = sumLines(computedLines.map((line) => line.lineTax)); + const total = subtotal.plus(taxTotal); + + return prisma.$transaction(async (tx) => { + const debitNoteNumber = await nextNumber(tx, 'APDN', new Date(input.debitNoteDate).getFullYear()); + return tx.aPDebitNote.create({ + data: { + debitNoteNumber, + supplierId: supplier.id, + branchSegmentValueId: supplier.branchSegmentValueId, + debitNoteDate: new Date(input.debitNoteDate), + reference: input.reference, + reason: input.reason, + status: 'DRAFT', + subtotal, + taxTotal, + total, + balance: total, + createdById, + lines: { create: computedLines }, + }, + include: { lines: true, supplier: true }, + }); + }); +} + +export async function postDebitNote(id: number, createdById: number) { + const debitNote = await prisma.aPDebitNote.findUniqueOrThrow({ where: { id }, include: { lines: true, supplier: true } }); + if (debitNote.status !== 'DRAFT') { + throw new APDocumentStateError('Only draft debit notes can be posted'); + } + + const entry = await postDebitNoteToGL(debitNote, createdById); + + return prisma.aPDebitNote.update({ + where: { id }, + data: { status: 'POSTED', journalEntryId: entry.id }, + include: { lines: true, supplier: true }, + }); +} + +export async function voidDebitNoteDraft(id: number) { + const debitNote = await prisma.aPDebitNote.findUniqueOrThrow({ where: { id } }); + if (debitNote.status !== 'DRAFT') { + throw new APDocumentStateError('Only draft debit notes can be voided'); + } + return prisma.aPDebitNote.update({ where: { id }, data: { status: 'VOID' } }); +} + +export function allocateDebitNote(debitNoteId: number, allocations: AllocationInput[]) { + return allocate({ debitNoteId }, allocations); +} + +export function listDebitNotes(branchScope: BranchScope, supplierId?: number) { + return prisma.aPDebitNote.findMany({ + where: { ...branchWhere(branchScope), ...(supplierId ? { supplierId } : {}) }, + include: { supplier: true }, + orderBy: { debitNoteDate: 'desc' }, + take: 200, + }); +} + +export function getDebitNote(id: number) { + return prisma.aPDebitNote.findUnique({ + where: { id }, + include: { + lines: { include: { expenseGLAccount: true, taxCode: true } }, + supplier: true, + allocations: { include: { invoice: true } }, + }, + }); +} diff --git a/src/modules/ap/apInvoices.controller.ts b/src/modules/ap/apInvoices.controller.ts new file mode 100644 index 0000000..a225527 --- /dev/null +++ b/src/modules/ap/apInvoices.controller.ts @@ -0,0 +1,49 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as apInvoicesService from './apInvoices.service'; + +const invoiceLineSchema = z.object({ + description: z.string().min(1), + quantity: z.number().positive(), + unitPrice: z.number().min(0), + expenseGLAccountId: z.number().int(), + taxCodeId: z.number().int().optional(), +}); + +export const createInvoiceSchema = z.object({ + supplierId: z.number().int(), + invoiceDate: z.string().datetime().or(z.string().date()), + dueDate: z.string().datetime().or(z.string().date()), + supplierReference: z.string().optional(), + lines: z.array(invoiceLineSchema).min(1), +}); + +export async function createInvoiceHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + const invoice = await apInvoicesService.createInvoiceDraft(input, req.user!.id); + res.status(201).json(invoice); +} + +export async function postInvoiceHandler(req: Request, res: Response): Promise { + const invoice = await apInvoicesService.postInvoice(Number(req.params.id), req.user!.id); + res.json(invoice); +} + +export async function voidInvoiceHandler(req: Request, res: Response): Promise { + const invoice = await apInvoicesService.voidInvoiceDraft(Number(req.params.id)); + res.json(invoice); +} + +export async function listInvoicesHandler(req: Request, res: Response): Promise { + const supplierId = req.query.supplierId ? Number(req.query.supplierId) : undefined; + res.json(await apInvoicesService.listInvoices(req.branchScope!, supplierId)); +} + +export async function getInvoiceHandler(req: Request, res: Response): Promise { + const invoice = await apInvoicesService.getInvoice(Number(req.params.id)); + if (!invoice) { + res.status(404).json({ error: 'Invoice not found' }); + return; + } + res.json(invoice); +} diff --git a/src/modules/ap/apInvoices.routes.ts b/src/modules/ap/apInvoices.routes.ts new file mode 100644 index 0000000..125e79e --- /dev/null +++ b/src/modules/ap/apInvoices.routes.ts @@ -0,0 +1,24 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createInvoiceHandler, + createInvoiceSchema, + getInvoiceHandler, + listInvoicesHandler, + postInvoiceHandler, + voidInvoiceHandler, +} from './apInvoices.controller'; + +export const apInvoicesRouter = Router(); + +apInvoicesRouter.use(requireAuth); + +apInvoicesRouter.get('/', attachBranchScope, asyncHandler(listInvoicesHandler)); +apInvoicesRouter.get('/:id', asyncHandler(getInvoiceHandler)); +apInvoicesRouter.post('/', requirePermission('ap.invoice.manage'), validate(createInvoiceSchema), asyncHandler(createInvoiceHandler)); +apInvoicesRouter.post('/:id/post', requirePermission('ap.invoice.manage'), asyncHandler(postInvoiceHandler)); +apInvoicesRouter.post('/:id/void', requirePermission('ap.invoice.manage'), asyncHandler(voidInvoiceHandler)); diff --git a/src/modules/ap/apInvoices.service.ts b/src/modules/ap/apInvoices.service.ts new file mode 100644 index 0000000..1d6b726 --- /dev/null +++ b/src/modules/ap/apInvoices.service.ts @@ -0,0 +1,114 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; +import { sumLines, calcLine, postSupplierInvoiceToGL } from './apPosting.service'; +import { nextNumber } from '../../lib/sequence'; +import { APDocumentStateError } from './ap.errors'; + +export interface InvoiceLineInput { + description: string; + quantity: number; + unitPrice: number; + expenseGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateInvoiceInput { + supplierId: number; + invoiceDate: string; + dueDate: string; + supplierReference?: string; + lines: InvoiceLineInput[]; +} + +export async function createInvoiceDraft(input: CreateInvoiceInput, createdById: number) { + const supplier = await prisma.supplier.findUniqueOrThrow({ where: { id: input.supplierId } }); + + const taxCodeIds = input.lines.map((line) => line.taxCodeId).filter((id): id is number => id != null); + const taxCodes = await prisma.taxCode.findMany({ where: { id: { in: taxCodeIds } } }); + const taxCodeById = new Map(taxCodes.map((taxCode) => [taxCode.id, taxCode])); + + const computedLines = input.lines.map((line, index) => { + const rate = line.taxCodeId ? taxCodeById.get(line.taxCodeId) : undefined; + const { subtotal, tax, total } = calcLine(line.quantity, line.unitPrice, rate ? Number(rate.ratePercent) : null); + return { + lineNumber: index + 1, + description: line.description, + quantity: line.quantity, + unitPrice: line.unitPrice, + expenseGLAccountId: line.expenseGLAccountId, + taxCodeId: line.taxCodeId, + lineSubtotal: subtotal, + lineTax: tax, + lineTotal: total, + }; + }); + + const subtotal = sumLines(computedLines.map((line) => line.lineSubtotal)); + const taxTotal = sumLines(computedLines.map((line) => line.lineTax)); + const total = subtotal.plus(taxTotal); + + return prisma.$transaction(async (tx) => { + const invoiceNumber = await nextNumber(tx, 'APINV', new Date(input.invoiceDate).getFullYear()); + return tx.aPInvoice.create({ + data: { + invoiceNumber, + supplierId: supplier.id, + supplierReference: input.supplierReference, + branchSegmentValueId: supplier.branchSegmentValueId, + invoiceDate: new Date(input.invoiceDate), + dueDate: new Date(input.dueDate), + status: 'DRAFT', + subtotal, + taxTotal, + total, + balance: total, + createdById, + lines: { create: computedLines }, + }, + include: { lines: true, supplier: true }, + }); + }); +} + +export async function postInvoice(id: number, createdById: number) { + const invoice = await prisma.aPInvoice.findUniqueOrThrow({ where: { id }, include: { lines: true, supplier: true } }); + if (invoice.status !== 'DRAFT') { + throw new APDocumentStateError('Only draft invoices can be posted'); + } + + const entry = await postSupplierInvoiceToGL(invoice, createdById); + + return prisma.aPInvoice.update({ + where: { id }, + data: { status: 'POSTED', journalEntryId: entry.id }, + include: { lines: true, supplier: true }, + }); +} + +export async function voidInvoiceDraft(id: number) { + const invoice = await prisma.aPInvoice.findUniqueOrThrow({ where: { id } }); + if (invoice.status !== 'DRAFT') { + throw new APDocumentStateError('Only draft invoices can be voided — a posted invoice must be corrected with a debit note'); + } + return prisma.aPInvoice.update({ where: { id }, data: { status: 'VOID' } }); +} + +export function listInvoices(branchScope: BranchScope, supplierId?: number) { + return prisma.aPInvoice.findMany({ + where: { ...branchWhere(branchScope), ...(supplierId ? { supplierId } : {}) }, + include: { supplier: true }, + orderBy: { invoiceDate: 'desc' }, + take: 200, + }); +} + +export function getInvoice(id: number) { + return prisma.aPInvoice.findUnique({ + where: { id }, + include: { + lines: { include: { expenseGLAccount: true, taxCode: true } }, + supplier: true, + allocations: { include: { payment: true, debitNote: true } }, + }, + }); +} diff --git a/src/modules/ap/apPayments.controller.ts b/src/modules/ap/apPayments.controller.ts new file mode 100644 index 0000000..0821b43 --- /dev/null +++ b/src/modules/ap/apPayments.controller.ts @@ -0,0 +1,51 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as apPaymentsService from './apPayments.service'; + +export const createPaymentSchema = z.object({ + supplierId: z.number().int(), + paymentDate: z.string().datetime().or(z.string().date()), + amount: z.number().positive(), + bankGLAccountId: z.number().int(), + reference: z.string().optional(), +}); + +export const allocateSchema = z.object({ + allocations: z.array(z.object({ invoiceId: z.number().int(), amount: z.number().positive() })).min(1), +}); + +export async function createPaymentHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + const payment = await apPaymentsService.createPaymentDraft(input, req.user!.id); + res.status(201).json(payment); +} + +export async function postPaymentHandler(req: Request, res: Response): Promise { + const payment = await apPaymentsService.postPayment(Number(req.params.id), req.user!.id); + res.json(payment); +} + +export async function voidPaymentHandler(req: Request, res: Response): Promise { + const payment = await apPaymentsService.voidPaymentDraft(Number(req.params.id)); + res.json(payment); +} + +export async function allocatePaymentHandler(req: Request, res: Response): Promise { + const { allocations } = req.body as z.infer; + const result = await apPaymentsService.allocatePayment(Number(req.params.id), allocations); + res.status(201).json(result); +} + +export async function listPaymentsHandler(req: Request, res: Response): Promise { + const supplierId = req.query.supplierId ? Number(req.query.supplierId) : undefined; + res.json(await apPaymentsService.listPayments(req.branchScope!, supplierId)); +} + +export async function getPaymentHandler(req: Request, res: Response): Promise { + const payment = await apPaymentsService.getPayment(Number(req.params.id)); + if (!payment) { + res.status(404).json({ error: 'Payment not found' }); + return; + } + res.json(payment); +} diff --git a/src/modules/ap/apPayments.routes.ts b/src/modules/ap/apPayments.routes.ts new file mode 100644 index 0000000..d027aec --- /dev/null +++ b/src/modules/ap/apPayments.routes.ts @@ -0,0 +1,32 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + allocatePaymentHandler, + allocateSchema, + createPaymentHandler, + createPaymentSchema, + getPaymentHandler, + listPaymentsHandler, + postPaymentHandler, + voidPaymentHandler, +} from './apPayments.controller'; + +export const apPaymentsRouter = Router(); + +apPaymentsRouter.use(requireAuth); + +apPaymentsRouter.get('/', attachBranchScope, asyncHandler(listPaymentsHandler)); +apPaymentsRouter.get('/:id', asyncHandler(getPaymentHandler)); +apPaymentsRouter.post('/', requirePermission('ap.payment.manage'), validate(createPaymentSchema), asyncHandler(createPaymentHandler)); +apPaymentsRouter.post('/:id/post', requirePermission('ap.payment.manage'), asyncHandler(postPaymentHandler)); +apPaymentsRouter.post('/:id/void', requirePermission('ap.payment.manage'), asyncHandler(voidPaymentHandler)); +apPaymentsRouter.post( + '/:id/allocations', + requirePermission('ap.payment.manage'), + validate(allocateSchema), + asyncHandler(allocatePaymentHandler), +); diff --git a/src/modules/ap/apPayments.service.ts b/src/modules/ap/apPayments.service.ts new file mode 100644 index 0000000..3c0dcc6 --- /dev/null +++ b/src/modules/ap/apPayments.service.ts @@ -0,0 +1,82 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; +import { money } from '../../lib/money'; +import { nextNumber } from '../../lib/sequence'; +import { postPaymentToGL } from './apPosting.service'; +import { APDocumentStateError } from './ap.errors'; +import { allocate, AllocationInput } from './apAllocations.service'; + +export interface CreatePaymentInput { + supplierId: number; + paymentDate: string; + amount: number; + bankGLAccountId: number; + reference?: string; +} + +export async function createPaymentDraft(input: CreatePaymentInput, createdById: number) { + const supplier = await prisma.supplier.findUniqueOrThrow({ where: { id: input.supplierId } }); + const amount = money(input.amount); + + return prisma.$transaction(async (tx) => { + const paymentNumber = await nextNumber(tx, 'APPMT', new Date(input.paymentDate).getFullYear()); + return tx.aPPayment.create({ + data: { + paymentNumber, + supplierId: supplier.id, + branchSegmentValueId: supplier.branchSegmentValueId, + paymentDate: new Date(input.paymentDate), + amount, + unallocatedAmount: amount, + bankGLAccountId: input.bankGLAccountId, + reference: input.reference, + status: 'DRAFT', + createdById, + }, + include: { supplier: true, bankGLAccount: true }, + }); + }); +} + +export async function postPayment(id: number, createdById: number) { + const payment = await prisma.aPPayment.findUniqueOrThrow({ where: { id }, include: { supplier: true } }); + if (payment.status !== 'DRAFT') { + throw new APDocumentStateError('Only draft payments can be posted'); + } + + const entry = await postPaymentToGL(payment, createdById); + + return prisma.aPPayment.update({ + where: { id }, + data: { status: 'POSTED', journalEntryId: entry.id }, + include: { supplier: true, bankGLAccount: true }, + }); +} + +export async function voidPaymentDraft(id: number) { + const payment = await prisma.aPPayment.findUniqueOrThrow({ where: { id } }); + if (payment.status !== 'DRAFT') { + throw new APDocumentStateError('Only draft payments can be voided'); + } + return prisma.aPPayment.update({ where: { id }, data: { status: 'VOID' } }); +} + +export function allocatePayment(paymentId: number, allocations: AllocationInput[]) { + return allocate({ paymentId }, allocations); +} + +export function listPayments(branchScope: BranchScope, supplierId?: number) { + return prisma.aPPayment.findMany({ + where: { ...branchWhere(branchScope), ...(supplierId ? { supplierId } : {}) }, + include: { supplier: true, bankGLAccount: true }, + orderBy: { paymentDate: 'desc' }, + take: 200, + }); +} + +export function getPayment(id: number) { + return prisma.aPPayment.findUnique({ + where: { id }, + include: { supplier: true, bankGLAccount: true, allocations: { include: { invoice: true } } }, + }); +} diff --git a/src/modules/ap/apPosting.service.ts b/src/modules/ap/apPosting.service.ts new file mode 100644 index 0000000..4a9d2db --- /dev/null +++ b/src/modules/ap/apPosting.service.ts @@ -0,0 +1,161 @@ +import { APDebitNote, APDebitNoteLine, APInvoice, APInvoiceLine, APPayment, JournalEntry, Supplier } from '@prisma/client'; +import { prisma } from '../../lib/prisma'; +import { money, sum, ZERO } from '../../lib/money'; +import { resolveControlAccount } from '../../lib/controlAccounts'; +import { PostingService } from '../gl/posting.service'; +import { JournalEntryDraft, JournalLineDraft } from '../gl/posting.types'; + +type InvoiceForPosting = APInvoice & { lines: APInvoiceLine[]; supplier: Supplier }; +type DebitNoteForPosting = APDebitNote & { lines: APDebitNoteLine[]; supplier: Supplier }; +type PaymentForPosting = APPayment & { supplier: Supplier }; + +function groupByAccount(entries: { glAccountId: number; amount: import('../../lib/money').Money }[]) { + const byAccount = new Map(); + for (const entry of entries) { + byAccount.set(entry.glAccountId, (byAccount.get(entry.glAccountId) ?? ZERO).plus(entry.amount)); + } + return byAccount; +} + +/** Dr expense account(s) (subtotal) + Dr Input Tax (tax) / Cr AP Control (total). */ +export async function postSupplierInvoiceToGL(invoice: InvoiceForPosting, createdById: number): Promise { + const apAccount = await resolveControlAccount(prisma, invoice.branchSegmentValueId, 'AP'); + const taxTotal = money(invoice.taxTotal); + const taxAccount = taxTotal.greaterThan(0) ? await resolveControlAccount(prisma, invoice.branchSegmentValueId, 'TAX_INPUT') : null; + + const expenseByAccount = groupByAccount( + invoice.lines.map((line) => ({ glAccountId: line.expenseGLAccountId, amount: money(line.lineSubtotal) })), + ); + + const lines: JournalLineDraft[] = [ + ...Array.from(expenseByAccount.entries()).map(([glAccountId, amount]) => ({ + glAccountId, + debit: amount, + credit: 0, + branchSegmentValueId: invoice.branchSegmentValueId, + description: `Supplier invoice ${invoice.invoiceNumber} — ${invoice.supplier.name}`, + })), + ]; + if (taxAccount && taxTotal.greaterThan(0)) { + lines.push({ + glAccountId: taxAccount.id, + debit: taxTotal, + credit: 0, + branchSegmentValueId: invoice.branchSegmentValueId, + description: `Input tax on supplier invoice ${invoice.invoiceNumber}`, + }); + } + lines.push({ + glAccountId: apAccount.id, + debit: 0, + credit: invoice.total, + branchSegmentValueId: invoice.branchSegmentValueId, + apInvoiceId: invoice.id, + description: `Supplier invoice ${invoice.invoiceNumber} — ${invoice.supplier.name}`, + }); + + const draft: JournalEntryDraft = { + journalCode: 'PURCHASES', + entryDate: invoice.invoiceDate, + description: `AP Invoice ${invoice.invoiceNumber} — ${invoice.supplier.name}`, + sourceModule: 'AP', + sourceType: 'APInvoice', + sourceId: invoice.id, + createdById, + lines, + }; + return PostingService.postEntry(draft); +} + +/** Reverse of a supplier invoice: Dr AP Control / Cr expense account(s) + Cr Input Tax. */ +export async function postDebitNoteToGL(debitNote: DebitNoteForPosting, createdById: number): Promise { + const apAccount = await resolveControlAccount(prisma, debitNote.branchSegmentValueId, 'AP'); + const taxTotal = money(debitNote.taxTotal); + const taxAccount = taxTotal.greaterThan(0) + ? await resolveControlAccount(prisma, debitNote.branchSegmentValueId, 'TAX_INPUT') + : null; + + const expenseByAccount = groupByAccount( + debitNote.lines.map((line) => ({ glAccountId: line.expenseGLAccountId, amount: money(line.lineSubtotal) })), + ); + + const lines: JournalLineDraft[] = [ + { + glAccountId: apAccount.id, + debit: debitNote.total, + credit: 0, + branchSegmentValueId: debitNote.branchSegmentValueId, + description: `Debit note ${debitNote.debitNoteNumber} — ${debitNote.supplier.name}`, + }, + ...Array.from(expenseByAccount.entries()).map(([glAccountId, amount]) => ({ + glAccountId, + debit: 0, + credit: amount, + branchSegmentValueId: debitNote.branchSegmentValueId, + description: `Debit note ${debitNote.debitNoteNumber} — ${debitNote.supplier.name}`, + })), + ]; + if (taxAccount && taxTotal.greaterThan(0)) { + lines.push({ + glAccountId: taxAccount.id, + debit: 0, + credit: taxTotal, + branchSegmentValueId: debitNote.branchSegmentValueId, + description: `Input tax reversed on debit note ${debitNote.debitNoteNumber}`, + }); + } + + const draft: JournalEntryDraft = { + journalCode: 'PURCHASES', + entryDate: debitNote.debitNoteDate, + description: `AP Debit Note ${debitNote.debitNoteNumber} — ${debitNote.supplier.name}`, + sourceModule: 'AP', + sourceType: 'APDebitNote', + sourceId: debitNote.id, + createdById, + lines, + }; + return PostingService.postEntry(draft); +} + +/** Dr AP Control / Cr Bank — allocation against specific invoices happens separately, sub-ledger only. */ +export async function postPaymentToGL(payment: PaymentForPosting, createdById: number): Promise { + const apAccount = await resolveControlAccount(prisma, payment.branchSegmentValueId, 'AP'); + + const draft: JournalEntryDraft = { + journalCode: 'CASH_PAYMENT', + entryDate: payment.paymentDate, + description: `AP Payment ${payment.paymentNumber} — ${payment.supplier.name}`, + sourceModule: 'AP', + sourceType: 'APPayment', + sourceId: payment.id, + createdById, + lines: [ + { + glAccountId: apAccount.id, + debit: payment.amount, + credit: 0, + branchSegmentValueId: payment.branchSegmentValueId, + description: `Payment ${payment.paymentNumber} — ${payment.supplier.name}`, + }, + { + glAccountId: payment.bankGLAccountId, + debit: 0, + credit: payment.amount, + branchSegmentValueId: payment.branchSegmentValueId, + description: `Payment ${payment.paymentNumber} — ${payment.supplier.name}`, + }, + ], + }; + return PostingService.postEntry(draft); +} + +export function calcLine(quantity: number, unitPrice: number, ratePercent: number | null) { + const subtotal = money(quantity).times(unitPrice).toDecimalPlaces(2); + const tax = ratePercent ? subtotal.times(ratePercent).dividedBy(100).toDecimalPlaces(2) : ZERO; + return { subtotal, tax, total: subtotal.plus(tax) }; +} + +export function sumLines(values: import('../../lib/money').Money[]) { + return sum(values); +} diff --git a/src/modules/ap/suppliers.controller.ts b/src/modules/ap/suppliers.controller.ts new file mode 100644 index 0000000..ad3fe3c --- /dev/null +++ b/src/modules/ap/suppliers.controller.ts @@ -0,0 +1,39 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as suppliersService from './suppliers.service'; + +export const createSupplierSchema = z.object({ + code: z.string().min(1), + name: z.string().min(1), + email: z.string().email().optional(), + phone: z.string().optional(), + address: z.string().optional(), + taxNumber: z.string().optional(), + branchSegmentValueId: z.number().int(), + paymentTermsDays: z.number().int().min(0).optional(), +}); + +export const updateSupplierSchema = createSupplierSchema.partial().extend({ isActive: z.boolean().optional() }); + +export async function listSuppliersHandler(req: Request, res: Response): Promise { + res.json(await suppliersService.listSuppliers(req.branchScope!)); +} + +export async function createSupplierHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await suppliersService.createSupplier(input)); +} + +export async function updateSupplierHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.json(await suppliersService.updateSupplier(Number(req.params.id), input)); +} + +export async function getSupplierHandler(req: Request, res: Response): Promise { + const result = await suppliersService.getSupplier(Number(req.params.id)); + if (!result) { + res.status(404).json({ error: 'Supplier not found' }); + return; + } + res.json(result); +} diff --git a/src/modules/ap/suppliers.routes.ts b/src/modules/ap/suppliers.routes.ts new file mode 100644 index 0000000..e1574da --- /dev/null +++ b/src/modules/ap/suppliers.routes.ts @@ -0,0 +1,28 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createSupplierHandler, + createSupplierSchema, + getSupplierHandler, + listSuppliersHandler, + updateSupplierHandler, + updateSupplierSchema, +} from './suppliers.controller'; + +export const suppliersRouter = Router(); + +suppliersRouter.use(requireAuth); + +suppliersRouter.get('/', attachBranchScope, asyncHandler(listSuppliersHandler)); +suppliersRouter.get('/:id', asyncHandler(getSupplierHandler)); +suppliersRouter.post('/', requirePermission('ap.supplier.manage'), validate(createSupplierSchema), asyncHandler(createSupplierHandler)); +suppliersRouter.put( + '/:id', + requirePermission('ap.supplier.manage'), + validate(updateSupplierSchema), + asyncHandler(updateSupplierHandler), +); diff --git a/src/modules/ap/suppliers.service.ts b/src/modules/ap/suppliers.service.ts new file mode 100644 index 0000000..b5773ad --- /dev/null +++ b/src/modules/ap/suppliers.service.ts @@ -0,0 +1,57 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; + +export interface SupplierInput { + code: string; + name: string; + email?: string; + phone?: string; + address?: string; + taxNumber?: string; + branchSegmentValueId: number; + paymentTermsDays?: number; +} + +export function listSuppliers(branchScope: BranchScope) { + return prisma.supplier.findMany({ + where: branchWhere(branchScope), + orderBy: { name: 'asc' }, + }); +} + +export function createSupplier(input: SupplierInput) { + return prisma.supplier.create({ data: input }); +} + +export function updateSupplier(id: number, input: Partial & { isActive?: boolean }) { + return prisma.supplier.update({ where: { id }, data: input }); +} + +export async function getSupplier(id: number) { + const supplier = await prisma.supplier.findUnique({ where: { id } }); + if (!supplier) return null; + + const [invoices, debitNotes, payments] = await Promise.all([ + prisma.aPInvoice.findMany({ + where: { supplierId: id, status: { not: 'DRAFT' } }, + orderBy: { invoiceDate: 'desc' }, + include: { lines: true }, + }), + prisma.aPDebitNote.findMany({ + where: { supplierId: id, status: { not: 'DRAFT' } }, + orderBy: { debitNoteDate: 'desc' }, + include: { lines: true }, + }), + prisma.aPPayment.findMany({ + where: { supplierId: id, status: { not: 'DRAFT' } }, + orderBy: { paymentDate: 'desc' }, + }), + ]); + + const outstandingBalance = invoices.reduce((sum, invoice) => sum + Number(invoice.balance), 0); + const overdueBalance = invoices + .filter((invoice) => Number(invoice.balance) > 0 && invoice.dueDate < new Date()) + .reduce((sum, invoice) => sum + Number(invoice.balance), 0); + + return { supplier, invoices, debitNotes, payments, outstandingBalance, overdueBalance }; +} diff --git a/src/modules/ar/ar.errors.ts b/src/modules/ar/ar.errors.ts new file mode 100644 index 0000000..1ff78ea --- /dev/null +++ b/src/modules/ar/ar.errors.ts @@ -0,0 +1,13 @@ +export class ARDocumentStateError extends Error { + constructor(message: string) { + super(message); + this.name = 'ARDocumentStateError'; + } +} + +export class ARAllocationError extends Error { + constructor(message: string) { + super(message); + this.name = 'ARAllocationError'; + } +} diff --git a/src/modules/ar/arAllocations.service.ts b/src/modules/ar/arAllocations.service.ts new file mode 100644 index 0000000..a130e3d --- /dev/null +++ b/src/modules/ar/arAllocations.service.ts @@ -0,0 +1,70 @@ +import { prisma } from '../../lib/prisma'; +import { money } from '../../lib/money'; +import { ARAllocationError, ARDocumentStateError } from './ar.errors'; + +export interface AllocationInput { + invoiceId: number; + amount: number; +} + +/** + * Applies one or more (invoiceId, amount) allocations against a single receipt or credit note. + * Purely sub-ledger bookkeeping — the cash/credit movement already hit the AR control account + * in aggregate when the receipt/credit note was posted; this only records which invoice(s) it + * settles and reduces their outstanding balances. No GL entries are created here. + */ +export async function allocate( + source: { receiptId?: number; creditNoteId?: number }, + allocations: AllocationInput[], +) { + if (allocations.length === 0) { + throw new ARAllocationError('At least one allocation is required'); + } + + return prisma.$transaction(async (tx) => { + let remaining = money(0); + if (source.receiptId) { + const receipt = await tx.aRReceipt.findUniqueOrThrow({ where: { id: source.receiptId } }); + if (receipt.status !== 'POSTED') throw new ARDocumentStateError('Only a posted receipt can be allocated'); + remaining = money(receipt.unallocatedAmount); + } else if (source.creditNoteId) { + const creditNote = await tx.aRCreditNote.findUniqueOrThrow({ where: { id: source.creditNoteId } }); + if (creditNote.status !== 'POSTED') throw new ARDocumentStateError('Only a posted credit note can be allocated'); + remaining = money(creditNote.balance); + } else { + throw new ARAllocationError('An allocation must reference a receipt or a credit note'); + } + + const totalRequested = allocations.reduce((sum, a) => sum.plus(money(a.amount)), money(0)); + if (totalRequested.greaterThan(remaining)) { + throw new ARAllocationError(`Allocation total (${totalRequested.toFixed(2)}) exceeds the unallocated amount (${remaining.toFixed(2)})`); + } + + for (const line of allocations) { + const amount = money(line.amount); + if (amount.lessThanOrEqualTo(0)) { + throw new ARAllocationError('Each allocation amount must be greater than zero'); + } + const invoice = await tx.aRInvoice.findUniqueOrThrow({ where: { id: line.invoiceId } }); + if (invoice.status !== 'POSTED') { + throw new ARDocumentStateError(`Invoice ${invoice.invoiceNumber} is not posted and cannot receive an allocation`); + } + if (amount.greaterThan(invoice.balance)) { + throw new ARAllocationError(`Allocation of ${amount.toFixed(2)} exceeds invoice ${invoice.invoiceNumber}'s balance of ${money(invoice.balance).toFixed(2)}`); + } + + await tx.aRAllocation.create({ + data: { invoiceId: line.invoiceId, receiptId: source.receiptId, creditNoteId: source.creditNoteId, amount }, + }); + await tx.aRInvoice.update({ where: { id: line.invoiceId }, data: { balance: { decrement: amount } } }); + } + + if (source.receiptId) { + await tx.aRReceipt.update({ where: { id: source.receiptId }, data: { unallocatedAmount: { decrement: totalRequested } } }); + } else if (source.creditNoteId) { + await tx.aRCreditNote.update({ where: { id: source.creditNoteId }, data: { balance: { decrement: totalRequested } } }); + } + + return tx.aRAllocation.findMany({ where: source.receiptId ? { receiptId: source.receiptId } : { creditNoteId: source.creditNoteId } }); + }); +} diff --git a/src/modules/ar/arCreditNotes.controller.ts b/src/modules/ar/arCreditNotes.controller.ts new file mode 100644 index 0000000..1580a44 --- /dev/null +++ b/src/modules/ar/arCreditNotes.controller.ts @@ -0,0 +1,59 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as arCreditNotesService from './arCreditNotes.service'; + +const creditNoteLineSchema = z.object({ + description: z.string().min(1), + quantity: z.number().positive(), + unitPrice: z.number().min(0), + revenueGLAccountId: z.number().int(), + taxCodeId: z.number().int().optional(), +}); + +export const createCreditNoteSchema = z.object({ + customerId: z.number().int(), + creditNoteDate: z.string().datetime().or(z.string().date()), + reference: z.string().optional(), + reason: z.string().optional(), + lines: z.array(creditNoteLineSchema).min(1), +}); + +export const allocateCreditNoteSchema = z.object({ + allocations: z.array(z.object({ invoiceId: z.number().int(), amount: z.number().positive() })).min(1), +}); + +export async function createCreditNoteHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + const creditNote = await arCreditNotesService.createCreditNoteDraft(input, req.user!.id); + res.status(201).json(creditNote); +} + +export async function postCreditNoteHandler(req: Request, res: Response): Promise { + const creditNote = await arCreditNotesService.postCreditNote(Number(req.params.id), req.user!.id); + res.json(creditNote); +} + +export async function voidCreditNoteHandler(req: Request, res: Response): Promise { + const creditNote = await arCreditNotesService.voidCreditNoteDraft(Number(req.params.id)); + res.json(creditNote); +} + +export async function allocateCreditNoteHandler(req: Request, res: Response): Promise { + const { allocations } = req.body as z.infer; + const result = await arCreditNotesService.allocateCreditNote(Number(req.params.id), allocations); + res.status(201).json(result); +} + +export async function listCreditNotesHandler(req: Request, res: Response): Promise { + const customerId = req.query.customerId ? Number(req.query.customerId) : undefined; + res.json(await arCreditNotesService.listCreditNotes(req.branchScope!, customerId)); +} + +export async function getCreditNoteHandler(req: Request, res: Response): Promise { + const creditNote = await arCreditNotesService.getCreditNote(Number(req.params.id)); + if (!creditNote) { + res.status(404).json({ error: 'Credit note not found' }); + return; + } + res.json(creditNote); +} diff --git a/src/modules/ar/arCreditNotes.routes.ts b/src/modules/ar/arCreditNotes.routes.ts new file mode 100644 index 0000000..5fb9f5c --- /dev/null +++ b/src/modules/ar/arCreditNotes.routes.ts @@ -0,0 +1,37 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + allocateCreditNoteHandler, + allocateCreditNoteSchema, + createCreditNoteHandler, + createCreditNoteSchema, + getCreditNoteHandler, + listCreditNotesHandler, + postCreditNoteHandler, + voidCreditNoteHandler, +} from './arCreditNotes.controller'; + +export const arCreditNotesRouter = Router(); + +arCreditNotesRouter.use(requireAuth); + +arCreditNotesRouter.get('/', attachBranchScope, asyncHandler(listCreditNotesHandler)); +arCreditNotesRouter.get('/:id', asyncHandler(getCreditNoteHandler)); +arCreditNotesRouter.post( + '/', + requirePermission('ar.creditnote.manage'), + validate(createCreditNoteSchema), + asyncHandler(createCreditNoteHandler), +); +arCreditNotesRouter.post('/:id/post', requirePermission('ar.creditnote.manage'), asyncHandler(postCreditNoteHandler)); +arCreditNotesRouter.post('/:id/void', requirePermission('ar.creditnote.manage'), asyncHandler(voidCreditNoteHandler)); +arCreditNotesRouter.post( + '/:id/allocations', + requirePermission('ar.creditnote.manage'), + validate(allocateCreditNoteSchema), + asyncHandler(allocateCreditNoteHandler), +); diff --git a/src/modules/ar/arCreditNotes.service.ts b/src/modules/ar/arCreditNotes.service.ts new file mode 100644 index 0000000..8f6d0b4 --- /dev/null +++ b/src/modules/ar/arCreditNotes.service.ts @@ -0,0 +1,119 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; +import { sumLines, calcLine, postCreditNoteToGL } from './arPosting.service'; +import { nextNumber } from '../../lib/sequence'; +import { ARDocumentStateError } from './ar.errors'; +import { allocate, AllocationInput } from './arAllocations.service'; + +export interface CreditNoteLineInput { + description: string; + quantity: number; + unitPrice: number; + revenueGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateCreditNoteInput { + customerId: number; + creditNoteDate: string; + reference?: string; + reason?: string; + lines: CreditNoteLineInput[]; +} + +export async function createCreditNoteDraft(input: CreateCreditNoteInput, createdById: number) { + const customer = await prisma.customer.findUniqueOrThrow({ where: { id: input.customerId } }); + + const taxCodeIds = input.lines.map((line) => line.taxCodeId).filter((id): id is number => id != null); + const taxCodes = await prisma.taxCode.findMany({ where: { id: { in: taxCodeIds } } }); + const taxCodeById = new Map(taxCodes.map((taxCode) => [taxCode.id, taxCode])); + + const computedLines = input.lines.map((line, index) => { + const rate = line.taxCodeId ? taxCodeById.get(line.taxCodeId) : undefined; + const { subtotal, tax, total } = calcLine(line.quantity, line.unitPrice, rate ? Number(rate.ratePercent) : null); + return { + lineNumber: index + 1, + description: line.description, + quantity: line.quantity, + unitPrice: line.unitPrice, + revenueGLAccountId: line.revenueGLAccountId, + taxCodeId: line.taxCodeId, + lineSubtotal: subtotal, + lineTax: tax, + lineTotal: total, + }; + }); + + const subtotal = sumLines(computedLines.map((line) => line.lineSubtotal)); + const taxTotal = sumLines(computedLines.map((line) => line.lineTax)); + const total = subtotal.plus(taxTotal); + + return prisma.$transaction(async (tx) => { + const creditNoteNumber = await nextNumber(tx, 'ARCN', new Date(input.creditNoteDate).getFullYear()); + return tx.aRCreditNote.create({ + data: { + creditNoteNumber, + customerId: customer.id, + branchSegmentValueId: customer.branchSegmentValueId, + creditNoteDate: new Date(input.creditNoteDate), + reference: input.reference, + reason: input.reason, + status: 'DRAFT', + subtotal, + taxTotal, + total, + balance: total, + createdById, + lines: { create: computedLines }, + }, + include: { lines: true, customer: true }, + }); + }); +} + +export async function postCreditNote(id: number, createdById: number) { + const creditNote = await prisma.aRCreditNote.findUniqueOrThrow({ where: { id }, include: { lines: true, customer: true } }); + if (creditNote.status !== 'DRAFT') { + throw new ARDocumentStateError('Only draft credit notes can be posted'); + } + + const entry = await postCreditNoteToGL(creditNote, createdById); + + return prisma.aRCreditNote.update({ + where: { id }, + data: { status: 'POSTED', journalEntryId: entry.id }, + include: { lines: true, customer: true }, + }); +} + +export async function voidCreditNoteDraft(id: number) { + const creditNote = await prisma.aRCreditNote.findUniqueOrThrow({ where: { id } }); + if (creditNote.status !== 'DRAFT') { + throw new ARDocumentStateError('Only draft credit notes can be voided'); + } + return prisma.aRCreditNote.update({ where: { id }, data: { status: 'VOID' } }); +} + +export function allocateCreditNote(creditNoteId: number, allocations: AllocationInput[]) { + return allocate({ creditNoteId }, allocations); +} + +export function listCreditNotes(branchScope: BranchScope, customerId?: number) { + return prisma.aRCreditNote.findMany({ + where: { ...branchWhere(branchScope), ...(customerId ? { customerId } : {}) }, + include: { customer: true }, + orderBy: { creditNoteDate: 'desc' }, + take: 200, + }); +} + +export function getCreditNote(id: number) { + return prisma.aRCreditNote.findUnique({ + where: { id }, + include: { + lines: { include: { revenueGLAccount: true, taxCode: true } }, + customer: true, + allocations: { include: { invoice: true } }, + }, + }); +} diff --git a/src/modules/ar/arInvoices.controller.ts b/src/modules/ar/arInvoices.controller.ts new file mode 100644 index 0000000..ba4bf34 --- /dev/null +++ b/src/modules/ar/arInvoices.controller.ts @@ -0,0 +1,49 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as arInvoicesService from './arInvoices.service'; + +const invoiceLineSchema = z.object({ + description: z.string().min(1), + quantity: z.number().positive(), + unitPrice: z.number().min(0), + revenueGLAccountId: z.number().int(), + taxCodeId: z.number().int().optional(), +}); + +export const createInvoiceSchema = z.object({ + customerId: z.number().int(), + invoiceDate: z.string().datetime().or(z.string().date()), + dueDate: z.string().datetime().or(z.string().date()), + reference: z.string().optional(), + lines: z.array(invoiceLineSchema).min(1), +}); + +export async function createInvoiceHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + const invoice = await arInvoicesService.createInvoiceDraft(input, req.user!.id); + res.status(201).json(invoice); +} + +export async function postInvoiceHandler(req: Request, res: Response): Promise { + const invoice = await arInvoicesService.postInvoice(Number(req.params.id), req.user!.id); + res.json(invoice); +} + +export async function voidInvoiceHandler(req: Request, res: Response): Promise { + const invoice = await arInvoicesService.voidInvoiceDraft(Number(req.params.id)); + res.json(invoice); +} + +export async function listInvoicesHandler(req: Request, res: Response): Promise { + const customerId = req.query.customerId ? Number(req.query.customerId) : undefined; + res.json(await arInvoicesService.listInvoices(req.branchScope!, customerId)); +} + +export async function getInvoiceHandler(req: Request, res: Response): Promise { + const invoice = await arInvoicesService.getInvoice(Number(req.params.id)); + if (!invoice) { + res.status(404).json({ error: 'Invoice not found' }); + return; + } + res.json(invoice); +} diff --git a/src/modules/ar/arInvoices.routes.ts b/src/modules/ar/arInvoices.routes.ts new file mode 100644 index 0000000..2251e51 --- /dev/null +++ b/src/modules/ar/arInvoices.routes.ts @@ -0,0 +1,24 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createInvoiceHandler, + createInvoiceSchema, + getInvoiceHandler, + listInvoicesHandler, + postInvoiceHandler, + voidInvoiceHandler, +} from './arInvoices.controller'; + +export const arInvoicesRouter = Router(); + +arInvoicesRouter.use(requireAuth); + +arInvoicesRouter.get('/', attachBranchScope, asyncHandler(listInvoicesHandler)); +arInvoicesRouter.get('/:id', asyncHandler(getInvoiceHandler)); +arInvoicesRouter.post('/', requirePermission('ar.invoice.manage'), validate(createInvoiceSchema), asyncHandler(createInvoiceHandler)); +arInvoicesRouter.post('/:id/post', requirePermission('ar.invoice.manage'), asyncHandler(postInvoiceHandler)); +arInvoicesRouter.post('/:id/void', requirePermission('ar.invoice.manage'), asyncHandler(voidInvoiceHandler)); diff --git a/src/modules/ar/arInvoices.service.ts b/src/modules/ar/arInvoices.service.ts new file mode 100644 index 0000000..556957f --- /dev/null +++ b/src/modules/ar/arInvoices.service.ts @@ -0,0 +1,114 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; +import { sumLines, calcLine, postInvoiceToGL } from './arPosting.service'; +import { nextNumber } from '../../lib/sequence'; +import { ARDocumentStateError } from './ar.errors'; + +export interface InvoiceLineInput { + description: string; + quantity: number; + unitPrice: number; + revenueGLAccountId: number; + taxCodeId?: number; +} + +export interface CreateInvoiceInput { + customerId: number; + invoiceDate: string; + dueDate: string; + reference?: string; + lines: InvoiceLineInput[]; +} + +export async function createInvoiceDraft(input: CreateInvoiceInput, createdById: number) { + const customer = await prisma.customer.findUniqueOrThrow({ where: { id: input.customerId } }); + + const taxCodeIds = input.lines.map((line) => line.taxCodeId).filter((id): id is number => id != null); + const taxCodes = await prisma.taxCode.findMany({ where: { id: { in: taxCodeIds } } }); + const taxCodeById = new Map(taxCodes.map((taxCode) => [taxCode.id, taxCode])); + + const computedLines = input.lines.map((line, index) => { + const rate = line.taxCodeId ? taxCodeById.get(line.taxCodeId) : undefined; + const { subtotal, tax, total } = calcLine(line.quantity, line.unitPrice, rate ? Number(rate.ratePercent) : null); + return { + lineNumber: index + 1, + description: line.description, + quantity: line.quantity, + unitPrice: line.unitPrice, + revenueGLAccountId: line.revenueGLAccountId, + taxCodeId: line.taxCodeId, + lineSubtotal: subtotal, + lineTax: tax, + lineTotal: total, + }; + }); + + const subtotal = sumLines(computedLines.map((line) => line.lineSubtotal)); + const taxTotal = sumLines(computedLines.map((line) => line.lineTax)); + const total = subtotal.plus(taxTotal); + + return prisma.$transaction(async (tx) => { + const invoiceNumber = await nextNumber(tx, 'ARINV', new Date(input.invoiceDate).getFullYear()); + return tx.aRInvoice.create({ + data: { + invoiceNumber, + customerId: customer.id, + branchSegmentValueId: customer.branchSegmentValueId, + invoiceDate: new Date(input.invoiceDate), + dueDate: new Date(input.dueDate), + reference: input.reference, + status: 'DRAFT', + subtotal, + taxTotal, + total, + balance: total, + createdById, + lines: { create: computedLines }, + }, + include: { lines: true, customer: true }, + }); + }); +} + +export async function postInvoice(id: number, createdById: number) { + const invoice = await prisma.aRInvoice.findUniqueOrThrow({ where: { id }, include: { lines: true, customer: true } }); + if (invoice.status !== 'DRAFT') { + throw new ARDocumentStateError('Only draft invoices can be posted'); + } + + const entry = await postInvoiceToGL(invoice, createdById); + + return prisma.aRInvoice.update({ + where: { id }, + data: { status: 'POSTED', journalEntryId: entry.id }, + include: { lines: true, customer: true }, + }); +} + +export async function voidInvoiceDraft(id: number) { + const invoice = await prisma.aRInvoice.findUniqueOrThrow({ where: { id } }); + if (invoice.status !== 'DRAFT') { + throw new ARDocumentStateError('Only draft invoices can be voided — a posted invoice must be corrected with a credit note'); + } + return prisma.aRInvoice.update({ where: { id }, data: { status: 'VOID' } }); +} + +export function listInvoices(branchScope: BranchScope, customerId?: number) { + return prisma.aRInvoice.findMany({ + where: { ...branchWhere(branchScope), ...(customerId ? { customerId } : {}) }, + include: { customer: true }, + orderBy: { invoiceDate: 'desc' }, + take: 200, + }); +} + +export function getInvoice(id: number) { + return prisma.aRInvoice.findUnique({ + where: { id }, + include: { + lines: { include: { revenueGLAccount: true, taxCode: true } }, + customer: true, + allocations: { include: { receipt: true, creditNote: true } }, + }, + }); +} diff --git a/src/modules/ar/arPosting.service.ts b/src/modules/ar/arPosting.service.ts new file mode 100644 index 0000000..ff6d4b7 --- /dev/null +++ b/src/modules/ar/arPosting.service.ts @@ -0,0 +1,162 @@ +import { ARCreditNote, ARCreditNoteLine, ARInvoice, ARInvoiceLine, ARReceipt, Customer, JournalEntry } from '@prisma/client'; +import { prisma } from '../../lib/prisma'; +import { money, sum, ZERO } from '../../lib/money'; +import { resolveControlAccount } from '../../lib/controlAccounts'; +import { PostingService } from '../gl/posting.service'; +import { JournalEntryDraft, JournalLineDraft } from '../gl/posting.types'; + +type InvoiceForPosting = ARInvoice & { lines: ARInvoiceLine[]; customer: Customer }; +type CreditNoteForPosting = ARCreditNote & { lines: ARCreditNoteLine[]; customer: Customer }; +type ReceiptForPosting = ARReceipt & { customer: Customer }; + +/** Groups line amounts by GL account so one entry doesn't carry a separate line per invoice line. */ +function groupByAccount(entries: { glAccountId: number; amount: import('../../lib/money').Money }[]) { + const byAccount = new Map(); + for (const entry of entries) { + byAccount.set(entry.glAccountId, (byAccount.get(entry.glAccountId) ?? ZERO).plus(entry.amount)); + } + return byAccount; +} + +/** Dr AR Control (total) / Cr revenue account(s) (subtotal) / Cr Output Tax (tax total). */ +export async function postInvoiceToGL(invoice: InvoiceForPosting, createdById: number): Promise { + const arAccount = await resolveControlAccount(prisma, invoice.branchSegmentValueId, 'AR'); + const taxTotal = money(invoice.taxTotal); + const taxAccount = taxTotal.greaterThan(0) ? await resolveControlAccount(prisma, invoice.branchSegmentValueId, 'TAX_OUTPUT') : null; + + const revenueByAccount = groupByAccount( + invoice.lines.map((line) => ({ glAccountId: line.revenueGLAccountId, amount: money(line.lineSubtotal) })), + ); + + const lines: JournalLineDraft[] = [ + { + glAccountId: arAccount.id, + debit: invoice.total, + credit: 0, + branchSegmentValueId: invoice.branchSegmentValueId, + arInvoiceId: invoice.id, + description: `Invoice ${invoice.invoiceNumber} — ${invoice.customer.name}`, + }, + ...Array.from(revenueByAccount.entries()).map(([glAccountId, amount]) => ({ + glAccountId, + debit: 0, + credit: amount, + branchSegmentValueId: invoice.branchSegmentValueId, + description: `Invoice ${invoice.invoiceNumber} — ${invoice.customer.name}`, + })), + ]; + if (taxAccount && taxTotal.greaterThan(0)) { + lines.push({ + glAccountId: taxAccount.id, + debit: 0, + credit: taxTotal, + branchSegmentValueId: invoice.branchSegmentValueId, + description: `Output tax on invoice ${invoice.invoiceNumber}`, + }); + } + + const draft: JournalEntryDraft = { + journalCode: 'SALES', + entryDate: invoice.invoiceDate, + description: `AR Invoice ${invoice.invoiceNumber} — ${invoice.customer.name}`, + sourceModule: 'AR', + sourceType: 'ARInvoice', + sourceId: invoice.id, + createdById, + lines, + }; + return PostingService.postEntry(draft); +} + +/** Reverse of an invoice: Dr revenue account(s) + Dr Output Tax / Cr AR Control. */ +export async function postCreditNoteToGL(creditNote: CreditNoteForPosting, createdById: number): Promise { + const arAccount = await resolveControlAccount(prisma, creditNote.branchSegmentValueId, 'AR'); + const taxTotal = money(creditNote.taxTotal); + const taxAccount = taxTotal.greaterThan(0) + ? await resolveControlAccount(prisma, creditNote.branchSegmentValueId, 'TAX_OUTPUT') + : null; + + const revenueByAccount = groupByAccount( + creditNote.lines.map((line) => ({ glAccountId: line.revenueGLAccountId, amount: money(line.lineSubtotal) })), + ); + + const lines: JournalLineDraft[] = [ + ...Array.from(revenueByAccount.entries()).map(([glAccountId, amount]) => ({ + glAccountId, + debit: amount, + credit: 0, + branchSegmentValueId: creditNote.branchSegmentValueId, + description: `Credit note ${creditNote.creditNoteNumber} — ${creditNote.customer.name}`, + })), + { + glAccountId: arAccount.id, + debit: 0, + credit: creditNote.total, + branchSegmentValueId: creditNote.branchSegmentValueId, + description: `Credit note ${creditNote.creditNoteNumber} — ${creditNote.customer.name}`, + }, + ]; + if (taxAccount && taxTotal.greaterThan(0)) { + lines.push({ + glAccountId: taxAccount.id, + debit: taxTotal, + credit: 0, + branchSegmentValueId: creditNote.branchSegmentValueId, + description: `Output tax reversed on credit note ${creditNote.creditNoteNumber}`, + }); + } + + const draft: JournalEntryDraft = { + journalCode: 'SALES', + entryDate: creditNote.creditNoteDate, + description: `AR Credit Note ${creditNote.creditNoteNumber} — ${creditNote.customer.name}`, + sourceModule: 'AR', + sourceType: 'ARCreditNote', + sourceId: creditNote.id, + createdById, + lines, + }; + return PostingService.postEntry(draft); +} + +/** Dr Bank / Cr AR Control — allocation against specific invoices happens separately, sub-ledger only. */ +export async function postReceiptToGL(receipt: ReceiptForPosting, createdById: number): Promise { + const arAccount = await resolveControlAccount(prisma, receipt.branchSegmentValueId, 'AR'); + + const draft: JournalEntryDraft = { + journalCode: 'CASH_RECEIPT', + entryDate: receipt.receiptDate, + description: `AR Receipt ${receipt.receiptNumber} — ${receipt.customer.name}`, + sourceModule: 'AR', + sourceType: 'ARReceipt', + sourceId: receipt.id, + createdById, + lines: [ + { + glAccountId: receipt.bankGLAccountId, + debit: receipt.amount, + credit: 0, + branchSegmentValueId: receipt.branchSegmentValueId, + description: `Receipt ${receipt.receiptNumber} — ${receipt.customer.name}`, + }, + { + glAccountId: arAccount.id, + debit: 0, + credit: receipt.amount, + branchSegmentValueId: receipt.branchSegmentValueId, + description: `Receipt ${receipt.receiptNumber} — ${receipt.customer.name}`, + }, + ], + }; + return PostingService.postEntry(draft); +} + +export function calcLine(quantity: number, unitPrice: number, ratePercent: number | null) { + const subtotal = money(quantity).times(unitPrice).toDecimalPlaces(2); + const tax = ratePercent ? subtotal.times(ratePercent).dividedBy(100).toDecimalPlaces(2) : ZERO; + return { subtotal, tax, total: subtotal.plus(tax) }; +} + +export function sumLines(values: import('../../lib/money').Money[]) { + return sum(values); +} diff --git a/src/modules/ar/arReceipts.controller.ts b/src/modules/ar/arReceipts.controller.ts new file mode 100644 index 0000000..f489d91 --- /dev/null +++ b/src/modules/ar/arReceipts.controller.ts @@ -0,0 +1,51 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as arReceiptsService from './arReceipts.service'; + +export const createReceiptSchema = z.object({ + customerId: z.number().int(), + receiptDate: z.string().datetime().or(z.string().date()), + amount: z.number().positive(), + bankGLAccountId: z.number().int(), + reference: z.string().optional(), +}); + +export const allocateSchema = z.object({ + allocations: z.array(z.object({ invoiceId: z.number().int(), amount: z.number().positive() })).min(1), +}); + +export async function createReceiptHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + const receipt = await arReceiptsService.createReceiptDraft(input, req.user!.id); + res.status(201).json(receipt); +} + +export async function postReceiptHandler(req: Request, res: Response): Promise { + const receipt = await arReceiptsService.postReceipt(Number(req.params.id), req.user!.id); + res.json(receipt); +} + +export async function voidReceiptHandler(req: Request, res: Response): Promise { + const receipt = await arReceiptsService.voidReceiptDraft(Number(req.params.id)); + res.json(receipt); +} + +export async function allocateReceiptHandler(req: Request, res: Response): Promise { + const { allocations } = req.body as z.infer; + const result = await arReceiptsService.allocateReceipt(Number(req.params.id), allocations); + res.status(201).json(result); +} + +export async function listReceiptsHandler(req: Request, res: Response): Promise { + const customerId = req.query.customerId ? Number(req.query.customerId) : undefined; + res.json(await arReceiptsService.listReceipts(req.branchScope!, customerId)); +} + +export async function getReceiptHandler(req: Request, res: Response): Promise { + const receipt = await arReceiptsService.getReceipt(Number(req.params.id)); + if (!receipt) { + res.status(404).json({ error: 'Receipt not found' }); + return; + } + res.json(receipt); +} diff --git a/src/modules/ar/arReceipts.routes.ts b/src/modules/ar/arReceipts.routes.ts new file mode 100644 index 0000000..f2d3aaf --- /dev/null +++ b/src/modules/ar/arReceipts.routes.ts @@ -0,0 +1,32 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + allocateReceiptHandler, + allocateSchema, + createReceiptHandler, + createReceiptSchema, + getReceiptHandler, + listReceiptsHandler, + postReceiptHandler, + voidReceiptHandler, +} from './arReceipts.controller'; + +export const arReceiptsRouter = Router(); + +arReceiptsRouter.use(requireAuth); + +arReceiptsRouter.get('/', attachBranchScope, asyncHandler(listReceiptsHandler)); +arReceiptsRouter.get('/:id', asyncHandler(getReceiptHandler)); +arReceiptsRouter.post('/', requirePermission('ar.receipt.manage'), validate(createReceiptSchema), asyncHandler(createReceiptHandler)); +arReceiptsRouter.post('/:id/post', requirePermission('ar.receipt.manage'), asyncHandler(postReceiptHandler)); +arReceiptsRouter.post('/:id/void', requirePermission('ar.receipt.manage'), asyncHandler(voidReceiptHandler)); +arReceiptsRouter.post( + '/:id/allocations', + requirePermission('ar.receipt.manage'), + validate(allocateSchema), + asyncHandler(allocateReceiptHandler), +); diff --git a/src/modules/ar/arReceipts.service.ts b/src/modules/ar/arReceipts.service.ts new file mode 100644 index 0000000..f0a37eb --- /dev/null +++ b/src/modules/ar/arReceipts.service.ts @@ -0,0 +1,82 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; +import { money } from '../../lib/money'; +import { nextNumber } from '../../lib/sequence'; +import { postReceiptToGL } from './arPosting.service'; +import { ARDocumentStateError } from './ar.errors'; +import { allocate, AllocationInput } from './arAllocations.service'; + +export interface CreateReceiptInput { + customerId: number; + receiptDate: string; + amount: number; + bankGLAccountId: number; + reference?: string; +} + +export async function createReceiptDraft(input: CreateReceiptInput, createdById: number) { + const customer = await prisma.customer.findUniqueOrThrow({ where: { id: input.customerId } }); + const amount = money(input.amount); + + return prisma.$transaction(async (tx) => { + const receiptNumber = await nextNumber(tx, 'ARRCT', new Date(input.receiptDate).getFullYear()); + return tx.aRReceipt.create({ + data: { + receiptNumber, + customerId: customer.id, + branchSegmentValueId: customer.branchSegmentValueId, + receiptDate: new Date(input.receiptDate), + amount, + unallocatedAmount: amount, + bankGLAccountId: input.bankGLAccountId, + reference: input.reference, + status: 'DRAFT', + createdById, + }, + include: { customer: true, bankGLAccount: true }, + }); + }); +} + +export async function postReceipt(id: number, createdById: number) { + const receipt = await prisma.aRReceipt.findUniqueOrThrow({ where: { id }, include: { customer: true } }); + if (receipt.status !== 'DRAFT') { + throw new ARDocumentStateError('Only draft receipts can be posted'); + } + + const entry = await postReceiptToGL(receipt, createdById); + + return prisma.aRReceipt.update({ + where: { id }, + data: { status: 'POSTED', journalEntryId: entry.id }, + include: { customer: true, bankGLAccount: true }, + }); +} + +export async function voidReceiptDraft(id: number) { + const receipt = await prisma.aRReceipt.findUniqueOrThrow({ where: { id } }); + if (receipt.status !== 'DRAFT') { + throw new ARDocumentStateError('Only draft receipts can be voided'); + } + return prisma.aRReceipt.update({ where: { id }, data: { status: 'VOID' } }); +} + +export function allocateReceipt(receiptId: number, allocations: AllocationInput[]) { + return allocate({ receiptId }, allocations); +} + +export function listReceipts(branchScope: BranchScope, customerId?: number) { + return prisma.aRReceipt.findMany({ + where: { ...branchWhere(branchScope), ...(customerId ? { customerId } : {}) }, + include: { customer: true, bankGLAccount: true }, + orderBy: { receiptDate: 'desc' }, + take: 200, + }); +} + +export function getReceipt(id: number) { + return prisma.aRReceipt.findUnique({ + where: { id }, + include: { customer: true, bankGLAccount: true, allocations: { include: { invoice: true } } }, + }); +} diff --git a/src/modules/ar/customers.controller.ts b/src/modules/ar/customers.controller.ts new file mode 100644 index 0000000..a7dd014 --- /dev/null +++ b/src/modules/ar/customers.controller.ts @@ -0,0 +1,40 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as customersService from './customers.service'; + +export const createCustomerSchema = z.object({ + code: z.string().min(1), + name: z.string().min(1), + email: z.string().email().optional(), + phone: z.string().optional(), + address: z.string().optional(), + taxNumber: z.string().optional(), + branchSegmentValueId: z.number().int(), + creditLimit: z.number().min(0).optional(), + paymentTermsDays: z.number().int().min(0).optional(), +}); + +export const updateCustomerSchema = createCustomerSchema.partial().extend({ isActive: z.boolean().optional() }); + +export async function listCustomersHandler(req: Request, res: Response): Promise { + res.json(await customersService.listCustomers(req.branchScope!)); +} + +export async function createCustomerHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await customersService.createCustomer(input)); +} + +export async function updateCustomerHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.json(await customersService.updateCustomer(Number(req.params.id), input)); +} + +export async function getCustomerHandler(req: Request, res: Response): Promise { + const result = await customersService.getCustomer(Number(req.params.id)); + if (!result) { + res.status(404).json({ error: 'Customer not found' }); + return; + } + res.json(result); +} diff --git a/src/modules/ar/customers.routes.ts b/src/modules/ar/customers.routes.ts new file mode 100644 index 0000000..c523d91 --- /dev/null +++ b/src/modules/ar/customers.routes.ts @@ -0,0 +1,28 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createCustomerHandler, + createCustomerSchema, + getCustomerHandler, + listCustomersHandler, + updateCustomerHandler, + updateCustomerSchema, +} from './customers.controller'; + +export const customersRouter = Router(); + +customersRouter.use(requireAuth); + +customersRouter.get('/', attachBranchScope, asyncHandler(listCustomersHandler)); +customersRouter.get('/:id', asyncHandler(getCustomerHandler)); +customersRouter.post('/', requirePermission('ar.customer.manage'), validate(createCustomerSchema), asyncHandler(createCustomerHandler)); +customersRouter.put( + '/:id', + requirePermission('ar.customer.manage'), + validate(updateCustomerSchema), + asyncHandler(updateCustomerHandler), +); diff --git a/src/modules/ar/customers.service.ts b/src/modules/ar/customers.service.ts new file mode 100644 index 0000000..e7659e9 --- /dev/null +++ b/src/modules/ar/customers.service.ts @@ -0,0 +1,58 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope, branchWhere } from '../../lib/branchFilter'; + +export interface CustomerInput { + code: string; + name: string; + email?: string; + phone?: string; + address?: string; + taxNumber?: string; + branchSegmentValueId: number; + creditLimit?: number; + paymentTermsDays?: number; +} + +export function listCustomers(branchScope: BranchScope) { + return prisma.customer.findMany({ + where: branchWhere(branchScope), + orderBy: { name: 'asc' }, + }); +} + +export function createCustomer(input: CustomerInput) { + return prisma.customer.create({ data: input }); +} + +export function updateCustomer(id: number, input: Partial & { isActive?: boolean }) { + return prisma.customer.update({ where: { id }, data: input }); +} + +export async function getCustomer(id: number) { + const customer = await prisma.customer.findUnique({ where: { id } }); + if (!customer) return null; + + const [invoices, creditNotes, receipts] = await Promise.all([ + prisma.aRInvoice.findMany({ + where: { customerId: id, status: { not: 'DRAFT' } }, + orderBy: { invoiceDate: 'desc' }, + include: { lines: true }, + }), + prisma.aRCreditNote.findMany({ + where: { customerId: id, status: { not: 'DRAFT' } }, + orderBy: { creditNoteDate: 'desc' }, + include: { lines: true }, + }), + prisma.aRReceipt.findMany({ + where: { customerId: id, status: { not: 'DRAFT' } }, + orderBy: { receiptDate: 'desc' }, + }), + ]); + + const outstandingBalance = invoices.reduce((sum, invoice) => sum + Number(invoice.balance), 0); + const overdueBalance = invoices + .filter((invoice) => invoice.balance && Number(invoice.balance) > 0 && invoice.dueDate < new Date()) + .reduce((sum, invoice) => sum + Number(invoice.balance), 0); + + return { customer, invoices, creditNotes, receipts, outstandingBalance, overdueBalance }; +} diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000..1655580 --- /dev/null +++ b/src/modules/auth/auth.controller.ts @@ -0,0 +1,44 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as authService from './auth.service'; +import { InvalidHandoffTokenError, WrongCompanyHandoffError } from '../../lib/handoffVerify'; + +export const handoffSchema = z.object({ + token: z.string().min(1), +}); + +export const refreshSchema = z.object({ + refreshToken: z.string().min(1), +}); + +export async function handoffHandler(req: Request, res: Response): Promise { + try { + const { token } = req.body as z.infer; + const session = await authService.verifyHandoff(token); + res.json(session); + } catch (error) { + if (error instanceof InvalidHandoffTokenError || error instanceof WrongCompanyHandoffError) { + res.status(401).json({ error: error.message }); + return; + } + if (error instanceof authService.UserNotProvisionedError) { + res.status(403).json({ error: error.message }); + return; + } + throw error; + } +} + +export function refreshHandler(req: Request, res: Response): void { + try { + const { refreshToken } = req.body as z.infer; + const accessToken = authService.refreshAccessToken(refreshToken); + res.json({ accessToken }); + } catch { + res.status(401).json({ error: 'Invalid or expired refresh token' }); + } +} + +export function meHandler(req: Request, res: Response): void { + res.json({ user: req.user }); +} diff --git a/src/modules/auth/auth.routes.ts b/src/modules/auth/auth.routes.ts new file mode 100644 index 0000000..2d1514f --- /dev/null +++ b/src/modules/auth/auth.routes.ts @@ -0,0 +1,11 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { handoffHandler, handoffSchema, meHandler, refreshHandler, refreshSchema } from './auth.controller'; + +export const authRouter = Router(); + +authRouter.post('/handoff', validate(handoffSchema), asyncHandler(handoffHandler)); +authRouter.post('/refresh', validate(refreshSchema), refreshHandler); +authRouter.get('/me', requireAuth, meHandler); diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts new file mode 100644 index 0000000..fd30453 --- /dev/null +++ b/src/modules/auth/auth.service.ts @@ -0,0 +1,52 @@ +import { prisma } from '../../lib/prisma'; +import { signAccessToken, signRefreshToken, verifyRefreshToken } from '../../lib/jwt'; +import { InvalidHandoffTokenError, verifyHandoffToken } from '../../lib/handoffVerify'; +import { loadAuthUser } from '../../middleware/auth'; + +export class UserNotProvisionedError extends Error { + constructor(email: string) { + super(`No user exists for ${email} in this company, and auto-provisioning is off`); + this.name = 'UserNotProvisionedError'; + } +} + +/** + * Verifies a handoff token minted by the Account Manager and exchanges it for a session in + * this company app. Local password login no longer exists here — see the implementation plan, + * "Phase A — Account Manager: foundation & handoff". + */ +export async function verifyHandoff(token: string) { + const claims = verifyHandoffToken(token); + + await prisma.$transaction(async (tx) => { + const alreadyUsed = await tx.handoffTokenUse.findUnique({ where: { jti: claims.jti } }); + if (alreadyUsed) { + throw new InvalidHandoffTokenError('This handoff token has already been used'); + } + await tx.handoffTokenUse.create({ data: { jti: claims.jti } }); + }); + + let user = await prisma.user.findUnique({ where: { email: claims.sub } }); + if (!user) { + const company = await prisma.companySettings.findUniqueOrThrow({ where: { id: 1 } }); + if (!company.autoProvisionOnHandoff) { + throw new UserNotProvisionedError(claims.sub); + } + user = await prisma.user.create({ data: { email: claims.sub, fullName: claims.sub } }); + } + if (!user.isActive) { + throw new UserNotProvisionedError(claims.sub); + } + + const authUser = await loadAuthUser(user.id); + if (!authUser) { + throw new UserNotProvisionedError(claims.sub); + } + + return { accessToken: signAccessToken(user.id), refreshToken: signRefreshToken(user.id), user: authUser }; +} + +export function refreshAccessToken(refreshToken: string): string { + const userId = verifyRefreshToken(refreshToken); + return signAccessToken(userId); +} diff --git a/src/modules/company/fiscalPeriods.controller.ts b/src/modules/company/fiscalPeriods.controller.ts new file mode 100644 index 0000000..99e8ba1 --- /dev/null +++ b/src/modules/company/fiscalPeriods.controller.ts @@ -0,0 +1,16 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as fiscalPeriodsService from './fiscalPeriods.service'; + +export const createFiscalYearSchema = z.object({ + year: z.number().int().min(2000).max(2100), +}); + +export async function listFiscalYearsHandler(req: Request, res: Response): Promise { + res.json(await fiscalPeriodsService.listFiscalYears()); +} + +export async function createFiscalYearHandler(req: Request, res: Response): Promise { + const { year } = req.body as z.infer; + res.status(201).json(await fiscalPeriodsService.createFiscalYear(year)); +} diff --git a/src/modules/company/fiscalPeriods.routes.ts b/src/modules/company/fiscalPeriods.routes.ts new file mode 100644 index 0000000..d271f23 --- /dev/null +++ b/src/modules/company/fiscalPeriods.routes.ts @@ -0,0 +1,18 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { createFiscalYearHandler, createFiscalYearSchema, listFiscalYearsHandler } from './fiscalPeriods.controller'; + +export const fiscalPeriodsRouter = Router(); + +fiscalPeriodsRouter.use(requireAuth); + +fiscalPeriodsRouter.get('/fiscal-years', asyncHandler(listFiscalYearsHandler)); +fiscalPeriodsRouter.post( + '/fiscal-years', + requirePermission('admin.fiscalPeriods.manage'), + validate(createFiscalYearSchema), + asyncHandler(createFiscalYearHandler), +); diff --git a/src/modules/company/fiscalPeriods.service.ts b/src/modules/company/fiscalPeriods.service.ts new file mode 100644 index 0000000..54c362a --- /dev/null +++ b/src/modules/company/fiscalPeriods.service.ts @@ -0,0 +1,30 @@ +import { prisma } from '../../lib/prisma'; + +export function listFiscalYears() { + return prisma.fiscalYear.findMany({ orderBy: { year: 'asc' }, include: { periods: { orderBy: { periodNumber: 'asc' } } } }); +} + +/** Creates a fiscal year and its 12 monthly periods, starting at CompanySettings.fiscalYearStartMonth. */ +export async function createFiscalYear(year: number) { + const company = await prisma.companySettings.findUniqueOrThrow({ where: { id: 1 } }); + const startMonth = company.fiscalYearStartMonth; + const startDate = new Date(Date.UTC(year, startMonth - 1, 1)); + + const periods = Array.from({ length: 12 }, (_, index) => { + const periodStart = new Date(Date.UTC(startDate.getUTCFullYear(), startDate.getUTCMonth() + index, 1)); + const periodEnd = new Date(Date.UTC(periodStart.getUTCFullYear(), periodStart.getUTCMonth() + 1, 0)); + return { periodNumber: index + 1, startDate: periodStart, endDate: periodEnd }; + }); + + const endDate = periods[periods.length - 1].endDate; + + return prisma.fiscalYear.create({ + data: { + year, + startDate, + endDate, + periods: { create: periods }, + }, + include: { periods: true }, + }); +} diff --git a/src/modules/company/segments.controller.ts b/src/modules/company/segments.controller.ts new file mode 100644 index 0000000..852e2ba --- /dev/null +++ b/src/modules/company/segments.controller.ts @@ -0,0 +1,36 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as segmentsService from './segments.service'; + +export const createSegmentDefinitionSchema = z.object({ + segmentKey: z.string().min(1).max(30), + label: z.string().min(1), + order: z.number().int().min(0), + length: z.number().int().min(1).max(20), + format: z.enum(['NUMERIC', 'ALPHA', 'ALPHANUMERIC']), + isBranchSegment: z.boolean().default(false), +}); + +export const createSegmentValueSchema = z.object({ + segmentDefId: z.number().int(), + code: z.string().min(1), + description: z.string().min(1), +}); + +export async function listSegmentDefinitionsHandler(req: Request, res: Response): Promise { + res.json(await segmentsService.listSegmentDefinitions()); +} + +export async function createSegmentDefinitionHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await segmentsService.createSegmentDefinition(input)); +} + +export async function createSegmentValueHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await segmentsService.createSegmentValue(input)); +} + +export async function listBranchValuesHandler(req: Request, res: Response): Promise { + res.json(await segmentsService.listBranchValues()); +} diff --git a/src/modules/company/segments.routes.ts b/src/modules/company/segments.routes.ts new file mode 100644 index 0000000..d08e657 --- /dev/null +++ b/src/modules/company/segments.routes.ts @@ -0,0 +1,32 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createSegmentDefinitionHandler, + createSegmentDefinitionSchema, + createSegmentValueHandler, + createSegmentValueSchema, + listBranchValuesHandler, + listSegmentDefinitionsHandler, +} from './segments.controller'; + +export const segmentsRouter = Router(); + +segmentsRouter.use(requireAuth); + +segmentsRouter.get('/segment-definitions', asyncHandler(listSegmentDefinitionsHandler)); +segmentsRouter.post( + '/segment-definitions', + requirePermission('admin.segments.manage'), + validate(createSegmentDefinitionSchema), + asyncHandler(createSegmentDefinitionHandler), +); +segmentsRouter.post( + '/segment-values', + requirePermission('admin.segments.manage'), + validate(createSegmentValueSchema), + asyncHandler(createSegmentValueHandler), +); +segmentsRouter.get('/branches', asyncHandler(listBranchValuesHandler)); diff --git a/src/modules/company/segments.service.ts b/src/modules/company/segments.service.ts new file mode 100644 index 0000000..43440e0 --- /dev/null +++ b/src/modules/company/segments.service.ts @@ -0,0 +1,39 @@ +import { prisma } from '../../lib/prisma'; + +export function listSegmentDefinitions() { + return prisma.accountSegmentDefinition.findMany({ + orderBy: { order: 'asc' }, + include: { values: { orderBy: { code: 'asc' } } }, + }); +} + +export interface CreateSegmentDefinitionInput { + segmentKey: string; + label: string; + order: number; + length: number; + format: 'NUMERIC' | 'ALPHA' | 'ALPHANUMERIC'; + isBranchSegment: boolean; +} + +export function createSegmentDefinition(input: CreateSegmentDefinitionInput) { + return prisma.accountSegmentDefinition.create({ data: input }); +} + +export interface CreateSegmentValueInput { + segmentDefId: number; + code: string; + description: string; +} + +export function createSegmentValue(input: CreateSegmentValueInput) { + return prisma.accountSegmentValue.create({ data: input }); +} + +export function listBranchValues() { + return prisma.accountSegmentValue.findMany({ + where: { segmentDef: { isBranchSegment: true }, isActive: true }, + include: { branchProfile: true }, + orderBy: { code: 'asc' }, + }); +} diff --git a/src/modules/gl/glAccounts.controller.ts b/src/modules/gl/glAccounts.controller.ts new file mode 100644 index 0000000..de22b49 --- /dev/null +++ b/src/modules/gl/glAccounts.controller.ts @@ -0,0 +1,43 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as glAccountsService from './glAccounts.service'; + +const glAccountTypeSchema = z.enum(['ASSET', 'LIABILITY', 'EQUITY', 'INCOME', 'EXPENSE']); +const debitCreditSchema = z.enum(['DEBIT', 'CREDIT']); +const controlAccountTypeSchema = z.enum(['AR', 'AP', 'STOCK', 'TAX_OUTPUT', 'TAX_INPUT', 'BANK', 'RETAINED_EARNINGS']); + +export const createGLAccountSchema = z.object({ + accountName: z.string().min(1), + accountType: glAccountTypeSchema, + normalBalance: debitCreditSchema, + isControlAccount: z.boolean().optional(), + controlType: controlAccountTypeSchema.optional(), + isPostable: z.boolean().optional(), + segmentSelections: z + .array(z.object({ segmentDefId: z.number().int(), segmentValueId: z.number().int() })) + .min(1), +}); + +export const listGLAccountsQuerySchema = z.object({ + branchScope: z.string().optional(), + accountType: glAccountTypeSchema.optional(), +}); + +export async function createGLAccountHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await glAccountsService.createGLAccount(input)); +} + +export async function listGLAccountsHandler(req: Request, res: Response): Promise { + const { accountType } = req.query as unknown as z.infer; + res.json(await glAccountsService.listGLAccounts(req.branchScope!, accountType)); +} + +export async function getGLAccountHandler(req: Request, res: Response): Promise { + const account = await glAccountsService.getGLAccountByCode(req.params.accountCode); + if (!account) { + res.status(404).json({ error: 'GL account not found' }); + return; + } + res.json(account); +} diff --git a/src/modules/gl/glAccounts.routes.ts b/src/modules/gl/glAccounts.routes.ts new file mode 100644 index 0000000..7339550 --- /dev/null +++ b/src/modules/gl/glAccounts.routes.ts @@ -0,0 +1,25 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createGLAccountHandler, + createGLAccountSchema, + getGLAccountHandler, + listGLAccountsHandler, +} from './glAccounts.controller'; + +export const glAccountsRouter = Router(); + +glAccountsRouter.use(requireAuth); + +glAccountsRouter.get('/', attachBranchScope, asyncHandler(listGLAccountsHandler)); +glAccountsRouter.get('/:accountCode', asyncHandler(getGLAccountHandler)); +glAccountsRouter.post( + '/', + requirePermission('gl.account.manage'), + validate(createGLAccountSchema), + asyncHandler(createGLAccountHandler), +); diff --git a/src/modules/gl/glAccounts.service.ts b/src/modules/gl/glAccounts.service.ts new file mode 100644 index 0000000..dfdbabd --- /dev/null +++ b/src/modules/gl/glAccounts.service.ts @@ -0,0 +1,102 @@ +import { GLAccountType, DebitCredit, ControlAccountType } from '@prisma/client'; +import { prisma } from '../../lib/prisma'; +import { BranchScope } from '../../lib/branchFilter'; + +export interface SegmentSelection { + segmentDefId: number; + segmentValueId: number; +} + +export interface CreateGLAccountInput { + accountName: string; + accountType: GLAccountType; + normalBalance: DebitCredit; + isControlAccount?: boolean; + controlType?: ControlAccountType; + isPostable?: boolean; + segmentSelections: SegmentSelection[]; +} + +export class SegmentSelectionError extends Error { + constructor(message: string) { + super(message); + this.name = 'SegmentSelectionError'; + } +} + +/** Builds "1000-100-500-AMA" from segment values in definition order, using CompanySettings.accountCodeSeparator. */ +async function buildAccountCode(segmentSelections: SegmentSelection[]): Promise { + const definitions = await prisma.accountSegmentDefinition.findMany({ + where: { isActive: true }, + orderBy: { order: 'asc' }, + }); + const company = await prisma.companySettings.findUniqueOrThrow({ where: { id: 1 } }); + + if (segmentSelections.length !== definitions.length) { + throw new SegmentSelectionError( + `Expected a value for every active segment (${definitions.length}), got ${segmentSelections.length}`, + ); + } + + const values = await prisma.accountSegmentValue.findMany({ + where: { id: { in: segmentSelections.map((selection) => selection.segmentValueId) } }, + }); + const valueById = new Map(values.map((value) => [value.id, value])); + + const orderedCodes = definitions.map((definition) => { + const selection = segmentSelections.find((s) => s.segmentDefId === definition.id); + if (!selection) { + throw new SegmentSelectionError(`Missing a value for segment "${definition.label}"`); + } + const value = valueById.get(selection.segmentValueId); + if (!value || value.segmentDefId !== definition.id) { + throw new SegmentSelectionError(`Segment value ${selection.segmentValueId} does not belong to segment "${definition.label}"`); + } + return value.code; + }); + + return orderedCodes.join(company.accountCodeSeparator); +} + +export async function createGLAccount(input: CreateGLAccountInput) { + const accountCode = await buildAccountCode(input.segmentSelections); + + return prisma.gLAccount.create({ + data: { + accountCode, + accountName: input.accountName, + accountType: input.accountType, + normalBalance: input.normalBalance, + isControlAccount: input.isControlAccount ?? false, + controlType: input.controlType, + isPostable: input.isPostable ?? true, + segmentValues: { + create: input.segmentSelections.map((selection) => ({ + segmentDefId: selection.segmentDefId, + segmentValueId: selection.segmentValueId, + })), + }, + }, + include: { segmentValues: { include: { segmentValue: true, segmentDef: true } } }, + }); +} + +export function listGLAccounts(branchScope: BranchScope, accountType?: GLAccountType) { + return prisma.gLAccount.findMany({ + where: { + accountType, + ...(branchScope.mode === 'BRANCH' + ? { segmentValues: { some: { segmentValueId: branchScope.branchSegmentValueId } } } + : {}), + }, + include: { segmentValues: { include: { segmentValue: true, segmentDef: true } } }, + orderBy: { accountCode: 'asc' }, + }); +} + +export function getGLAccountByCode(accountCode: string) { + return prisma.gLAccount.findUnique({ + where: { accountCode }, + include: { segmentValues: { include: { segmentValue: true, segmentDef: true } } }, + }); +} diff --git a/src/modules/gl/journalEntries.controller.ts b/src/modules/gl/journalEntries.controller.ts new file mode 100644 index 0000000..6a48c18 --- /dev/null +++ b/src/modules/gl/journalEntries.controller.ts @@ -0,0 +1,47 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as journalEntriesService from './journalEntries.service'; + +const manualLineSchema = z.object({ + glAccountId: z.number().int(), + debit: z.number().min(0), + credit: z.number().min(0), + description: z.string().optional(), + branchSegmentValueId: z.number().int().optional(), +}); + +export const createManualEntrySchema = z.object({ + journalCode: z.string().min(1), + entryDate: z.string().datetime().or(z.string().date()), + description: z.string().min(1), + lines: z.array(manualLineSchema).min(2), +}); + +export const reverseEntrySchema = z.object({ + reason: z.string().optional(), +}); + +export async function createManualEntryHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + const entry = await journalEntriesService.createManualEntry(input, req.user!.id); + res.status(201).json(entry); +} + +export async function listJournalEntriesHandler(req: Request, res: Response): Promise { + res.json(await journalEntriesService.listJournalEntries(req.branchScope!)); +} + +export async function getJournalEntryHandler(req: Request, res: Response): Promise { + const entry = await journalEntriesService.getJournalEntry(Number(req.params.id)); + if (!entry) { + res.status(404).json({ error: 'Journal entry not found' }); + return; + } + res.json(entry); +} + +export async function reverseJournalEntryHandler(req: Request, res: Response): Promise { + const { reason } = req.body as z.infer; + const reversal = await journalEntriesService.reverseJournalEntry(Number(req.params.id), req.user!.id, reason); + res.status(201).json(reversal); +} diff --git a/src/modules/gl/journalEntries.routes.ts b/src/modules/gl/journalEntries.routes.ts new file mode 100644 index 0000000..6105a57 --- /dev/null +++ b/src/modules/gl/journalEntries.routes.ts @@ -0,0 +1,33 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { attachBranchScope } from '../../middleware/branchScope'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createManualEntryHandler, + createManualEntrySchema, + getJournalEntryHandler, + listJournalEntriesHandler, + reverseEntrySchema, + reverseJournalEntryHandler, +} from './journalEntries.controller'; + +export const journalEntriesRouter = Router(); + +journalEntriesRouter.use(requireAuth); + +journalEntriesRouter.get('/', attachBranchScope, asyncHandler(listJournalEntriesHandler)); +journalEntriesRouter.get('/:id', asyncHandler(getJournalEntryHandler)); +journalEntriesRouter.post( + '/', + requirePermission('gl.journal.post'), + validate(createManualEntrySchema), + asyncHandler(createManualEntryHandler), +); +journalEntriesRouter.post( + '/:id/reverse', + requirePermission('gl.journal.post'), + validate(reverseEntrySchema), + asyncHandler(reverseJournalEntryHandler), +); diff --git a/src/modules/gl/journalEntries.service.ts b/src/modules/gl/journalEntries.service.ts new file mode 100644 index 0000000..ab1b970 --- /dev/null +++ b/src/modules/gl/journalEntries.service.ts @@ -0,0 +1,52 @@ +import { prisma } from '../../lib/prisma'; +import { BranchScope } from '../../lib/branchFilter'; +import { PostingService } from './posting.service'; +import { JournalEntryDraft } from './posting.types'; + +export interface ManualJournalLineInput { + glAccountId: number; + debit: number; + credit: number; + description?: string; + branchSegmentValueId?: number; +} + +export interface CreateManualEntryInput { + journalCode: string; + entryDate: string; + description: string; + lines: ManualJournalLineInput[]; +} + +export function createManualEntry(input: CreateManualEntryInput, createdById: number) { + const draft: JournalEntryDraft = { + journalCode: input.journalCode, + entryDate: new Date(input.entryDate), + description: input.description, + sourceModule: 'GL', + sourceType: 'ManualJournalEntry', + createdById, + lines: input.lines, + }; + return PostingService.postEntry(draft); +} + +export function listJournalEntries(branchScope: BranchScope) { + return prisma.journalEntry.findMany({ + where: branchScope.mode === 'BRANCH' ? { lines: { some: { branchSegmentValueId: branchScope.branchSegmentValueId } } } : {}, + include: { journal: true, lines: { include: { glAccount: true } } }, + orderBy: { entryDate: 'desc' }, + take: 200, + }); +} + +export function getJournalEntry(id: number) { + return prisma.journalEntry.findUnique({ + where: { id }, + include: { journal: true, lines: { include: { glAccount: true } }, createdBy: { select: { id: true, fullName: true, email: true } } }, + }); +} + +export function reverseJournalEntry(id: number, userId: number, reason?: string) { + return PostingService.reverseEntry(id, userId, reason); +} diff --git a/src/modules/gl/journals.controller.ts b/src/modules/gl/journals.controller.ts new file mode 100644 index 0000000..29c2dca --- /dev/null +++ b/src/modules/gl/journals.controller.ts @@ -0,0 +1,19 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as journalsService from './journals.service'; + +export const createJournalSchema = z.object({ + code: z.string().min(1).max(20), + name: z.string().min(1), + journalType: z.enum(['GENERAL', 'SALES', 'PURCHASES', 'CASH_RECEIPT', 'CASH_PAYMENT', 'STOCK', 'BANK', 'CUSTOM']), + defaultBranchSegmentValueId: z.number().int().optional(), +}); + +export async function listJournalsHandler(req: Request, res: Response): Promise { + res.json(await journalsService.listJournals()); +} + +export async function createJournalHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await journalsService.createJournal(input)); +} diff --git a/src/modules/gl/journals.routes.ts b/src/modules/gl/journals.routes.ts new file mode 100644 index 0000000..9f069ab --- /dev/null +++ b/src/modules/gl/journals.routes.ts @@ -0,0 +1,18 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { createJournalHandler, createJournalSchema, listJournalsHandler } from './journals.controller'; + +export const journalsRouter = Router(); + +journalsRouter.use(requireAuth); + +journalsRouter.get('/', asyncHandler(listJournalsHandler)); +journalsRouter.post( + '/', + requirePermission('gl.journal.manage'), + validate(createJournalSchema), + asyncHandler(createJournalHandler), +); diff --git a/src/modules/gl/journals.service.ts b/src/modules/gl/journals.service.ts new file mode 100644 index 0000000..f57b967 --- /dev/null +++ b/src/modules/gl/journals.service.ts @@ -0,0 +1,17 @@ +import { JournalType } from '@prisma/client'; +import { prisma } from '../../lib/prisma'; + +export function listJournals() { + return prisma.journal.findMany({ orderBy: { code: 'asc' } }); +} + +export interface CreateJournalInput { + code: string; + name: string; + journalType: JournalType; + defaultBranchSegmentValueId?: number; +} + +export function createJournal(input: CreateJournalInput) { + return prisma.journal.create({ data: input }); +} diff --git a/src/modules/gl/posting.service.ts b/src/modules/gl/posting.service.ts new file mode 100644 index 0000000..918311f --- /dev/null +++ b/src/modules/gl/posting.service.ts @@ -0,0 +1,136 @@ +import { JournalEntry, JournalEntryStatus } from '@prisma/client'; +import { prisma } from '../../lib/prisma'; +import { money, sum } from '../../lib/money'; +import { nextNumber } from '../../lib/sequence'; +import { ClosedPeriodError, InvalidLineError, JournalEntryDraft, UnbalancedEntryError } from './posting.types'; + +/** + * The ONLY code path in this codebase allowed to write JournalEntry/JournalEntryLine rows + * (enforced by the no-restricted-syntax ESLint rule on prisma.journalEntry / prisma.journalEntryLine + * outside this file, and backstopped by a DB trigger — see the balance-trigger migration). + * AR, AP, and Stock modules build a JournalEntryDraft and call postEntry(); they never write GL rows directly. + */ +export async function postEntry(draft: JournalEntryDraft): Promise { + if (draft.lines.length === 0) { + throw new InvalidLineError('A journal entry must have at least one line'); + } + + const lines = draft.lines.map((line, index) => { + const debit = money(line.debit); + const credit = money(line.credit); + if (debit.lessThan(0) || credit.lessThan(0)) { + throw new InvalidLineError(`Line ${index + 1}: debit and credit must be non-negative`); + } + const debitSet = debit.greaterThan(0); + const creditSet = credit.greaterThan(0); + if (debitSet === creditSet) { + throw new InvalidLineError(`Line ${index + 1}: exactly one of debit or credit must be greater than zero`); + } + return { ...line, debit, credit }; + }); + + const totalDebits = sum(lines.map((line) => line.debit)); + const totalCredits = sum(lines.map((line) => line.credit)); + if (!totalDebits.equals(totalCredits)) { + throw new UnbalancedEntryError(totalDebits.toFixed(2), totalCredits.toFixed(2)); + } + + return prisma.$transaction(async (tx) => { + const journal = await tx.journal.findUniqueOrThrow({ where: { code: draft.journalCode } }); + + const fiscalPeriod = await tx.fiscalPeriod.findFirst({ + where: { status: 'OPEN', startDate: { lte: draft.entryDate }, endDate: { gte: draft.entryDate } }, + include: { fiscalYear: true }, + }); + if (!fiscalPeriod) { + throw new ClosedPeriodError(draft.entryDate); + } + + const entryNumber = await nextNumber(tx, 'JE', fiscalPeriod.fiscalYear.year); + + const entry = await tx.journalEntry.create({ + data: { + entryNumber, + journalId: journal.id, + fiscalPeriodId: fiscalPeriod.id, + entryDate: draft.entryDate, + description: draft.description, + sourceModule: draft.sourceModule, + sourceType: draft.sourceType, + sourceId: draft.sourceId, + status: JournalEntryStatus.POSTED, + reversalOfId: draft.reversalOfId, + totalDebits, + totalCredits, + createdById: draft.createdById, + lines: { + create: lines.map((line, index) => ({ + lineNumber: index + 1, + glAccountId: line.glAccountId, + debit: line.debit, + credit: line.credit, + description: line.description, + branchSegmentValueId: line.branchSegmentValueId, + arInvoiceId: line.arInvoiceId, + apInvoiceId: line.apInvoiceId, + stockMovementId: line.stockMovementId, + currencyCode: line.currencyCode ?? 'BASE', + exchangeRateToBase: line.exchangeRateToBase ? money(line.exchangeRateToBase) : money(1), + })), + }, + }, + include: { lines: true }, + }); + + if (draft.reversalOfId) { + await tx.journalEntry.update({ + where: { id: draft.reversalOfId }, + data: { status: JournalEntryStatus.REVERSED }, + }); + } + + return entry; + }); +} + +/** + * Reverses a posted entry by creating a new balanced entry with every line's debit/credit + * flipped, linked back via reversalOfId. The original is marked REVERSED, never edited or deleted. + */ +export async function reverseEntry(journalEntryId: number, createdById: number, reason?: string): Promise { + const original = await prisma.journalEntry.findUniqueOrThrow({ + where: { id: journalEntryId }, + include: { lines: true, journal: true }, + }); + + if (original.status === JournalEntryStatus.REVERSED) { + throw new InvalidLineError('This journal entry has already been reversed'); + } + + const draft: JournalEntryDraft = { + journalCode: original.journal.code, + entryDate: new Date(), + description: reason ? `Reversal of ${original.entryNumber}: ${reason}` : `Reversal of ${original.entryNumber}`, + sourceModule: original.sourceModule, + sourceType: original.sourceType ?? undefined, + sourceId: original.sourceId ?? undefined, + createdById, + reversalOfId: original.id, + lines: original.lines.map((line) => ({ + glAccountId: line.glAccountId, + debit: line.credit, + credit: line.debit, + description: line.description ?? undefined, + branchSegmentValueId: line.branchSegmentValueId ?? undefined, + arInvoiceId: line.arInvoiceId ?? undefined, + apInvoiceId: line.apInvoiceId ?? undefined, + stockMovementId: line.stockMovementId ?? undefined, + currencyCode: line.currencyCode, + exchangeRateToBase: line.exchangeRateToBase, + })), + }; + + return postEntry(draft); +} + +export const PostingService = { postEntry, reverseEntry }; diff --git a/src/modules/gl/posting.types.ts b/src/modules/gl/posting.types.ts new file mode 100644 index 0000000..92c6bb4 --- /dev/null +++ b/src/modules/gl/posting.types.ts @@ -0,0 +1,48 @@ +import { Prisma, SourceModule } from '@prisma/client'; + +export class UnbalancedEntryError extends Error { + constructor(totalDebits: string, totalCredits: string) { + super(`Journal entry does not balance: debits ${totalDebits} != credits ${totalCredits}`); + this.name = 'UnbalancedEntryError'; + } +} + +export class InvalidLineError extends Error { + constructor(message: string) { + super(message); + this.name = 'InvalidLineError'; + } +} + +export class ClosedPeriodError extends Error { + constructor(entryDate: Date) { + super(`No open fiscal period covers ${entryDate.toISOString().slice(0, 10)}`); + this.name = 'ClosedPeriodError'; + } +} + +export interface JournalLineDraft { + glAccountId: number; + debit: Prisma.Decimal.Value; + credit: Prisma.Decimal.Value; + description?: string; + branchSegmentValueId?: number; + arInvoiceId?: number; + apInvoiceId?: number; + stockMovementId?: number; + currencyCode?: string; + exchangeRateToBase?: Prisma.Decimal.Value; +} + +export interface JournalEntryDraft { + journalCode: string; + entryDate: Date; + description: string; + sourceModule: SourceModule; + sourceType?: string; + sourceId?: number; + createdById: number; + lines: JournalLineDraft[]; + /** Internal use by reverseEntry(); do not set from calling modules. */ + reversalOfId?: number; +} diff --git a/src/modules/tax/taxCodes.controller.ts b/src/modules/tax/taxCodes.controller.ts new file mode 100644 index 0000000..df93a8c --- /dev/null +++ b/src/modules/tax/taxCodes.controller.ts @@ -0,0 +1,26 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as taxCodesService from './taxCodes.service'; + +export const createTaxCodeSchema = z.object({ + code: z.string().min(1), + name: z.string().min(1), + ratePercent: z.number().min(0).max(100), + isActive: z.boolean().optional(), +}); + +export const updateTaxCodeSchema = createTaxCodeSchema.partial(); + +export async function listTaxCodesHandler(_req: Request, res: Response): Promise { + res.json(await taxCodesService.listTaxCodes()); +} + +export async function createTaxCodeHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await taxCodesService.createTaxCode(input)); +} + +export async function updateTaxCodeHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.json(await taxCodesService.updateTaxCode(Number(req.params.id), input)); +} diff --git a/src/modules/tax/taxCodes.routes.ts b/src/modules/tax/taxCodes.routes.ts new file mode 100644 index 0000000..406ef31 --- /dev/null +++ b/src/modules/tax/taxCodes.routes.ts @@ -0,0 +1,20 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createTaxCodeHandler, + createTaxCodeSchema, + listTaxCodesHandler, + updateTaxCodeHandler, + updateTaxCodeSchema, +} from './taxCodes.controller'; + +export const taxCodesRouter = Router(); + +taxCodesRouter.use(requireAuth); + +taxCodesRouter.get('/', asyncHandler(listTaxCodesHandler)); +taxCodesRouter.post('/', requirePermission('admin.tax.manage'), validate(createTaxCodeSchema), asyncHandler(createTaxCodeHandler)); +taxCodesRouter.put('/:id', requirePermission('admin.tax.manage'), validate(updateTaxCodeSchema), asyncHandler(updateTaxCodeHandler)); diff --git a/src/modules/tax/taxCodes.service.ts b/src/modules/tax/taxCodes.service.ts new file mode 100644 index 0000000..c57b29b --- /dev/null +++ b/src/modules/tax/taxCodes.service.ts @@ -0,0 +1,20 @@ +import { prisma } from '../../lib/prisma'; + +export interface TaxCodeInput { + code: string; + name: string; + ratePercent: number; + isActive?: boolean; +} + +export function listTaxCodes() { + return prisma.taxCode.findMany({ orderBy: { code: 'asc' } }); +} + +export function createTaxCode(input: TaxCodeInput) { + return prisma.taxCode.create({ data: input }); +} + +export function updateTaxCode(id: number, input: Partial) { + return prisma.taxCode.update({ where: { id }, data: input }); +} diff --git a/src/modules/users/roles.controller.ts b/src/modules/users/roles.controller.ts new file mode 100644 index 0000000..bf2d4ba --- /dev/null +++ b/src/modules/users/roles.controller.ts @@ -0,0 +1,20 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as rolesService from './roles.service'; + +export const setRolePermissionsSchema = z.object({ + permissionIds: z.array(z.number().int()), +}); + +export async function listRolesHandler(req: Request, res: Response): Promise { + res.json(await rolesService.listRoles()); +} + +export async function listPermissionsHandler(req: Request, res: Response): Promise { + res.json(await rolesService.listPermissions()); +} + +export async function setRolePermissionsHandler(req: Request, res: Response): Promise { + const { permissionIds } = req.body as z.infer; + res.json(await rolesService.setRolePermissions(Number(req.params.id), permissionIds)); +} diff --git a/src/modules/users/roles.routes.ts b/src/modules/users/roles.routes.ts new file mode 100644 index 0000000..82e38b4 --- /dev/null +++ b/src/modules/users/roles.routes.ts @@ -0,0 +1,19 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + listPermissionsHandler, + listRolesHandler, + setRolePermissionsHandler, + setRolePermissionsSchema, +} from './roles.controller'; + +export const rolesRouter = Router(); + +rolesRouter.use(requireAuth, requirePermission('admin.users.manage')); + +rolesRouter.get('/', asyncHandler(listRolesHandler)); +rolesRouter.get('/permissions', asyncHandler(listPermissionsHandler)); +rolesRouter.put('/:id/permissions', validate(setRolePermissionsSchema), asyncHandler(setRolePermissionsHandler)); diff --git a/src/modules/users/roles.service.ts b/src/modules/users/roles.service.ts new file mode 100644 index 0000000..f8fc3e0 --- /dev/null +++ b/src/modules/users/roles.service.ts @@ -0,0 +1,17 @@ +import { prisma } from '../../lib/prisma'; + +export function listRoles() { + return prisma.role.findMany({ include: { permissions: { include: { permission: true } } }, orderBy: { name: 'asc' } }); +} + +export function listPermissions() { + return prisma.permission.findMany({ orderBy: { key: 'asc' } }); +} + +export async function setRolePermissions(roleId: number, permissionIds: number[]) { + await prisma.$transaction([ + prisma.rolePermission.deleteMany({ where: { roleId } }), + prisma.rolePermission.createMany({ data: permissionIds.map((permissionId) => ({ roleId, permissionId })) }), + ]); + return prisma.role.findUniqueOrThrow({ where: { id: roleId }, include: { permissions: { include: { permission: true } } } }); +} diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts new file mode 100644 index 0000000..d457c24 --- /dev/null +++ b/src/modules/users/users.controller.ts @@ -0,0 +1,28 @@ +import { Request, Response } from 'express'; +import { z } from 'zod'; +import * as usersService from './users.service'; + +export const createUserSchema = z.object({ + email: z.string().email(), + fullName: z.string().min(1), + roleIds: z.array(z.number().int()).min(1), + branchSegmentValueIds: z.array(z.number().int()).optional(), +}); + +export const setUserActiveSchema = z.object({ + isActive: z.boolean(), +}); + +export async function listUsersHandler(req: Request, res: Response): Promise { + res.json(await usersService.listUsers()); +} + +export async function createUserHandler(req: Request, res: Response): Promise { + const input = req.body as z.infer; + res.status(201).json(await usersService.createUser(input)); +} + +export async function setUserActiveHandler(req: Request, res: Response): Promise { + const { isActive } = req.body as z.infer; + res.json(await usersService.setUserActive(Number(req.params.id), isActive)); +} diff --git a/src/modules/users/users.routes.ts b/src/modules/users/users.routes.ts new file mode 100644 index 0000000..5f79ff5 --- /dev/null +++ b/src/modules/users/users.routes.ts @@ -0,0 +1,20 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth'; +import { requirePermission } from '../../middleware/rbac'; +import { validate } from '../../middleware/validate'; +import { asyncHandler } from '../../lib/asyncHandler'; +import { + createUserHandler, + createUserSchema, + listUsersHandler, + setUserActiveHandler, + setUserActiveSchema, +} from './users.controller'; + +export const usersRouter = Router(); + +usersRouter.use(requireAuth, requirePermission('admin.users.manage')); + +usersRouter.get('/', asyncHandler(listUsersHandler)); +usersRouter.post('/', validate(createUserSchema), asyncHandler(createUserHandler)); +usersRouter.patch('/:id/active', validate(setUserActiveSchema), asyncHandler(setUserActiveHandler)); diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts new file mode 100644 index 0000000..07d4f07 --- /dev/null +++ b/src/modules/users/users.service.ts @@ -0,0 +1,43 @@ +import { prisma } from '../../lib/prisma'; + +export function listUsers() { + return prisma.user.findMany({ + select: { + id: true, + email: true, + fullName: true, + isActive: true, + roles: { include: { role: true } }, + branchRestrictions: true, + }, + orderBy: { fullName: 'asc' }, + }); +} + +export interface CreateUserInput { + email: string; + fullName: string; + roleIds: number[]; + branchSegmentValueIds?: number[]; +} + +// A User's identity is established by the Account Manager (see src/lib/handoffVerify.ts) and +// matched here by email — this just pre-provisions the local roles/branch restrictions for +// that email ahead of their first handoff. +export async function createUser(input: CreateUserInput) { + return prisma.user.create({ + data: { + email: input.email, + fullName: input.fullName, + roles: { create: input.roleIds.map((roleId) => ({ roleId })) }, + branchRestrictions: { + create: (input.branchSegmentValueIds ?? []).map((branchSegmentValueId) => ({ branchSegmentValueId })), + }, + }, + include: { roles: { include: { role: true } }, branchRestrictions: true }, + }); +} + +export function setUserActive(userId: number, isActive: boolean) { + return prisma.user.update({ where: { id: userId }, data: { isActive } }); +} diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..f3837ce --- /dev/null +++ b/src/server.ts @@ -0,0 +1,9 @@ +import { createApp } from './app'; +import { env } from './config/env'; + +const app = createApp(); + +app.listen(env.port, () => { + // eslint-disable-next-line no-console + console.log(`API listening on http://localhost:${env.port}`); +}); diff --git a/src/types/express.d.ts b/src/types/express.d.ts new file mode 100644 index 0000000..4f680d0 --- /dev/null +++ b/src/types/express.d.ts @@ -0,0 +1,18 @@ +import { BranchScope } from '../lib/branchFilter'; + +export interface AuthUser { + id: number; + email: string; + roles: string[]; + permissions: string[]; + allowedBranchSegmentValueIds: number[] | null; // null = unrestricted (not a BRANCH_USER) +} + +declare global { + namespace Express { + interface Request { + user?: AuthUser; + branchScope?: BranchScope; + } + } +} diff --git a/temp/mockups/Cross Financial Manage Mockup.png b/temp/mockups/Cross Financial Manage Mockup.png new file mode 100644 index 0000000000000000000000000000000000000000..985779ad71dc77b6bffff3244918d8e92eabdd8c GIT binary patch literal 1488565 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%0DFuct*QXY=t%P>f$g0*Z?+tC zM2u%G5{fG@W`?kq^cKuGWWsq$!}eT`T7V8cP~KGuFuNMYpr+UEh&I;)az+nGASva; zZ|Ql*)s-v*`$>IXm8$vGSm2rhastf9lHFC-!QVJzVI?6hTo5+ktHhjCxWpx`JI-O8X zO{+V(D%w{Xce)OVp@@7kci%jD!xRwUs%>Sl;seD&L!RUgR3Q}3O=|%X07=>!kAx&9 z8(=>>)f5cJ43(gB!{1T&>3mbylcZX`bvJ*f-2R$ zD5C1V+HtQlo8(r%>AI72#BBSv(JPDVR`2!WZi@N#v^8w<-%U|_V#@z=a7-#0_bbXg zo>3Aomzeuu%#quaMHXD=-6GFDYH!?ol}=Yxpow||*iKyBg#q$ubW#j>@Yt><#^RG$ z%X!cf37|QV168i0Y(R@4GCJ=5!Z7>A1|sldr-FXe@96mOQ2L-AVUO*x90BsKymgA6 za)qq2oJz-<$ZZYfaEgyN+-7IKV5a?t3 zGuY@V;SVQq7s|9FCsHFO;2FwVh=H>jIv%$!tFjB@qmdkOGHaTUOl>QEz$z#J3#`P=n%E3wa-Zkax(bxqszf)(bceKO=>e}qc8(E~O^z+;FB0K>{}QU?X`x9Zj)o|BUO%4Yvs|pRv(;2c5NakWT0X!0lHh z*sdvKP#~o`Cwt#4Z3UnHF`hTU@U_f(!&*x%Oj&8%g@{dD|FliI@kr3!;=%DBcEQD&K&kB>u?iyEk|vm zwY0QWlQsT+SRJ<6S$5{dk-E|fdw;(GU<6o=P5~v(ziYHAQRga=tZ{p4&>*sHU*u=- zjd|qJyGoG|&D9F+!&7HxA+);`Oid0JHIo+-)UkWF5Xn1=ASHW($5)-x-dTlhg9O5d zY+%AhPOzLh<&&LDo)@yjCI-~01k3TVY-UHa+b)+^gI_Bw7xN-#45*GT+1dsfmOFnq zteC~WsXce7)za8xJ@B)&%t~w=9G)OndhA$4@z%6PdMjz ze{yH;#812o=C@Sp%*Udz0<+UQgwu`)0usLC)-$dY-SJ&Y+G~9jlYP(II3z#t0AHm{X@QS!>f3VFO%){OP5{_r-^SZYnkB@%h4i@{W~s#JI-eaw~TsXcDyey!?<2yBFd31RdM~3S1dkHe|4g zv4mbNK*@wM_P((2D-*apa6hY~rj*8z007Byi*(p^A%H!FaTx)zyE~Dt{tg!&LN*Z| z2m_DBV(EeQlZc0hU`BeNI88!2CrKmFB44H&Ze}`ZUAwz98iMv)gD1)*5Dd8XZ7p2> zy6!#f-(5C)d-ct}unfg`B|*)l;I3N^x?XjPg49+*L6(FFlr0|yLglRq%y6Jb{!hDsgmK@@$sQJN|I7!O$J)W z3WReTE&ArtMqGQ>Yt{O0n43ZSgpA&@K?K5Ui(Yd%K{Z{uLQGtt6ndr<*0!!2`;BS) zGQmjHQgs7n)8bO?zSp?9gS!H2j>7=_zA-gCHr3+g`O`f2(1{OkYRe`r`4rdd$iM=k z!$u+a@Vaxv8|U8!w8fvCBLc_iZkGNrcK5=YBGniDS*ECx^zXhrdOJo1{w&MkacA z2M1|f_56iM&W!L01VOlpZX#}ZCu*jX$Eah42BMVYuFlSvJ(n~kLxG_H@nk?;i)a>@ z69`nx#_Q8qqB@o(W%5g7egl`Eqa6V+T5`69sD-sqz}gYo`=$F~G)qvxDw(}BlAK{N zzZWxl&eR(6A2UY-=Dwp&v{J*zD;|#I?C`_v1IFVhq`;r7XT`@Ts`6ZXeam3EsoR2# zxZ!Q+lh0d>Zf6 zJHVj?@llE-UO8uKQK4Dq-?xt3u?pR9HX{DQ6AK`%GY=o{eQF?vS{)01@=*g^_u5mH zWPuZ(A7}28egKYWRh`zV@Y3fmLT|`=js|w$Kye8fKqOx zhPM~+x_RD?ArRpc4^Mn28$;UBZ0d~m<_#_bdQ6@Qt=L9Y2RjUX z5*}~KwP(%HL*SjEP99xZ))$j$2_YgdZ9SfI8Pf{zSoGj1&_oWEMA<;tU@echDNO7Y za8p+WJqPAaUe^;@ZR^;Og;#muQ~F|)Ov8O3(*~TN4p^kp;En0#D5GhX(ePcWAO(+c zOcG}P$`YwQT-l7dzmB9+y zBEh;M-ZwFJk@2M$Iwbj8SzRC;eRZX6H6(1jz3Axi8`6Y#+s2x3Z@WBS?Ym3@+p-0q zP8om^f)Of`8Tj-3pI~rfu!7}mwFa_Hw7{~`m7%E|21^IVZ@raOBUK!V;K!qATembb$H-=g%3D7 zCLi~942k4U0P-jWA)2v!G#y{1F(M3Paly1YsF9ReSaH0 zcbe4|Od0)$Vd~?2RZj(L7HLzbzLt_lHDu4Q4{LTT8*!$lwGT%AJLDK?u(+drZF6i-e&E>lgsz0Re_n}RB}rAA9#GhD$*AehhXl(9d`6Zlb=th? z&R$zNz3TTPcaI01`|Tf7wZK+pbD{ScxAwzTXNK~!XQm&pYsmBbQoc>*&bwxjGYj;Q z66MpreJ6H4b;5PyDOty0kS#zWfs_Cs0EQTptH>+)h-@<;MfpT*bsoX-!QS&los-+ppJRe z-d3)>jc8;1?tg#kbxp3cp`0FqC(tUvk_fu3o}r3N#6roqV1b*(S)+b@*HvRFd&cYI z?+@N2M}Am%sP%rmDebkpE+IE`!R<E8DGr5+&5$ZaLI0?TPp< zr|f{@`J3t5=lce#dlflfk`83Gci;xiiDN8BxumSHx_hwiOcI3P7^<;R17{v?KPOE zSGtaWENo4DGBd&)AIU78{c^&TAI%Y7+sB++hfJ?x{*{vCHRP5HYjifRMU8>r0lyq& z4TN`~4A+sTL8EM6hU}5y76@z2s65ARd>8YIoVg@57ng_CZ>CCw5tOl^&G%0Bw%ey(3BaP~O~9(^*}t4xgFMR` zD_tjcZA5*Y|^-jE|q9Rc15QEtQd&*mcIh#@)j zC*msc*7lumqwKBgBxPCS(VJm?$sXd!AI%D7{&FPch$o=1wl z=&&j}Jmle!V9O-%_sdk9BFD}fD_K3Xm73OXQMW?Y!%)F<9~7(SsQ{kC25X{1f@hkl z(7=W_PX&ZDI|-vo=Oh?!48jn(+sK`SKE)3yJLNPayqBkdW(O8$l#u~l8Bz{wY_=_E zJ)hkr2^ssZ4Mj)KOn5FuFjcgIG3L|D2}CbROBA~@rXXBEs|B#Alp&#k9k#O^I4fR| zZV^)UaAPaB5eV^vc!os4LOzhDfZ?bn(wiu%xK<%PLav83CakjZQD8P{;Kn92Ha^c_ z*tY8&i%s-6b5bTH23}NK8b*`2+~a5deRPMR#zbGw06Nt}>|R`040aqzE>H1rwMF{Y z9He)G-ivx2ESfqr)(SLS|Asp8)OaGskd}|$Nfxar?#rzedyy}L{TvCs=(u-K8m<5o zGm@|%8Fy*SB7`wCk2{ZA)TXqeif!;GG(VJuOhDA;q$-!kJo>DtC=3n0UU~T&`?%x! zh5tMehEqRp6u(sxk2XGTPLr1{m)n@K7L$f3FYlfCvBh9gDY!3XSIcH2xTG3bPsna` z!ERGI41g^TGGJpRX@+o~5j)l{Q<`-Z-f$a8rH+ROcI?@-mNsK}%4h0Gavt#R*0{Z+ z7BNVAxPch1{NHbk=$e_eb&p>8t!zYae&F!whG4fzH?qft*-YeRy1`0v3&`C51O z4@t#SWnLLGt#^k1ylj2gMis^0)}hbtT}>rNoQXU{4*4GKXvyGBQnCsb#+ycRcj(sY z?$i0&&W?_bJUdMo z6nns6H5)mtaH9%)f?YN#yEO-fyGQRDv~Dp(@^749=6-^1_uXGHHjghm&Mnw;cvA%p z%YRKgi9DQ}&n|ZfCo(u^=eKKzp1b9%xB6;@>_$^Ybv%FDm4{XFo`q_AE=8PwLFGiM z|1zR)cARBlF{-Yao=_aZc)UNEAGZ-CDyxeD;t$UpOGe(f4jV0^Q9}gRj!t57Sz1)W z_ohy^8i4$MM+~-kM~tT;4Y6EKIYnOAj;5S)_Tww+>=l5v zn&!VLMK-lOI`k(A0@JItKkSce^^k_An>g)#DxNN-jGStEjN&c8Vy2!q%Z|Q?2cQW` zR5r3R{G=KABu~20CKyy6ogRL5K=p^QpHcl9EMe1h5Vi2g#0lXHx_P=Qs{cB)6WOwo-5q}lP>8Fhu7M)lxia39U3gP_A>NJB6fCBX zU2A=DI_8UUv>|RC*c`XUKvxAB&B4|BN)UayP6ktj`(D<|{=8`gc2BVi66|A@7m7Bl z{-%y8$VFNAE`q-inreydAGExnw9s7&8bJ3ny@vW#9$;K|;MSvdRSd);K-gDWB7ccm zgvB7V$BGzjVuFhEM+)S=SQQur+%*X#C|EI0yqd7F=Vu$vTiHbMZk?eA!XZU{S&Fp;@|HJ?fG?3_oiIB+u;4$OVzqR_NpXy z%2QXXoKR~zAyL>26eF5Et*&ZiFU6+xYz1;ycOly;Z5Q&L*pLV|ZIJX>yDXFf(;9^J z(sIb^JnHFSbN<%~Q{8(A_(HBrIsG(g?f%U_#6yj4>-`7a_rV{EI`rPpo8k%|cXTTd z_}P&hZ>;35?EZf=y$d|l`TjrtnK4ZxWMWrir)4Hnwi6j_qoNFLB3;hec8`h}QMMY% zs*uZ!oe?%7HnPHYx^1V8k&?<~NG=E2O=UDiQB*=2cZT2dv)}*!@z}>>&+ci9@%g;p zuh;WxL0~;{tH$*!BKwvBxC+yYm|YZ_y9$tw0s-6x?ufdOf&I+`AB$_j9fN+MzY>sa z4yv>a18I=->!5rRJ0W0Zs?LYsg&2-=Cb^Dqwue5Q`ld%QioA`(IO<;?8FG zf1PV~V`0z0cZFLLA;m-hx-8g1`}W{(as4-2p-ly7;ZIQP82oe>{2cEzrSG$E-Zy8S zNE7N8{V{9XfbXj}r86{#P9NV-uW}44kA?lUK5c1EYe^Be>!nhy)&w{%xS_b1hC(2@ z+*)+-;0g3I3UI;O#b`~-|5|>;Z#Ljsi&izZA8|N z7l@3}+H$w_)#kYzJz4y1!R-?ByVebdKd5Xsh`bpT!L7$A?x?#Q78KRH#P2;z%A0YzaEhjvw9^gwoNY~Qd19R4{d6QFLqbq*oW$y!)2mBEW#vc zF&U(v9V}DA@3DZAet69$6i-1u`=a_nQsC2HTUmwQ~Y;;QJoMg zjz2?@g5*Gjfyjd;hxV<-Bi)t*z2FdmY%q=~;2~bHRS%hS>_I>0ox>*6K>|N~P1K$Z z${CA!#-+ea49OE+7xppzT33c+(Hy#%yCOqwJAV!x-;y{Wr1xDA>A=X*Y>eO8 zsDx%hN*dAtVuZ#ACVLP~dy%Nsl(|0uoU3h#bzBkJTk}rhP{nEBG#A9oooWbN`1J&s zJ4~v;Ql=X0=r|`~{$&sV)LELJ@Wt;#?yfWfI1LUNd@Gn`a0cS{ro>g5uyW?wWtk#N z79r~o5S~Wi;j>nP5fS7pmoJc>4(5*)-$9NUSYEJ%{(49&L)|+5_h%R z`ei((^~5KUY=Y-ap)Ue-?*uIvjYWusILL+;p?=a33^H3u)#vbAHo!G68n`kK2i^+f zE;OzDodkq(K71Ou??_5A%M`~60VF5@Uo~Aw*RN(+fI|UGsY6O4F}M?Ph+YF8hG~q# z!7)^TIAVIOgta9=tMEkdX7QVg0@%_2Dppxa5AoD$&`)jg|OYA1=20Q@7KBr=Ip z_DCfnz}K=VnL7-xWmxu-{$I)a$EMj$PT@0M=IEYJIrt<^=ZdHG#<^3$K2ILFc{x~o zAeI+zND(h{{LkH$i{|N|jeVp_+&!*X_tmXmcG+7e%hzrWURAbA{p?>~(U|k@xt#vx zBGa8t*+DXUCv8RQ68lyT5`#|M3{FN>IXew4M$c&oK7i?O73XKEv!r@B*-?Gz&Bb?* zZmH`!`+`dzcC37SI_lv*bMc|4v6m}Szq(<%ab{*&#k&)$ZhiUfrulL3$$^K&xQ&tt zogEj2?)5#v9lu4t%{scx8HKPHHg6Pd|5>rbMVdeU%d7C&Q!m#0_I@9fujTf)m^;S~ z-?Jv%nVAM09C9v;v))(8Zsz2kTjg6ZT72P}3Kj`7CALSvfvC@{(QtLukU6QL^26VJ zzY3txvG!RfEsP^Hi^La?Ze5>q_pAMuTiI~6TRyzHyI6&K11e<6_|=eH8FBn+kVKSy z2$(#$%{;I3!V!Ox8_}7})AZ&xbC)nY+!?YIidt7Hv>OY%d?}GooaWa``=5%hT%@TN zaF^K!!*qw+tM4ej1+h4XhUkHGB913?MRpLRm#E2M6FET;taQzzut=Ypj9}IyESSM) zz@8DHiH;XCbiqwxZxy3vzPbc5qNUImdEmVyP>{95&B-A^&)=8jvL_%cp6Ti?RTLp; zkh$YqYtrc2GCLh&Em$a-tON5d8LtcZ=vEkovi14%5B#$Ef^wNId~s&(z_|*TXB+jY zY&J}#0K#QZeB;1@Xfqy`TwD_vY6Ert%^=7$SdgaVN6O%;F{6EpA}|cV_`F}6BN7o!wWOm(gS3xvJR?fxhtH6*uWzZM|Mmt`1 zqnMDx7a~ByHxHd;gc{RBZZ^4%pt6Q;XY2v~w7Iy!6;No&dUUsSQIaXiGywyqJrjoR|^|z|g;FQS5thooxzg!w5&9roVqZ|5wgwp|XgLm8s-!sT4RN{K7 z+^I@*2idg>y0XP&?-vD=EIRM01RHOt{tfH@FWfl`ROIs(RLS7jG*wDz9L1e{)E0`< z0FL0pf=h+$Hd~QlYgEESxR$PWdN5g7g#7_UXOPVh5G13DC?6;U9Yq%;=}$2N^pS{J zlWvN84}C(IUp-MvK}{nKOky1BJ@|F_dhB69*FhU5ok=iIh?7WZ($<8fgZ1~q^G@i4 zL&yI?5n=WV{RT1t&9o`R&(zWZd!gV`BM*q0?9PInOMQYAFpr z+ML}SHSi+m%!X?xpH#g{G2HdX{JIOv>Mp!9AMkPhz%9P={MPIeXT{jJsr`Oadr!^Q z7v@G?&ssbBi+9_}+#io;&K^Ek(bM?Ly%k#*jy@Z)ob(=C5peu}`fsd`w3UZWKYn=M z?6aW3-G(~PXhH_B0F;6#FDngBObT+#Or&%0c~J4n5@{I2ah}5OTy*;HYu=E&=V?9d zJh53lqW^MAUCVyw;iup#4Ft`FGn%AAh*}PI0~pn6^mt@OH}a6^LssLQ4cLyq+R57ai zA(057e1jzCr=3&Rop*is5V$Yr*E5%nw63Z;yYs^9Rmr#do}I005u-vUb+WZ``rgKM zA6&+AD-XYWMA^Y)6kl zNymqkr~JxFL%SlJ^Fy2e{lf8wslHOhprhfl1O5N}YPV}pcz5A!+*s^Aqqu)EbUiq_ z7$`_sN{7zBSie~B>Q~q2zWCiC>I@PRePU+jhUnk_?r!35CLRYG%xB;H<>%aN=`eDl z@NUGPx2O?6#ALMn!Buk7zCqF)mEGX>d(+Q>asT`Vt#=oQ01MMJTFGfV=84M#39@aM zR8~N-?27#f^#~;pse%cYrVv6>3hPn!Lvji--&i#L;3o01OCDmGBKQ*b#hN|E`9ZtT z-o*gej*|;8B`tC8;kLQ}v)7#ynq<>#4wLFpz5B0Mahc0)1g@yUR8aM-zPm{1P?Po3 z^|`ufc#l5gLUJQd3k*mG>rT0Ve?ZMK6go?hcWLK={WchB`ZYSBy$Cr_u>s4^+|VBu z+WunfkD2MvdkK9L``T;_GkeFh^g_vWRnX$?FoSZqdCPdpqz#D-p;Jax_Qlf-_`JpJ z!<%lnNEN5?EK-{G3bJ-G`~z}=>^U_$^+rZi6os49xmZQ$LX2BQIE72D?hb$TVfD}d zULV!9eJ~;`JSGS1b=}&5kePw5_!kA&PVLccM7|{o?31m;O?rWVP?x|BgC3m-6J4Di z)ZWX2p}*S-gLQUIWgbB$TV!E;Z%H5xVJK_#qhj+cNx_96g}SI7I;Eu;mPu>|V|N*D z8+f17#TqJ>Yct4LNDF%)GI=5SL4r2?<#DK%hU=BU8AbNH_QX=z1mznVFeD|1JmE1p zGIucez@O9N^}9AKWg2zGFKEf4z%4+;m2R%CvWM>)(fTcm32p$=Jt_X6KgI9}0zE|y z&hr+)FWiE(h|?_GKp8GnL<|tPqGd_}RmRIhxc39#qdF+L#lLCU0PYBZ)keqyrZR1k z(d8FMC?4#k2Igf%9>Saz7cswtbSiL$Y?xiKwPlA(B26d=^@tF#YcvXq1&w1SgoFwZ z^xxMV>e=waYYwx+PXqEDt`gKN9!w=&9{?GqHy_lm5S$?>qBYYjc@>B0Rr;xn7YFT@ z3$2zgp~4lBN#+5GnIMN)0CbI5hzV!F7D+`6hb!HmDdLjFen<|c)f04l<`A0E)eMNH zachY6m~M1PdPNW>W$mozu#uN6WgZxMx&01f_LF(mLPo3y z4&s@9Kl8^AqSw|gFCV9CKaHQ5`C!^#)7)mH%{hu z96fv^43dtk;t)9~Jfieuqtp&ho&aJ2ESMlKL}p6-NXa^ITeQDIh}SbOKrevLN;cNl z{jqg>{_xF!y6}SXSCh`#4Ch%gqppAFHi7$wMT-`#`*hxLM!s$QH&A4it3snS&~d)a z-R`(8s=8HB;&3ST&lCg~TBfdF_o2w}_;bIt6Sg)ZiYI@){~=_yVrsPG$XVQ-E%yLbZ5h^ejU>`6V|1eHi*WpG$P=>G8V?wX#W-0PNW zhpximXfu_p9xNT}&_0OH6wrY5LqO+Bmj&yI9fQ5A1=3*mpf$l7!gU^(%gp|Tfk0S3 zs4(Wo$3dH&#~jzEhfKdeS-0-y;r5ZXhoyfMhE7JDqZiEi;oZpFa-Ggt^V=P74z|2) z3Ux(%0jeo5P*Yf-SY#=Lm8l(bp3$H8%J)aVTsTyt{#0c6-%E?%b-bAFcU}|y>C4#1 z>w5>sFKe@{2YUAhZgTx)6GIot>LPC{Q)R@R^BckZ?Dx+pUG4g)?P3WN8vS?$XoPXe2&Nh6Aql)}xM9C;?&xnBKzNxB+JH@mtT0l!%#30)PlN8tO| z*~x$QiSI;2xdzIlt}a=}+au3*%znH$a@66eF*|hTQAG5W;ajTbkuC2}^!4seVHA{( zeRx0ZvhI`1$uFpj4=?5pS*6pK5^y-lamths4P-!_Xl4mjS;nO5G2J;$+T@g!V122< zjsDHsnj;UtJ6ASj>^!1(ZU4j-$tQp(x}HU83^4(u-H41CqIg@Nqb-b7+Z;O|U}{sPDqAal-)rTHcIn1@DFoj>+^07ajpT1TnNoTfzFBw*_%% z7$X)ikRyRF1E4Yf1h^&O(7+6Vxxk+4jYbkBUFL#D&(F!tVs8Pd!ix~Zks8@1dtES} z_*@`(#bpaU3-Anlc<6ZY@n2C~ih&=EkNbRyoJMdQ_+W-M+lee>2s)tAWthbwq&Yja z_S5;1H@-dNM;#HU`a{sQ@<;0@jqCp8=c+H+Y;@>+>vjC(IGOFFfQIbJKJa{e50d4hKCy9ue`+#gh;AtbTq_zqY;h!tL054l@;lGgY0F zPdaC$spAT-hzD6~5JlEKi}(ts4<`hh3&+2;ajUuD_rV|Dh;4V@xH!y=$QUYEN2nX^+#`J9Jeui||#Bt8y1K5LnI_%qVXTxTDpzN7Hz=+;tDP6o{@ zdV6b?Y1_Gvwc<5lkmCA#Vq1eT*;H6Bb*W~E)4nW87IXb`S6w!YN|n8qgdmUyucMFw=WBXmk0thuf$$N0_DJlxt!+0;QD*o5e()I_kS#yLt*J*$b!h- zFTk~=^0S;H)qffff}yEo1}6 z%$8eY!Xfb9BStC_%slK(JY8?mfY-hkP8xGF$xQf6V7cSwkeOXU4|hA=Nco|;bJAk0 z;vou8RY$d6F|+;V8W+R;_ZH@nm)zPIrP?oQ;Q6a~9p_K}>L>TZr)$dZ1&`MEttfA2 z`?RKXKRmYZeABVP2chAe)>?(P$+ag(dSmW4x3$>#`fRyc{$l9e*dLuAjuu|uKuv12 z3eAo{0vg_HjHK9Y+wlUjm~?k6da^2!SS+L~)u;;d}=OO9j1NPYU$M|Ym0c3 z6^U4y@#SS*C$&9;vqkC+SHIB1%MuJ-0fa?)Cre%3+(l;fbdXPi76=Xf(O3)}png|2 zjzuzGEiI5qdNL6v(bX<@@mY#E1ABn9Toia>K1X4fN{S47km+}t=*cuHWRnn9pguC$ z77GG&U65*!=mLRuErBQx3du6U4LLC_4@_K%vs3WY23qM*_0l4?8VPU%puO1)LsNi~ zDub2|8r3{!l5DFdWs39wKI&%jVEM-V3ez3pNtt--1sW?mhET+0LB;5yGNA&a$LAzs z0ykr}G?(C*Wf2--t zbaF1|iG9C@M#J4_pW2NIh#b(3Ml7gjN$0^**%W4MBn3&g98qly=(Q-Br0@_qvVcsh zSjm()Od%Xfy&GslGk5GQR!WvUkcp5dr;H+fSSa;HR+Jq;c<92CD!hnPK7I{1AZ`xa zgDR)d^Bah=S?@zC_rPa8!NAn9Qneg#eQ!HLY}e101bwPilEDEr4;1#ny__7zrIy* z?duV_UEg@zymwuhUOpAmy5O`{|mKPt&h<18;;>18(g=iFSU z$WP{Gv%~gRw)LBTxWwkEu2xR;Ng{I429#qq{3n?}s;X2(y{qm>amYW=H&QtLXb`Hp zvi^=s_k*0?n5G`DF_4T;Ni=GdEfo%ZVH4FlVu?(jTSY3yr_1cZNMuNcz8G;>)S12Z zO+)YH>;C1t9y+{FGPWGJt3@l7$TEri~Viv6~Iv8^JpsOnf zlOAWt$^`mZUUqMwvbMG>JNdFeJL2qgXUY8otfqqyile4W`yi@J?fp0{_a#G^UD22K zE_OR>0AzelPe!KK<#<#f95hx1>)loLSB{gqA*6n7OvpJO4b zN^GRr%y43A@;_dYlt}-r zG^M}cp7J-@g-rfR^it8>&S!SyMRp_@&=po``Zur*>4BU86@b@S5uAoZ3XIJ9 z?)V{tJ!}BiK~tg4QpZSu?ayg0KvOK-${j=(8pQ29TuF0{{T9S9drP!6PmV7-m@Vja z6EVK5+}Dlcb0n&-JoLYk;e}awL%*EtD=CdQTRBv>aHh*9d~oeE_zTTCM$eRNYU&t& zvhCd2(Tb6}(c30_@2MSQn}>Y9#Cp=YC#tWyU7O$>eRnL+Ny0?URK$SmLqTuk#lFI8 z=st#!7+xot3)%LR4fiS^cwi6@#=++;h|Uop4aZ8XpZTB62R5^{gXW#FD~Q>u?|^rPGjZ$0M5t zN#U~&zC&R(S#O9mD;|u?VK<`_r;tc+ zC}`$VO09(?ZitaZS2t;@T_xDcFNrU1-uK4z_KQ)kRLT1-ZRhR;jlKN7#BX0|@R5=u z`+A-ZbytqECH$3Z-=DudUEMPKur>c!+fk&SwaOkk4VdRmB3@ma5If!WbmO&=}E!*Cb!u^o-glnJu;a<*=(8fTH|E|Mc)WWoZx+WqlDS@Fm=FJ%GkWTj;8gD6O$<4~7vXNC^6`|qFNH6W z3MnUS5i5$P3MAzSUxB^U()aF>((uyh@=onZ<2D~}SEB3ZLNvyjPX>4NH}|2bFDapu zCA{qI8NV2bL3A~jQcJjkmsK6gSh9)12ZhNzyYL|ckU;X@iwvdOJNCgs$I^kx@n6Oq zeSf=@`^|6Qk97}UUV`)vaOe=PyS}`+KCZOdXCL$^PEs^vQF0b4-Kgp^AwF?TNcbf% z4noKe865$sE>4I*EAS}>xXh6WLcu&n&^@U8E?rx2VzH4aKhr4TdZPIHo6lb8TX=AI z&`-(@AaAE!i8*9ryz4%|PJfH%>DP15wfvF<*GNmC(UsO6?&&z_MLNp@ftLrsbOg0b zy3i;auWkVoJD@&Ur;Nrx&6}s!e%XRx+9cX0_TER{oGy&iFn&4KMmQ+KLesFhGH?>0Jt7Y=R3zGq(Ftocj!n#9MAy6kT}TcDW5!)O#Q=b@ zFy{cZOOF)bzYfbbVDLpuDj#+O!$2522@)sWY-a+Z3L+EW%H&U8YD@aoDake3Kt#cy z6P7B>v_)LQ_(Pfgn! zn$7tM8OZ=xalTUHfN7I51sD?9M593Zpx6|ZGhxma{#=>xZ)6eq=u|yOSm;&*mIzeG z8I43EJ&+Ccf_gf@YErJOSTF{E1(gXK2C{);ODLEb7{XIZjy~LsFfN8U=LBT{age8^ zxrl((_q2@AtQyia+s~(?#Mo6dOUetkT z5AO>W0}5#~r1IcIw$&P~SvOob8^JQbqNij+W5 zmg@3Z7UYrYbP`~a6cUbjVJ$Emc_0B~qna+Zz~_du7|~6&?jju6x@i<0U_q=vA{l*p zLOPK%r7J`GC+KB&Eqn;(yOKyl=XB)6;iY^2tEVya^!8$GE4I@ z=)-O$^2WW2c?_ozQZl)sb$wn3Po4Vr0xklke`=RTRsbiVK&+RS6S0CW2Cvw&Q_fVG zw0Pjhh#zwr0D>lXG(ZACgI=SP6jW>g;LBeJK19wCpd)>%$JTAuy~R7P$4|AJwD1}@ ze4KBmi_#uw|NdBo(3vPg_pk%_s!I=NyF&6lBEjgBjke3i_df-fxiw$j?%ckQ{qE+L zty*!nL#)OSsXCG?!x|&4v(uZBQSWQd#&$cS+);Z{aO%IiONx%IJfO|?n@(A@bi+H7 z;sU?v>B8x}wWe?Q?Gt0$j=L7X-P31jI5iiAX1Dr6wdKwqyRR*|bnSLWXq0o`Wb6vd zmis%T@%o&0LW>AD z(eaPY(RRy6^0iw9t|F?Z(@BGpekh~xG6F-_QT=;Q9HE1kk46U@Lnt}bP*M3qaV`z^ zKoHX+u_azEJ4C*0QbRx~UDEV9UCHr8M6qXjASnal@C0jQ>t?pz8{U5O;63szgHjs z;#hxnN=DA`_ig$A$jWR+o*B3xP!l@PU8n%yLfnM?7FcLr4hoTz3~B{9tK{6Xr}Ebr zaFlLRUUL6t3mh>4@bOXo#p;J&yMbRa@z;lV0OBvbz?_Bnw2-Puih_#g& zCToZ?lp=)O*qQQM_MvSk7DlBOULbgM+@|rt-uQq@(ozDwt25=n==Ggz2iQWSL~KWi zSn)YSr)!>P*F;g|EA)hBkvRqEEDJ{RP$N*dW(~rfXzm1}rpGb>FhN+eR2LN^9NgwD z4|ZVcW$2?09aevRfWs!PaB^ae#@--jdO=AO7H_REaJyj(BQ}t&I$W85+a!Ql<~=yu z`^}qnycF2WTN<3wK>8x_9h%1V=}@=InzhNn7I8prK+a)(XUmkebT&>{adJvLM2kYg z4c|cze26s~aCbPtSr{g;-7tZ_L8-itmdVqn$MFb#h}+S!s;_dAqJRwmJZ5Vwm6R?- z9AV3fgO#KKy}%qA=WNSV=-FM3n`K1{kUb#mvSULlhSUX1QymEF6qKBx(*%KgmyT!S z&St4Cm8>d_OOaC)RRE!AEFFZ^BZmOi6pUHPn7;feJ#jdDA=kxq=(tHdy!(25?~);> zreX%g4i9x4g|AxWk&#`}|FwZy@aK(Saqu*JViQBDl1)_1IcqvU;VQc(y0Z z{y*;igomDdzh>gxgA>6~d0R8sIgZb2Ru%6pnW)XQ=iXBC664puzuQd)Yucw=yRoVy zCYpX?gZow)MGm=&KJZAP2;r~Gs2(gBI_2`ufNBZ9I#e;yV{Dn)8KF(`K6JO>8!NBv zco}s6>?@!Aa5S0II`8K|g+by}JCer##`tL-KM}}jz|WYW4|11jN9TcI;S%3bKSZ8M z*|Lmks>cIm69mN%_Nr1OFd@Z@Kc5F7Iy^Ot^9=Q{`fsM|;<`q_cQVLptVv9kCl`;k z5r!e?jP?STVqmXd!UfUXk_EgDSgp>HpEo!-?lN?z>bo+k-OpS3_^b$dembR!!S!Xa zi2(P2fDGM#R8HK!c5mRF!>Ro@;}k};O+L4NT~(6X9QaddH5|gRDSE-OeRZgsDN4iu)nUVX$XJ0pT*ScQwe|w<+z?*pi3Io9^19x2KDLgEE z0asGib9Gq>=P!N!>*bQ7v;BkpHUbCr*GF&ZsOdD&KD7dw$G21Bd7mdexHWQ|O9%utdo538c{x|C)$d06*z~yT z%aq8#$??mlf@QwM^?Vr4DTF~}$; zPB0S@An8ReSWd-x&8$ExS@4xy0UiI4L7`9sy~(0pIH5rUk&`5{3(zDAc~~0BI7D!H zLfA6N=m;JkfGG+;Z&(AjK@pBOkUYd`Lung~x*W3R#u5_)T*pwSG(!oc!6ShunhDN@ zd}}z6W8sLJ1F+^ask$^k!YNxf)H!K69LYQ(WZJMrVDua+B*#T1s>IB&k}w%i0pVW= z=uO(D;zSfC@LQ^GkYk!Y$Ho0y_jz+z`YNfM;Q9}VvoRIAh}d!QrLGv?^rgW(%ye`R zD*pN$HTsx9da~7|EEjmn=X7ZIxC+}WQ$k+_2R822YWgEOn@fXHm6VCKyBQJt1K@=8 zPsW|Ts+AK*u^=pjL^==z4~*mrYY#*xq!XK;rSl*h1XSykfu_SMrwnow6cW%T!@Gi! z%1(yQ5r;prM}!PhfR1XGD-{GrI)%*)T*^#0s4huklB^q^LYNrRYz@;&f^`wAuZw}W zdMgt5q2D6_RYQt^9|L}4SLp6ovZ5t?NK$_%0QL(+V&AV2=)`RV+`^C=?Me;4Wj1HQ z&xyM{t^IXsGZ%3c)(se15wq{F5!bTPgn_>@0fS|@Rol67WEe^7VP(d-nqI|8ULXb5 zQoygpC=V4jP_oh{f}vwVwLtQ4ARZSb1B?68osf};bVO`&jFeNtoc)vInH+c`n(ecD zxj>b4x?)jQf>x%a3Bd`s@xJ0zheqDG!Fr9bFjVgJh&cI8L^|Ow{ZB!REozB zIv$qC2*r{Qid>JSD>4ZPo1oDH{mVt9Tmkd6ojX3v#Yw$;Nc$jU)-d-!Z>etBn{I{M z2J#-{Zy-3IqT=w#40dLhpGXf6jG7F}c80DKS`D~zKc~XkhReZEzVP1C^_$=_2mMS29nb_NVx#u0 zt?A~|mu&l*s_A?Nf79x6GYz_78+rZM%@gNNwp-2)q^_H36YSGEI=|oIH&$g+r>*$Z zSNZPnotd+SF_o}q72X|iNuBs}Ofr{e+8s9bVrp6b%m##nt?!)P;ydUN+c!2)K3I_z z+mLm&=Mj^uFQd?}ZSD2?q&%8JakVa~tV@is= zx%lya>()h|40=ydw912%jhS=&A*FXa#Np|QnO?MkyPtlwc}fvvU!)wS8ZjW7BGcxu z)cNw`BL4C~utyIi8CQoI!rIc!EL})d$1)C{p;;EB!ZZZO$=W=Lx5mLtCGL zIy(jzE*uo7L1!Vc0ALJx5E-CK5i%Ocpj8SIED|M2WJ|`(89ACrkaq#92WC?PxMzXE z;CaF90a$SMi}Z-|;HKay0?z`j8ne#^quDp0q)>_4GshM|3yBLK*3tt5^nus->`P{n zU6qh{crbXvpM<|5M<0YSu0gaG$e`Ba=mtRH>Lv};5s6{9|2i!l3nw!(P%Te0U@3s? z>Tl(t_zh4TZh;0~iwhM;A>^6O_B($PsswK7DLjR-9P?#~eXynILYf$7dXd3bRJ>X6 zKf%YaVxDe*nef}o`0_noK7GWTr?BR8kg24i6T0C1*-F^LR@j?Rc@(Lw7sx#}&VITF zlA*ngASFY|C6PP_9JU8T7Ayub%kv0)Hs9af3I#fL+y6fCKuwW@EjA7v7JP2*LaIQd zb~~R&ust@|spdC4-$tW~WjsJ9q!JFAUG&eN{)Z@MZW_~-3g7|r`<*86RLDftr7U&b z*f?Z*yYofM8sxdzZ|O%ltNPhn?{BG=8yiEzE@b?&pU+$(=ix_2x>`6WG@fVIU$d(9 zH=|AJp4j;w=?3&WzW`Rn7|VAj&i49a(QnpRfdA{dlRah1N4tpv-7zrc@c0CvXAa+x zhnyrxM@R#Bgc*8EyjTIrk!Bdf(<7>C^cK(Tr9yfKh(H=K1FdUbmdiA|9e4$H?&LWH zC{bGoFmz3MNV9?B1XHH03aC56zfeV{W6D;uls)sf9-KG}(gR@R4(%3v87IEELE*PF zK)c2UZRIWkEyygfHMs%mS%<|{W+EmGx0wjdUA3H~wB*Hs37;9+;TQ+7{^}c7MjS7B zF_C~n{PS8Vzn&!vL@x$GejFo|0t6x4Gb zTAf-uQ~hPYKBkE2CQbb3=6^R?p2=Q>{f7X%s(_T8lJm9o-XD&AH8c6H)qM8*><~Fx zh4?1*^&Z#zNBsPk1M8AvSyBv-pGlo+xNTRc}(F#Kxd^=YdR!-fkz^Xd+L^5bN<8B(FnIAH6Roj3(!T#Hwnl**mUr91A$QxxE zxaiLHXdb95U#OqQPOUYR)U4l@w=Nd(QZXMBDmup`v#AxYQAc~UZ8!TThW=t}Z1)Q=eb~Sh;@&lp z4yss%Edr9i#kfF(9670XW6?}R77B3R2C7wJMKA%B3_K0$JzbHagIL3sW|&>%@ZGN? z``lrKhfE2(_A7EALkW-*ZY2~g;&n3(K;FQRjcww>Y8KXJ7{^R@V5>d3yhd*i8=*T= zev2oDcsvG?ukZk87$9gMdoI5vHJFRvZ$8>yk||tYJV~(JN0?x3cPSIX#Ft{*l4a`! z$5vN1bo6H%u}B#(KxAiSPw6&k_Uc#D_55{2Na2%-J>dZJFgk|-B~?=Q?&}*H-|SiE zl{gpk3St)m*!4|Xt*k${KW+Z}Qv!iW`oH^*dL3Lw`J(RpQ?q13pOxkx`S^hO{+@E_ zg-hF??M!P}lkFuIKOF2Cx}NxQS<8;K<2{jHOdr)jbyux~Q z1%(l?6T7l>YM|ntpVihy&JVR>3*`GEPO4z!IQpW^zx!Ei%HzA%X43=oUsj@L!QAT_ znciW|6+T*}FVProi*Cq@D2nXd@HPqgpgm8KA6k~#I8dg2Xu0m)RYS?^^@r|Ez&5sa zqG4Nb>k&jZ9|{iEzdw0(TY0~2YOFk$G($8&7X}Fl2QxhuG3E^e-1Ag;Oy{xVA`ijS z4do`5?|H68y9y3P)qa^8J$(PPvTx+@U`%g8<*Uj27cN8%l#LDFx{?|avhH2Ow$5iA zcL$!?Hz(aePZ+PTUzjI1ylZ ztS4sM?tfd*ls)kLj!gCj zm9{^?CZML`(m+oz>^SfqpOzlL(CorMoUS>vcVHyfR z$}#UVoZNQBmwOIaUt}yheD@myneFMjzDTRtTg$>N2mzLfNS^~z6oM(@T z1#nx75jpv}3AM?-9lDUygekI1+&MD1c|*|8ht1_X<-ea!n6R}bTRWr6_WTwX~9S{kd?YREew#^qKTAl z%1e`{CA)|azQIE!PL7KRCn?TUD&U4pLSY4}vw>x$Ll;U3oX!C1GL--%0?@w@>&oHd z;qX}SEm9*u5k&|nJ4{qYt_*-Qfb@ha7#EFL*rIW|>w>qJ8k}w9`RhQULPBadjbS+P z!D|Xhk1EDXnW}aMXiRcXw z5kDj;ej>0}D2hP8LY1q|tQgqnb7G1u&P2CDCxzcxZL+4aRZ*kQt7cp}kA9CFhKJ_Ij)uO!o8dfaQK`6dNBhV|vu7%y zwbS`k19`01g{47eZscZ^wf2+0;k|y-a4KrNnrrtA{fzcd$yi%zTjpv9pOM@$Qy37sx<-}Gby7QP;sZ-ddeh82Eq36L0| zmuW><&!oXn?UP?gV$f+=J~A=)29xn9#)JU-g^&uo*@a+)X743uHJCDRXYCMK=!#)= zfTqZ(Wgmj`q`}}VQQ76C0xp?77t9EY>u&)wRV_nVLIffgN1Ti&2N^`%1~>_9rSWM+ zxS}|OoGjF(r0GNG>#D+P2DR=vWXRxq+DivgLG+Ko#SfC24htc`>Lh7~Fk(;AG{; z?Rmqu(a+_q?aLp^&iD0n@$pw!4_i3L_FigrguW-iZ|Z8>?1Z`R@%KOWo^t%R-}tK> z$w*ye<<4;P;WfL92g_9*uP)>b_4|#!%%5p5PIbPP!A|g-JZ)*y-{TnjxVv)lq#05S zV}?FFN|ii&btUF;Lsq%%y8hz9vjxuDH|BT!*~%U1TNv!|%ONwFZ4uYoj$>7N@Zw}t z+ipq!*LyqL#H+VBp=%%6mV0EvJPxK?>{BhLRriXV#wpCSC*$YAV<(Z$5xSt zOM7|gRHWaq!L6+}v!86n1R>hXKgPBqSL(;6v8ciD>4L%Os<7Uy!I_Sb@Tu!9<9UNq z4WS3jHGi2S1+y)77V*>h(?fo{!?afoBl5$w?+a(2mX}|+Em1p2?zcs)B-0=9(twbL zW$cnO6p|d*i^~jc-+)L zdraZj@!M^Y{aKzMgokVvP~(7+{SNUpiIE_Dkk)gDbdh7jk@hn#r4vZZy44;l0oIYPUbI)>iB!9a7YF}aG>-!-SSMw*&9O^J17$|?dyzGN_Swr9S zpN2E9A0`D9j{j&ggXcJ>aYPZmfA$hyf@kmFA{N`rb1+J?fZ6N3w{AA51>A|rqiRQLM>#!~28bojjYu`?OO$ay& z67)@u2j6iPcLo&!kXjrkPA9G7D2S)R34@Yb5h0_AECBNb-5}%!a;F@?+2s$PT1lh&PL3;aRO%-DxBegB4 z1d=B&p$M{)mXlv^#5!6J+F4-Efi4kZIM`^#(3+l=7$-GCiYkV7$mwJnAW0`FjJrY{ zuB6yL0K~tF#Xi|6UQt}0czj>L)Kl5XTaSN|KRL0rs9g1I?X!s!=BuZ3J728cHD)vN z+mN;2rJoZ1wcX;Ut*)6$y122HcX2Q8Dx-b(vd&M9sOC8MtgPf8+ZV^{*Xkz8E*!1+ zaPrKz?vCgVB2@0eZPCLPojtvWrq<5ayf7PCT4i6Z$tfQ(oKdwD71I!5Ps-+R~7$L$zd+krD+U}0r%lw{bT}0a$SFx>3*<68YyAWr{=R z&vSRLoc7YWD1+kIui0!Kr z`3%xnIeCe40+G+ayumbb_1Omu_3zw`(@1T~jGPbMq8$h5_YSZWrTI({m4Y$*vkTqe z`QYSb0jdrL9F1iGRK5Yw_|6o2B^n6Vy3p|O%EegB>(xjqbrB6NJbVqPw#e~{1w%BsIt62c(1oYofkUR zS5bAaygjG#-L1CH@r{yk{K8(z#A?6c{XzLNkNsxObWSz3Ogc{ny`!h!e6ptQ%jxEB&GL0qP5ILg?^H^jSG8O2 z4Zr`cE$YF1E7L&P>5IyLyIm=??EwY4*l*O zp84s)UV(^kj0Z^(K@3IfBA&%(AD|srsKv5@wNZz@xPp>{?+;eFbjkoDA1@-o zxge~UeBH*UDyBAee6sF%>m?b=+H^hWm_YKzOQM~=bCL`zz}^D0y_rkg+hDmCi4b9A#qw7LSQWTBXTcL z&0;4eI)>bXr+H?`X5w3$Goxgo5UL@{KD^7YeCVf&>Drz@{d=9$f$}dZH0p|37jzqJ zl+;W`|FuxkOa>LleoQF$DtWj6_B!nn-wz8a#}Xt61D%>cL&Wxq3Ga%j&;3T8_ztf0 z9muKBB=}Ap^_>sA!1m|YY=$J1zgnW_8m8F|N=-(`%Qa~wnCg{n|n8!|OjDS3q0&hew2!!P_kMdq*SJ8*dke4Y!4 zbQdI`l)93kCc%UiFk=b{tx^?p7|DClUxQpR8B@GQ9lr`!ny-W#1;Vuu;MfdgT(M<CAJLFKH|LJzt>Tc?Bq52FXp zUsSGuy@k;H|AO5jO+w?9Qb_UkVg?lx(BGw(y4E632RtJ%3Vpl8xn$N1w&6gmeYFGw z2QMgbB?rpdTEy&Nu|o8<8`3!7lB^aWsR`VAZEXqSXDLBOp{+ehSN!f~*=bYwTj{tT+fR0^UTH@h_L*0_n z$?3xEk`SLCe*K-gxaiSN{ry*7oQclx8mJQK#_=e%RBxk?C5Evnw_`pY{CMu+xjU~e ztQ(fyX&9E^70Q>jb_L9$`4tVUN?I__f#S1Gif)uu9v5V{3l zrrODY%z#u1SYh$Xbm&^=dP+fRU{J!m4jE6ACcwL%+?Wxb!$UZVQecDK)&o%!xGVSN zk$oCuJ_UsBq_Z3vJY!@N(7!6Uo#~!$j%5#$i;}4 zf$|(%F6bC0%Ea&-f?$P|=$m?K+Jny#k4-Rknn3cxrv{iZ;jk9Z7+@G2nuc~OP%pVC z5&#SI+OV^!WwxY$kv*W@2zK}f^-W%_-8F?g`TsZrYjo#Fg*RPMoc80Gz+NJ84xzst;-x*!*5Z(RK z@Zh@xk4LKh`g*VV&}}qH-+mD~wszsbbH^{Xnyaxe6RH#6uh_Hf?vs=pjrq*I7aPl8 zC*6+iZ#LBa$J1u)+ml)4@gds3^ipHmb62d2y!jy@>U5v@dF0sS4?7UVYaQUYP4SOQ zk5;L6&y2*hUj2{dI_oi;0^i;@hyK761JcxF*Y(WrhiXHn-9n)G8d;J*_PyqyiSs9| zbNiW9F+Go?qMs+kwA_}=hRi%0JZe7~JF~>^(;dl}g9OXbh(Y1UO*T>f;o-kt)|S8U zn;q%=y|~@6?1g%Gw`FgC`17!7)x)QI`X0Z_2=53TOL6egT&!C=ahF}7?f08FGd7_} zJuYjDeUmy-pZdaaRWzD!b;aUCYd%v;I z-&DQIFrSs9O2R9;b1dez&BUj|+s!&Ecd5(YW(FOg7Cw*$xH6E;lP4S6p8x5lda$f_ zOUK)z;Ux}LI0^uyK=Posl)!}GH*m{$XfXEET*>HoQSQ#RwXX*Ak9?S97nG0I@LwOS z7(KY|ZI8Y4bc}Q4==7y?&z?rdj!mr3S+Q@)4s+}M7ytM5${Sw<7J$V^I9`p8>3a9y z3a2tdDvzwXReW3fr{Qc<=WMg_e4GB+rk3eR?}`U~EM|Q#+W1GC?{H~K#`&gGJ%DO2q)Ii0-4T~qv{5ex)x41;GPe4x^IpAZ^TGSse zntjxfKmDfLx!-NbC>5Yzb{$rDqYOu%6S`L+olSk?xnB*1nP%zO&^vzdt zl80_t3U45Fh^W0t#!fdCd)#nwN12L|(U?7^s7Q_)2fC|MhR}5$R1Y3xRIUGjB|1@p zG6))Ib|HGifpz03$A*H{BVs9p(mLtT1$iLn8Ot3XO+IHEFF)lSfGU|)ceQU#T(GjF z>MQ?ieoop7NBh+))uwgZE5~zQI7D|&r_P8DJ`E8cQht3V^VE1;C-TNlK4BMLyR}Kw znx45SO-~PgMF;#Z~C&+!#3hgGFj&&2cQ@a)+ zf0_H)JV5>JCC1(iKn`js%khnIJQh%SBfHP=`B z1tA-0J=4N4g;I;a%fSIK&r{PB*_Zb}4R^}e)p&KU*TEe(Xrcf`t4NrRkwpwK3+}?r z94jVWmQn@r{9@q0*#^i!!bfP7&YY!sNSjxk+TDgyb8gYDZQnLc&QoQ6#?>W%XQgjJ zUBS~`-9y`sPo~bkwrMueyXRr#N`)pRJuQ&y^35;bZb~xZDvjK!dbqwQnnj--jk!5X z$9qn8$;zzfK)uBjHvVyoNL&~ntlX;RC=n^<*otUJWa{AReBk5{q$>G^M6K`C{AeJgXf z*TE!7#PjVafsXYrDvGy8f;jMLQkTcVNAAUlo74SuM}+nkLWx7>)*@;Q>6ZVGq;r9X zGXMAZGh>>FGE^F?n91m}k=r)9$PAU}W~=`$r5KH}Z6nDRavN(T8=0n-q}bgqcDF5b znUc#4Ni4EmjfhaA5|aC6IG@KkuXE1pzx{Vx%{4DI!_r$|UI%`r> zg|`_9rrHJkZEM}Aua9-u|9K0E;3c82Lz>e&9y^YAXCa|SGvpcG?^&$*;4%Edcl2Ui zcwAjXwb1O#8s5m6lMe?Dhu_!Mr!!x=iJ7yd?ly`jFx2D{S zUjo%DPDTulWZH}8Z%Fivc;OlT*4*^y?VXCoC4~rKx4yD|PGNJ0;q zG(}BaDKQg+F)eeV`+rY4hIzu11CgC|(GTKvM*~nqs48m;f)t2oY}ZE-@+krRvZl3G z^9iHn=Hj+hg*A5qwoq~Fz{QgK*l%@BK+)yY8_PHp7C$`^{h*ezQ4p^X7m1$-*qVXJMW$PkBJUNw9DC%_m7+`vwymOG;deRogw|` zi5%;B|1`a=@eSG9zftiyLO>uWRqvJAickCV#R%0#Bu*JP ztE7Y-#0Yh?3}ZSX4zVrOEJCP93i3mE=Vc#nw7dfON*sDn! zlcby^f5Kay7YO$#=6iHwvKtl={@~8$V_Exl(d&|u@dHJ#mW)5GjdWnn`uzlPJoxZ2 zZU?5<&;r|G_l{1UZEud#SPKRpY{NHFMZj>G%41KwiNkl0OB?dG(D|1 zZ)0cU2j3o&i72YYIy4nwNX{542+&`|2v0*Y1;$Q-Z(pH#hT<5%1=w1$q&%8fa@qzH zh}5zW3{ElpguDY97l;GNTL(B^X5c=?Ch?EQyLQf4@PSj}}Bx_GMp*Wf)D&L?wpk^)Z} ze!b3MWrWnX|58D7ues$>dBHiCExF1qbFy!)+qk#4=}BK_*4E}P-%ay}D$KvO&G z{U&j^8jWF>oUcRPOW3~4aEFK~$Rf~&b$4=;PC+HeLwkwOT8Q=lOGtNAfK25<^2dIu zo@+yN1b=nh??AD^3}f9TRs?4Xdy>C11B54W9>qo=64G1=7F#NT_zKo+P1!BbTbQ|s ziKocKo6Jn-1zH*zpr}%IH5uN%wanr1?cZi0VM;sqS-9WeA)!-7ZHI@ZI;gNWBJ%A( z<@ST-UT)eHij0<8vDV;v_>rI9??3xT^~kV#pI7=!Rk~nRa$p>#L16RS)9$Q-(UXez zw|E1WnjBvL_!kl+DD%$*pWhcXl~56G7;Bhd%tR+`LMrhyBh(xw%0-C6BrW(iY{a&} zTksKEVUDHsWXL%bxL^{YpuzwOn>{l0g9+8HyKI&Lsqn*Fg1;|p3+&g1C`3rY66v$C z#9x4=M7l|FzhiOiZ3u#?oC1V0!Z=}7snSEe1NQ|UVz!QrE5W3Qu_SMJyh(}WHy!mQ zNY?I9Nmrx2$4?@+)yA=oi72wZl~nSnGlqi11R6+io@q$Rgi@2XU;n}KjDAO6+Q6x+ z>Y0zY2G?GAZS31kfy?oi2bW&hY%=K`7JVP{{!z?_qNd&lr?T$fct_(x?cqw*!kAu& zO}JJ$%ksnf_wUi2T!|j7ivg)LFpeR^<{YJTNARbDEroomqL{FA_0gkuC*G9h+2@RZ zv^Hm!2j9u$a@D&NHF56-2KMQIU!zhrzMmhqg)0xtM!2zgu7TBeYxwr-#1HL_C3@TM zgL+^=lO0dov0evQXDr@11T5%_FaEyVapkKQ>h6UF?XLq_lHdTy3fn|H6q)r=@0%J)Eq;4$#LPMqhaE| zHYX&kfBjGMxthU&ft|hO<@4_a9#f7Xu~wDuX8 z?R)sZfm_`_N^ZWZA6?pbsO^ry%H_-dSEerCbH}G9pm+a|ZgSL!PBE!ld(ZJ}`ZS-xWFtjmh;IG;t0r#QvD&1 zCn@F)Od60jy^+RM$p0bH=&&t{t*{9)tssB>f*wX{WC|QKmZZs|r_`-=M_KP)nD1GD z9y&o!k&on89e~!6P)@->cQn17MbK1Y*vl{t#R~Q`ACp#$%%~Xp0#?)u&2w3Z9jV!& zKo&%9tNi&ejsri62byzpxcWn{0O~r zwL!Mo*xu%WGPAKK2ZKBBGz9$ZxH)~@w6wprN`u#4oVTiHxH+oNToE$i-R#teN_yN8SGmwab4jenR7 zAF^|!Qj=)NE(C7m`>!k;;OmqUfZMtwi9@DbKA&h1kY1{gn^qEhFThk|qli^Gha#|a zXGsCnuuI%ZrJGbA``pY64=p;_>+{R_s}8woWE5p%E9L3YX*NWuEI!#j5W-`rEvBh( zUa;LA=VaUtq-h&Vr%e7HV8u}ob*KjwdJNqLNa7H5jj(~@-?r+~+5W@3J3ij=X?yqh z!pb{7*AF6?`w{Qm;wRnDU+vBK_RZSZnX$I60tuFdAfi%Y!BJ*HK5s|n0=UZqV<`=f zX_V`G*Sc+$fE$ADm7y=)zsiEl@gVs?n0L6}4BWl}{+yjvCy4U>=db?NeJnT7yyY9^ z^3A)i%VxPjjt1W#ViO7cmOhIR=7gdI8&u3?XeuLp3{kP4MTM0csI}?YtgW-YO8C8F z3+ zEN{bRl-sdjtD!{(9J25kJI$`| zD!9?TQaLd2k{WP86m*cVn#lk{@s|7iQdwY9>>}|LHbNG}5_gklo-lgOO#J577H+zm z{Q9?UxQFF9T~KgdzwFV+2M@A%p4M$T?WE?D}h(-YenkqtFpD4|BFv@_$ZH?LZ z=LF(ofXwdJwPm;ZHUD%6q%Q`OeM8y6OQZj;?hgsk6&0M#4L){&{2yI{Mn$I1!pXo( z2}5oX%!3OBs$K$K9?tkWIle_QBp|~iBYi&^e6cb%QT6JTa>pN{z=Qq=(w(Bm&P^Xu z4P0$e4aiH@q{j9;;J7;)h&NmtTOr57!&UOSX7q)*B zE)=pWs*5}9?Opg83)VgV%4#09Qauf}1PI50eLiiIO8L_LT}^?>Cof z$kB;mnSQ<)xBsj#yC)s#vE6GBAI;)ZyC#7&KA-+q>!@x#@ zMLg_fxOyuIGz%{0$n^gGt(1`%=t3t1mMXc0G(+dM`copv*Q_q)^PL?q%BC0WN@yX z?Zc6mFlqcn-@5r3b0}Z`atW#IX&vf+&0d=fPe*Ptlvg40i7tfR67nDRai?*OoZm970itG1#w|Z$-)tZ6_XPO zWoV#oweCI!?7U}4Sz%^|G(QV0Lk=!CBM@gNbzE!{s7?Vf6bE`!XoY=y z2UR;khp9!#ufUdv(YhlEARQWfS!6~%TCL2@&~?BALVjHS1%DR4UeY{d&ug#W*KYe= zd};aqw`Y?ZH}c9-5xDp4jv5q3P3$jk0F}`eCJ=&wN+!N78W5 zmEI%5kTz9f1@~9&wb*d_|Es-AAbjF9uv>lWRH_|81swuQ9&Z*6xhr0fRaTYL;~tPm zWn!aDN<%uxI>;&D*Mi%HV=Uyb<3NJPlV4AYieSIvQya8JNi)4wH&3^AXB`^46mu`K zy2d2HXz%Kucw4riMt`KXy7jIKG5Q?vJbuVFM}yNEG{1DuurI`04H0p-vO_PVFxnFdsM-aU&cq ztiX-&tCP_ zXZ24>iDbobTyI`6Dw8TT=l``k3~8IFv=W=&hRN6%pJ`O;c!i-QAkt;Rn1Cd;Rb-bHy8br|1abK3u3hV=62lu>gc@ z8Up2qbUg$jZo)88O!QhBd4gJN2%%lurgdW_W)mN5l5z%D<_sV49h`2au{Ddjtx%|5 z{rF6^^WeeiSj9+&V)%;h(66;aeIEH?J*9xNJ>t%rXNvN&g(Tb|jwGFo1qY1>okwT0 z=3?_iuVSbpEh0ZHJlQkmg>Jj`cty(i+oqP1g5r)TpY zc%RIj{8#JoG`DyY_>et=dgVb!KRhi-(Y#5C`4SL0Hhc@hnzU#QQs(l4M!7*2eS3X- zzRMZdkTWE+9yV<5vuZwyjftXrv^blCj>;XjEC_%ECW2p|J<>FKMm2dymZjgnQ_z@Q zHnThO-@LYk7c4B zp$aWAO2)dxYnGD9VR)5`VVwgY%iS^)195T^oQhV@9G~Xp6S(?i@Ze%mqT?j=3ym1abyPUA|1z>5ix9PN%#gUQM8 zS7Mss@|ij;dlH&K;at%9g<(i`MM{}XIl#4qKX%sT#J4~Q@51^H&H=PTT1b_^1sl(x zii@Wa^;@(g{$d=M(5=BOACFEsaS0+jlArBjCrqKTB@zoZ%zh%$LkDvzwBWFz2_P9m zP2aT;x()=@p%En~UH);^S~_f-a)>o{ z@n_WfgBd=Vrqt+hV$P&qe`+sASWM(=Aj5zPpDnm!y;$f&M8V9pxRE;rln^>uhLh2* z(6Jkvi~hgs!)HvV;NYftK?PBL5;YQ5KUZcgzC7PJKG$VFN1XwAeNzy&xU2WKKksQC zyWX5d-;%XFv+c6BCI76ndCbZuwCI($nf$=P{I0r~cMd5tJhMHz3O`jTRDWdUq%C>z z#UW-`Kjql-HS1PH{n+s~@nKI*@~a~X3`NtdTm*3ve7x|Joz`nb`a*Cz&<%7pcJM@l z9N9(^XJ&7tHt8B9TdUS|m>@8Xg)(l}J|WI$nD^4FXS+Zk6sJT%HygNk;6bGf4hc*hCKMD2psgXJZTowPE z__ZQX(UZ3Qz!_T2@0_?R!dyLdJdq-o55em?)A-)XsG{NCV=oMFR<@~`&0 zgK$qU8z2Vbq@$n!)T2bq(YgsllQG!j93l}(hv09(d^~u|3LLiSDsueokHkapqt6A{ ztF%poTA5b|xH*T%o+pkEPKY3Liyrm6+ZWS&@AV_c_utTlAXj;R$M;BZcVL?7mx_x! z5_kHaDX;kcKp?X>*kec9!?6~JwQsg@_%{tUSru%#gIPh3i6XS+RYIVXdQ)VRXXDHO zE>9EXar{C})s@h}s|RvAZSPbd0%khUV?w?_j}BZ2!PM>fgMrnpjt)kQ+eD*P!|g)|{GGJD0NJ+ppG&+0FtS zQCyXLI=r1QL4e3~`d;hfg6`qGtg+;~VYlj{RdGQy6My5BwxMY`pKoSlJSy%khV z-jdioae_Ed)^K?Vv^Q*nILFf7D-ge<>5MeKok0UbMw%>SEd!#=H$^`q;HIteNg{ZkL80y&BHa#QI{NIqV5jdd&Dc=yCJ&YGin%ywBFi@PeDziQO&*9 z7?5G!j5 zc}B*kX>oL5{hbZkjTUqK(__Wxvxcm`hPx9zOD={d293QiyEmSCU}7NHBdljVZv+p* z$sM~CM?Q83#XP+j5s=o_mlxFMRo=iR%aMiPMt53Ri=KE>U$+O#czD~84yUI{T(BvEjUidU)Kj7KnFw#={t`l?o z(Dl^MsBDd%hLIg`W~k6BA@5r{lL^Q7Oco6RC>RR;c_QGJa|J1xA_JqfpdEyN7#?Xc z2J>{ObQX?A-2b@X=$05ZfMj4!s-dO+@G?PvOwd>yLaPGX8f{C&f416HvOuerKiumo zu)%Nw$s4RB;DF=?HyL6Sw7r(D@Ss-XaskW@b6yL86Q&8>#ef(?l#lBgv=WXF$EAWU z#r>@($5a#%q1g1O>+wB>Z$bYKU;G&|V+@{A6HcdURMs0jpq|@X_Yr{ozyNC=5i>#LwF1j4J=nj;^A?R&?`_ zzlHTJ3wYevFSF*|zpyHly+QvsH~Sj{jvtKgHfbsnc%tyIpW3YI6k{8sRr+Jf6h(bT zQOV1f!G-j+NdtSTibe#H?Hzs{qD`F-jmVJ2g)y7apo@A znx~cf;v3zXIp6)g-&kaF#Y%R2q4%~~T8ss3Lc8i}hwAmkrm;J{ZB2V;xUCgi0Z)Rd zi=2WmFaROJS201i6-#rWb0D_lQ=!sxVCPzpiztL8fX_=pw=x3q!i^H=tc3`lp^r*t z-^YJ^?te4ZYG(HO*x;uw7PPuU^{3U3H$0l>*z@?pi+dfJzpmaD@>*S` z7#esMRMeLd!;O9uC%>9^q_?Ina`-y(?BAqK3<>g7j$SLyOnoi&i2PX6p=kOm`AEU? ze|$81<QQRopVFQ0qF~ z=+@;@_ZOd2Jl|MUb|x#bp~ivNdTLd7_!)=ri@aeCFaJ>RptF8N#m3@lA+L94)@SIj zw*(Cv1r61pCabsGATB9nL4{HU$#gt&`%c#E%{RTZ?2XzaXskh@8O<8|;2VAIZgj8p z#2+~k?V-o6J#rc_c>LkzLdX7+lzZ<=iwYJ7+|j;U2r~$#_>G4(cdQ2tQ^w<(HANc> zMz6e_%Ii}nto~GDtvPHR)m#4>s(Z7T=jLYP00k~0V~r-CNCbS6n<5ECN=jNL_dk=! z=UdKXusmujGR=52J>X_k*zL$_p{Zs=PTw!sY#?y2+Im3q=}^!FBg64hK( ziArHGrdfXijM!Juhn;MWs*TcoQjzx;qNCTioxt#UzAhX|(1-?&?+f|@B;fcpMPEnG zz~4FB3Pzw#d%ua-gL~u4nXF@-)4>t-82=L3tge}8F*Ef&@ZtV>tGbTG#!?r1$VPF zqs>v!4J7l1uJNM&?a5yK>3998&N&hFqh0yAMXHq{kt4m?V-L1>uNr;RQ9Jkcz}t|) zF4K99xyw(>K`~oFK3U|VjqezPAZtWKut8l0M~P11x`?MRdpA*a3APUdkwDO6S?U0V z#1{u%W-zq`Xb5x=broq0#qM;k(o_tKb;0wZ>ahq6i@|J4=Gde83P<|mU0Riw#@3@;QS8i8(8f!!a_ zYH&R@B0%q!F>S4YgK(?`4UHa5m|ook$f4%s)*xJ4jAT3+Aq_+-StTo%Qsn~6GQkG6 zpaLGAa6g(h*&9m#XL}+53)eKDIiS+rhgw8n8EZ=*O>iSq7k~{4&~L`NHn^ebNzT|v zDj_r%+p=g-3mAb4jp#Ea`hGBx0j+Yy7=#Ss!wM5>KLBDl6!?R153Unv3CwZK3dki9 z9iUveVw06nC?hnN5Rpw7R#Z9!1+3#id#ng4P#0&kZv;Qn07n&2+c>H++Sh}rVMgXN zHr9G+D}i31m9qGRQR^^9UgY8%$&1RuL$b+_&Kj0q9LIB@na76%p`p2wN@0Nn=st}@ zJ9lEy1y$3~X|vJvkhG&YtB;H%LL+8U++*_Xv}qjgXStER4y5bywWpKg+*i4pKOslb zj~?}C`c&gH@vCo_g<0?W446H}KRd*X>IW6SE6-m2!98c}U+b6${R^!x6y3|u8}7?) z`u^aF>(|%qlUE~u-IYvIU@Bo|qe##(Axi|VJY!TPSSg81j=tiyQfN?l<(|Hml?PE` zsjH*329?Mp0S0RgtcA&0YuR2qeXvx;*kED>><`>2#+DFO~M0^QHG&#&YH=4y|>O^=H20Sgs6jT)RTwP0X40at^o z?DN2>=%Em9(~$6#YwaJcG>#=ls`LVq58H2*Aa1(Mu=3k&r26|8ZolLvpSj8?4O=N{P4Zz zzl=Fkr#{<09=&|ISL2c2cgO7VD8AmeI-%{$X@{e89_M6*)xBNjF)~$svW7QtZR7cm z&5pnS>STKCdQg6JTS?tP&490|rlPZ8eS7Gc9cHhZOC&m&-#GzhD__nH8 z)z#EwpE>e8XXuM!l@}&kyUuQ?t5dI4iIbD30F1e%fpn3l)f;lHp*?T$)x4hB+;*|) z@Jmk-ZPCx~4r~0(dU^(TJC2p-Xk^)|J1ZdKg-cd#S)U>pvCCNKUI%BJaqfmr<1%f54e?_I-l_d&p%t}VaoHH`}yobUgz7& znL#~QbD~>HA7+guW);6XexN(QQx1dJ_O4YCk1KWI0T7vI>cby{R}L0A?1;U=S~nOx z6L!#$40Hm|o+;70+jzLw+_dNO`qf`r+87pi!BvPjjHTtHxO1)T_1wnl8SkjJ9>=ic@%O#$L0roKM> z%v#e}>l@OU9^QHCqH4uT{CS=4uHC!KbRIAGlR-+@XR-~tlefAj(W9`ZyrcVG+o|TE zUwttw96otBrakn+)v-LY;U0}{#I4R6zqwsu<*y+lJ6ZH0qo}eyrm5X3<$JRc1GAF7 z@+k=Tz)(<&UQ!a)x8ZJK^%CBfhXba?gM+nUPq%mFcZ~HH=-1!-a5}?**Ev6EVrLGb zEBe!NhT#aWiWw?Mfk{(;Rd^9=)(P}3gbnhp`EJ-MyI{m;&Sz1$a0BV#xWFU|{e;qm zz}X9O&}PSlaeAdl#v%N*#DG*&aYX8AQ{)E7yD{X7lVA}t2K%2xOgm=44=X14R4lP= zPgH@@3Y?G)%tpyb<)V_=YdvE-VEH}c4BHQsBTPPs3F!o*wO-WgNREDB*Coe&xVlh8 zK=R2a4|zAlt*Un*pA>-*Bu0Zv^+(V$2O3?3&5}12;UYuA(q5cIT>;3)+doEy~EO<9FCf!_cL;tObVbdAV>och%cW` zApH_lJX{u)%-m$eg5%aUc}-)26_EQm z%{_kcVolJ*4YTk5O5a~_w!S{XdaTr1^AfCpzI}@7D#i0=%`k85L$hOW)5ENZP9CD+ zqPhZj1Gf~%ZpVa;M$Ng)z29$RI`?{aQTwOqbr(OZy#DB~=X=ck&HZSCxTHL2+6fZs zhHr z3R~?%OgTw57_L2yh=4UXHry01DMgUc{>ag~K9&4HAd1@rz?T?;Zp5dP?=z-s*5`2g z*UpEU4Yq*bbW$k~Hn%I&(s^WS$|Bwn-p|pq559M}zw|X{1^=+uv`bPH57^9uF70}B zrN4CDd2!ipvx0)*rzthvBcCpIPHB6;IPo_l?BFm7Cue$8DouQmWj@PlCQk0Oy;r6F z=A3xG%xg4HvNsBrkeLP zH-k!{u|Pd?y)NR{iz|~uFYH#lz2xxU&`^Wt zLbD@tLmmVN{#yUQ>}K>xXPQs{I}gXgchl=$JPO>BcIwr+XV(;;dK7};%LT{RJN@v0 zONteMr@;}q6(SV_=*%maA{tYCoASR0?(RkE1BI=SR_|GnRFF1fV8*EpXHVF@@{6mn zH$E9)$0fKR-Lyu#&|#S-)GMsG>hAuoprTtVrZT*!YwJRN$KUxDW?oHje47e#g$FrE z>M#kqKklcW|1P8W-ICO6AFlX*$;;8)&p9@FJ=C$)K)=lnHUW1kjNo{SYzb`&vx;yv ztgQ`*99h_i(VZr8fEzSu^vGkb_q^$kj>>&HmihEQZED(mxB1M|2M9MSIH(vs-?2sU z&bzSZb?EEf-1UyPyN@NpYgC)E&4J7H>G{>CO$JxvAZ6t$D-fVTzT>vqfGvQMOM2)q0124M!s;d3y+N5#^w1=} z^__3a-b-hTuLWtiL0dP3-vQJlcy7Usws34rC_;QiX{l`zE_RBuNZqWhHp=1 zLO2`AURng=91$;24rz}rp@k+0LNaxDJpjhYsT9b=;YKn6Pl5&-t}UikNIJn~CnVrc zwPoq-GQfwwYo85EgvLAUpgLSziZv5DjaVAsA50x3RT$@Qo;yY5h3O8oQ<(hFIRv}X zaVm~E=8yZb)gkG~i?_9@5t|OM;c09*MWki(A1Ho7a&FFIQT(dz*_UiYkCa28chcQ7=q#u&wvGT$nOp1>U2oPYc zz%Nqc`@;>VLt&8w*UhcbBXERiIaeE(|2$ZVfK#!Bl%#ckQ2E-G#> zYyRu;?L}0+k+yEEt=v|iC%_Y9>9*r%#k z)t<;%A3~j3iOStURq#`=Q*(5FTGU^uiPNEPn%%mC1`M-%#pNrs@6 zxo22nhK0M^yAlU$PSMLH7msy%q7@_hS2wFSxqRM~^W`S=`fHkw?C+Nc-JV`<6 zh9eYaM+Wu<4UOE|ad+j9(?oH3C3XUva{(b&18umnWJw;!5<8F0jX6uMG+6GR%Ay&$ z?7j{JhPg<%@femGQv`?zbsTFkyuLZ=gDKQlugKC0-4b35)DaBS!Pb~!6`URU&D+#J zi89jp_%VNB$~<29r+a~Ke%H@`IPd@ju>=f~;ADQ}ae)xc>60cjeR-46M0LAAeAUFF z-nBI!gMO4ODBD69fVv{t$pGk0uxBw!ahwB4qZYzx$*}^3QtB!uBzE4sjw$JXeJely zzYUd}_z<%o7q91MjDC3Tm?`^vS#nKB&#kBA^lixbVf%&)D?&CbvcI@vLrwLLPT#>J zz6}DCh^AWcv+NRXbeXwnEFpPMxiBo9%A-}>o}3ER0^&{GSh}U)?>*B_Z`rhx(q=eM z;7!(xL~r+A2q)kCv2*iR?}L2@HaR5wAvSylso$7fieTbz>IMiC*&Lwl^#_;= zLI`N?b=e4mYu^KBtvh7t{tUx%=A8X=kJPP>aPwcYXhZXnqhE27+D%Lry!lw}jh zb_H=t8S2lwDAstv-9PkymD9HkOI;@C+p8sH8XgzSH|*VVry#2ZMB4Bf@^A!KiwM90 zGQjE9p`m*Nqr%pcX0>b4FSR@S^J-GStgG!_pqATvgHg#H<*YNcq$MG#$MHrZO zIMhD>WiKaTJMt=QR9w0@U6>SavRsnu^2;B2`v+V5x`KR*-)ptsaygL7*{TIBl|WZ2 znko>^QH`o|J}E}m7qq?p^6Nz8z~<(eC*x0KP1I+N0#?(oacW2Q>i)$Z@HpNm7(Wht zjUueyGjjOM!W6T)|D5U+t!~jt8BK;UT0eXubYh@;tk@yul0)%uNnP`iM^PADv~32$ z=}_2Egko^vLXUYdS3JXZXaTF>`v2`5ndV3G?&ldOhH*!<#|$`BJ$N^)+nzOcHhbbl zT4c={v%cT%Mkm~*UVzFg%qS!tdEjf^3|%Qk%KmJmnLSxn_1)2Bxd&E6i&hcJt5*W~ z*DU}sykvR$KhfS-Mg~V;&2TrAAp=UFl?sQ6+c)5v8b~Cq$v(aQbGDeU@wR9qt+>64 z6@u_X=urr5##XAk40(M(nFO}!edq9f)g^1q1&_$aGeNK(Mt!=nu^LWgF zdyCtr#(ZhKqI={eyp_G1@NI{r+aqAs+z&%-0`X%u+Cou-YpEd+9?8>hUbLDm+jD+F zgMpt1|155-|Ih8i(a9F-mD*wKh!d!OOM{jDOvGrDBMa0-G7+afm80X|umuw6Sz9*{ z%vfk;G1rDagADy4Lo5I|p~pgWMS7^PUjQf^peGsmLRE4x2Z_y%-8PNR)`3$N`!_c3 z%AqtbBdopf0;2Sj8?cs!9N3J1^}Rda!fs6dGK5Qv4`ni&qw^_Y=ZSUN6tJYo-`Y{? zQYyZPjt@1Qz??)g)Pv@NxB&{ppx@;jKVQ z0X}pY1`4(^sH%0z={Fi(7~$~hKSEW5&NIHIm*IkCwKb5DDyUQu0*bV79e!(l5{CIM zI(mj)V5v|HfeH;bGHF0&7X|6Qwfpd4!uJJ76prsgn{sdjKuF6CKZsq^_&WSQETH!( zkqQcn)1W=5|CsEGkkSk5;#66g?!w&5Qjr!i2WOL3yD776)cJ^_LD0$r6!}^h${2~U zW=4GvL3T(yB`#2@BFe#gqbEt6St4B&Eg0X|IEoF*#UhOMmf8#OIzu@X$FYRB>Esfm zr=3KykBtC_J=nCgawG%^x)y@a>U^%s@`jDT5{e30Ao>H$qVRi}x4$6JL;iCBx2>>B^tEZelGKF9pUzvF_VB-aru)%P7UhvP(H#duuDN;g+4uDD$ z?EqUP5HxLrcsU%U6ho>d!%aIj-$hK(LXad*)y4LnZ5TR4zrXVOD(D`I!c(<&Id46rDL+H0x88WPe zg-epzr%Nj2lvP%C)L&2RJ6bzhR{3EGFTc2f9reknxi+;qR zeH(6`WV|N;aBukeHR5~;}Ff?tf&nm_I-%dy+Fjh{X^Ecd0z9`HZT-H1=&3agM z=Ft|%;YXQAKMm#0eB?2&%QWgqT1-Q{Zrc5?mY3i%g;^)Ag#U_*y}En~a+yyo0W%6G z{6>}d^0r?BZ!Fqn0IGyJ1u7M=ZwNA<3?(hPTBuhfZ%>>cjiXD?fMTd?Ocq(c5mXMy z8BsV?&liFkziEU=h&BESby%M$<`wx^D0c0<0)} z83S|yCEhP6Jt1+4m2iYR)PP<9qKHE#UP=?={F}G_dSDM#0oM+AQ05t1^2ZZ98)54gh!U|Jn%Ob8(n8dg5TWQ} z$18Eh8OdmkmpKF6oL}v@5K)LQ5zuYK@%YVI5@$5v9s(4gD2+iZGqLf+MiQ0|xW;=f zBw?3{<2Z=|SqqW`{4FtFEy0NnpPi1e-rw?g{7Exw)X1`Or=x}4r-!v1!w_WPBnmo> z8`3;@2d1-x@HF6%qO!-A(de<$Q7J8zhZ~{1G31u+S^%wQwW6AfeWojM6LNn%kC|!V z3)~B_GbI>wzAIL}E@**CS-(SUUJdT&9zGoji{M7sfaQxPzdqF;Q4DY~;U>dZPU;I& z0&&{?zl)2E3L4vpic8c$wj>rHFp+-?GB8nX$-;1dT!4faA2voi_$U!#E0K^oUk*FA zgl@AO+(t`0-`Wf>d|S*50`RUOebJ&*WPBE*H5TtZMX$ok2*C*IdcIp%y<#Q$)} z6(UCPd?uk|EZTT~xV&THv;M@f(V@JDk;fAkQT|5sIpCz2k;?C70S}6CDG5^FA}4zk z3ivN%(@+Ab5$=4%{o;BA{TdIOLjzfZ!d9ka@$vA9iJn4Gsqm`S*dseN^32dt(Wh(p==BOQ#VL@dvYMsx)HGn14;l(%IwN8K7*|*N@n~3bXe`|;2J+%+zzX@oZ+ZcoDFBn1-gWD#lPiEeoMKpRw@4CwX9a_7pLB~)oz1NXPP-485Ff_ z&YRi3LezYJG}M3eX*=@q<<+gUN2knut@It_^5(vGzEB~&^)LgiI^ud=Oif+PMNf^) zdi3hu@G6H>C%y(gN%O9Dtj~JhjaOC0eZpu>TFmJ2j)P%2p)m<5!+&~^ZU4`_u}eIx z;Kq7;+mD)!e4A|r7#b=Y%q7Y2V@?BZVblIU*N@luPH28yR`~A{#lOQLgS$gIm+2S3 zOC?qAh2!@#fJpKn9Z;AnU{fl=i=m_wPl1E85zj&tg_qjSo53vw6H+R@-lZp&DNcnghNjBO#HSJS%YGgzxwrUfE&^qjX!@ zo`{0yzl1NPlR0eI){-X;1PBl`(8!GxmI8F7lH1Y3^ox+qLd%;btB#^>=Q^`fd2TBa2cWm9z zQctei_GWHoBC7;WVwZY4F6B&jc=a*Lrc+vnZyI<(_y-pgjObY8h~Zy?t37ia&U*ZT z`KVH)P(MJ%Ut^CP9VAS^kAqhn3zgaQ>JU`yQw{aWkeNx4zPcWm{YDSRGx^mh90)YC z*okBCX?=oBS;e0WH5}$?_}TU%O)D)O>d4HKG;K)R@+c(6kc>!7mi)e6wy7=LCAmY!+v`UWdMwzAie4HH!ms^neke-`otCHvC zAubKMSn!i4Nws%iV`zzH69o=a$+Q7go=b0_BcRIf1}Viy*cEt)QjU-;s4|uqV)p~D zx}4#ujlH565>SwtF(rnoQibn#9VA_NBy82gH_2d7Bt>HK*^6-m0#GJ`(P`sqB+o=L zGDFRiQp|16wXe~J!r5RE-$hK4)e*}T$JfqvLyU3o>vMv6B7|Vb0PP{!$+QwGE6n>;5~>(O{gNvTujSw*`OW(K4@^JSjlyT z9G=Ms0!oFPN^q}iV7Jc-By_ZxG|1|c1BpZPW2fL;a}1F_u@5uX|PbLy|(zH*CYxIxDX06h{c!HMRG+W>ZNJ5ZRob@h>L2F#KV2XbP{ z%+129;>`MfvDTbB({M8T^|7vHKJWJ4-&Q=fk(b@E?|6b!>yz%0EkX7cB$K-zWb3)6 zmS&ng)+=tLm}<_gU;SyT{;Hi_S<8dfkZb*EA5UZbe{HWLw5-JBK$Osz8Z^G(*|80e z4iuIzaRLf;0y`gWz~i|Q|E)0{GqmnuZi0^&^ObhIWKf?1w@)KfyIRUz+yqLzCa3X? zgCREy!3xmY5-zBy69eqU&V?*FYI~RjD+LT#wMmMII=yG7FgnKz;5O@hG zcpAu;%#>gFEqYN9m*C2EIWd|zCq0Z!LrKw^KUojBl39REB97EeL#(`RKB}1fYNDKu zxmhiu(I&zDbo>~4Sm(ncVJ$|d7;dEHA|S}4iNG`l`XaJ_uEmWRABJCW#yVSzD=?;M zqY9f;0XYj0b|J<;2M?uPT0O#$SV=Zi$g2r0uvWB@R!^{ce%7w;T}UM1;wE~!&7rK# zA{Q($=%IN9{M3jlF(5yESYQN7BQ!&q4;yQtxkgckL_`8;WCF81K*7;p0}-u--6<9H znb}f&L@>>%(-G4~7}AY}OEJ^K9>#9L{P{>VMBymYUi;tE^esZ65I?)NyZDf{JA1yA z%x*+U|7p|SJ$i=Nle14E6hR_gdxBwr?Ep8J*F(L6!zvdk4tjW*pr&q3hX5L(OfE7B z;z)xPd&H>+_rsRzP3o9;l+xM$m_!ceVnXjFMy6N3OKZBs(zL>n957ENs!xWIS>W5k z>kOAU`c4!cFr|(mj1?j(>?dmRT$9@!U~iCrGRZJhWae)ITOg?fu2p>w4N())B$`Y4 zO{MsvAjuYBJUjSg(%e-99by=o0Pp~Ti3GBYdZ^{ZL_JY)4%D1<^8ZGS8M2xX2Il8v z-lEb~ML6sZ{a3n$UAfCIdpcB$N|uggqOyDoZa!=tPnPV*O)K5YLCIuV!Nu$ij|N>w zNx*ncI(8}AJ#!`a(+iN8%ZYX7ij{U4SSrV=XmTs?eI=*K(G{QAuPfq+8c6vb^9*nt zwGYbWxE48namdO>^eOVIkS-3yp-G%g?LIv1T9Cki`0X~U{;CDnYF_JR-_=cTUySfZ z3O=+)hYqKuw7*<+N8ww(^|5IGnw|Tfx_!KVR6X?hrZte}f1h-S__f}uZu!|SlFN&< zVc%ku6xC%urOADU>|d!%*_aUTAr*&P>~x5j|i#GBYH&8!0jl9 zSdvMG+1bKWU5|kQEK`K4(1waJiWWf!l?7iqlr)%g_$l9P64JEA1YdkwL?+E(sp+;& z!eN6!sKlw2zeyH|6$pS^T?>~&9Rn;X2Bc6_vNIDb_@qvx8ezZYWJ;VCM*MC9cLi!7zz7LVkTo1`iYFA^A=yk~;V7afO)+#OxGcn(BW9R9YoV94g6nVuuL%Ie-pAJcdAGRANF9+eu3xnsa~w*ihLtqes(Y zGPqQ>7K~YBvkA2kOc>B`ipmsgOX-9k8E2mDCINdW7V!z39aI|`1qX7V z4^s=V>6n?^0MBkJJNa zVF_~na;LZM02qqQd_=MV6UPd)bu-i}(%TFuj88^5~# zcFKk+>{vIEO*wlGo4s`%P4+Fz8UDA6=|{OwnMnpNsRo7>_(M`T9CG0YBqlR1kPsGF z?APHaS&8DENl*9vI6EyZS~TGoRHQopY#T`~iL()40oquLH3XuQOi&|2d6xzNCG>V+ zhfgIHHk0F2vW*l6V$(wsAtu8D$^6+$q-?`5gAC0Z0DYsFw9!VXjfaz!X>Dvn1$lzV zjTg1eQhEIbCI$;jAfkbO=;!1q=;oCy@=Ea6k|Ts_GT}z<%!CXKGH7Q=f@%c~N6!b$ zgx!+H5-|kz{8y}akZLiZ;l0IiuZBjv`55W{J?5g!Br5i_v~dfR7n zYWH;mKT91>l9Jn+U&#dzfKg5uvGji4eI)H<8%=GIo?KW@!Yn|*F;+@=x^03g*pdZ6W`VzHchtjl#$lzn+@5CqD z=waX{q1@e<=oy|k@}qVB>SesP8v_m=^MZ;N)^@48oV};t_U8sfYllQbh&%mO2)1IK~fyGtbRQ4!mK5;X7fj zW22r1jUNlICEPd|b7DpUQXX_<@^IGVR5z1{mA){9CnP5#@^B|Tj6^8{V_gj8x5x+y zg8hW3ULZ<*&vQgIfDB9OuWg#ETqrqnNGCNr$DtAh^Z15eli#X=2+TyWV_(3? zS0PiT=`L0ZOjZQ0I+L2YE&Xz!utDr^&SosatlLF$g5_cW;yV@XnJ~_(VM_xuDM`;r zhZVQR@M|6IN~3A!2F?Z)1Ia8EGZzN5^v860QptkOZ}uBLy=<#e;pjk^mLZjdszbbk zwM!zyP_{<))a9mhw|##{%<|R4FXMtn%K~*wVo%$Mo#jexXwfmop}=%Z+R^b5h-?HX zo-i%I#2cGTvYMDg&Ua(7C3zGRwicRT`{{HoDj%Wt3gfI9_nu%KKVNC-8Dt4FlR-PCTZ1U&6BLvT}OO7-kC-| zyTde*yjko~ph31rt_Rh_|{m5^5u;>x_K<$}(JZm_<8RlzUMwUX%V9G?7xzn3@(If5AZLd0l!mfKpRR)W8dxn8> zNWG^SKzc-P18!MeKx*t5X<)R~9ej1^DSjUgI@if;S6%Gk+@S<8@dUv0*;szCt zbC4{GVXiZ8{F&mIrr)9P@qxnIoRX;aP|vCtH4eKMF18O`{{!&ur`zfgRWlsM4 zQO$!FhnH0p5A+4&PM>F0$J6L4Uc9i&8q68JpA&g6w9g@?w=BWwQ|kKFV@5Wqd6yv? zKZA&?fWjvoihr}lKQtFNE-5a1`A5fS{gcD#HQpH}a?0<>LmV{c^>`zc>q}lrxGK)< za3GgE=j4M2mu{p&O0SREF6_x-Ol}$FUIHmWVd0=7Di>H~Y|@?iy!1iPVtvJxLp*P; zd^)#W9Jo+6Yu$#PO(@SObU%g|Y$Gln;@rJjR2w>qSVpSFBt?6aWx?Z`k-Rg+%jH+7*{L;kP43|c`OB~ zN&%;OHW$4Y0eO^vb;vDjmpJ?iaJE!KEiagj3g3*@#A3AQa(>!AP0J20&7~ z3!6>Wxc3b>PQkf8ym*p36bk`)Kg6sFFOz9e`s z37Md7b|(T1?J!0{+IRq1n}sZ_t06fqgh?ENv)Ttt7*KQZ5dzEzbqIOnoFN+@@>Hz{ zb%Ab)>qBxs{FMpGxHKxPl+6_8R0=sQ2UFl%NOK_M}o&`^-vz2;yw;9bEB77hZ9yJJ-+Cw;6xfHzR~kUbo0;8k`ghy7Ui z%6RcP8TyvPwa&iO&zZ_WgcCn9$qgdBh)=r%xC%dP4&hfV74W4AEqPP3NnO%LV~MO= z9PC#Tn&ZZT>e7<4nJn3*(!rbaZmgNtgIzbjdn}O1|5b44X`g$|FP^xcclQj#&M2wT zU3fNhGCM#=I$bE8>JuK00Q9-hI;2l}qfqvPwsxey^7oF*|J>l$F(GTCTOB+6aKfgl zip^RuGnRh9F|!dlFo~6a?eDxcQT2>ZpD?E%eKNOJ*o&A&h=A4fh`x}C`gI{W?ny%& zK7DiZiIZU?eK6NlO_~QzJ?YBcb<-tr+!=ni>f!eb0*{K9x@nlMf?AA&{fzQKAO**4+)sH zaE%b93E*4xhXrT?>)j2WpI%n%T=~68*=TWc zmbQIcsB z^m8zyZNN|g*+k3plLF+>Xkso^*}AqIf7aB?1Y^KsO3 z?1VEO#AH{#aV^PT!UV-p57HCAqu7P-D-X~%Km-l~FO^bo5v-(Pw~jJ2Dk%Vm2q_^- z#npl(ILXpaHNaVq35zZIf0AK z2ncQ>NyQidr#^-$1S>NvvqAOQs$7dDmz;SjB4a67Gb?2I8PS?u0f40lBc2HQqWfMTJPga z)Rr4*RQ;+Ks}^rd-5o{otzFX{TT7%fAiYx1#?mCp)T>rYMGFb#kV#<;?`H&1mXpa@%K_dp5o-xW)+Hi*8); zj~Rxr21Gw&WieAAywIG%>dyG8`FzsEyk$G{SyyDkhi4CtTI~6?u-RPa?J3@+%|SN; z0@F2inyUR&I(zc`&aA+_vEwP7clO^;dUmwTJmBlM;WOi_fB$Veq+(ece_a3m+@_R7 z3a$RnH)r1n*Kx}0aMTvp5iZ1vPy0ZvP}XyzO<}1?i(QHLGpTc7kS??gR~!cj{U)MZ zhu=0i*EBYC^o0ZmE=`L3U5MHp`@6EgTQoD4{j)-|ofkCm4!^oiN9R&r@H%RA9q+o( z!ZYa84gdB}6I)k|zgk?Mk3^O@q!e`ZAlO>j>3&`w6!jBb7uqtyUk&E+GM>%1KV4DH z@zF6Gt3M&%#EGiDZtOAihsQwcz43f&Deuk6Cu23veh=yA=Xo;+nws_o0<$dF8`hP> zn#^ahk)eFskk8wjTQl4^mDBd-BoT||^+_pPxScIAL^T}KBdS<>H^t?ajE^s)#fELe zQP+Gg%@Eqcv6~CGx$~-*9wzv36LQ9rhE4`>Pt?x8eVcy3l{sAyE_N`)R$Eoh$v^#f zOo3m)1{NksJ0-p2Db6eKu^hb6>pzsPUHI#|g2Ybc=>5Y$);d?eUk~=q(Q{`;0!Ccn ztL&G(lzHYX*kg!=C8~mQ>#@%+FjA-o0}dvID&!o;97P3+;-E}yTMRJA zMuiIW1|D%)#aJzDTWyvuPga1q(P-OBz|HK&o4o-UX;z&VCX*$v`dlle9|k6Ntb%@F zwXR4fKY8o(pabnNz9jS*wWD7sn|a5Vnx@8frmi$E_x*Ye z0?e@#QpO{8J3_6z2p`-^VAKSi?SbrsK$r-_XFUU7Ac`T6jZzFWj;Xdy9MoK!zxW*s zWZ)0$hnFL%hJo%v56e+hRt#EziY?xa_e$RZ2upFgBcDpsCrE<;_)@gSg!*#SPXNu7 zla)B$jMY@z<&f_{8&~2CPO9b)-k86yA6%{5(t`L)?s zd<75%fZd1Jk7lX9^+2l1BQ=PQ%aiP|T4xxj93+(DHJ`)icho}-qhg$Um@unp!BHf4 z5L{-^R=n}?LchZ0C~(WMBCtw>b_ZWU2}dB;{GEK}7ahmB3UU+}PceDMY~)LGTn#>Y z=pMkaY7E-GMguV3SFnbx^&y~#bi@*sgRfHS2%WxK=4JzBn313@Q9z-|Rj57TjE1Y6 z5`zJ!NmPIw;A`bMF8SnhE@k|3t(KDl=_|pxppBLfkbff+Dr$Z>=E*}Q2JfMs4>?o^ zj_)E6$IxJspgAuisElfrQbNr!Xr-dT!8igXF}M?%c3#@b%E%o6OV%n49UxQ=kBV30 zH4)TUO6v-*L<%lkxj(;&wgYw!G`mJ=Yl$*21aMUl@?~FGoQy9`Exo#R#ad;Yr3#2A zeU1q%hN|!a#XPPb{Er}HK}xkKxiiry$uw7Eb??ipEu|%;=u6+1(Gf)&F8N-v)-K7 ze!TN!q37(k#~UuJJ>n^D^Nze0a5n1;E6K~`r{ilYRym9@eM)B6ZA~h!<9L~r*R2We zDW@PZ9mN3Vc5?QF*_waO_iX`{=vq(icV%I+VzIXN%vk%^o&`Ezl$~Z56ts1P&1F!l zhwncHQ>Bt6X?%Nerpjl~&f>_5%YM7gi#XxcV`G7V#`E*ZH*(tUzd1eJYKraSuc`93 z<5d+G65P0lTbJf_uPlw`(&vtO%>StRWXd-lnT;`~)W($-9ziX;Pkr=%`r6s*T;*5B z9=-IilVW3VzdSxY(^;l;JLPNj+83)0Jx9LvoSMxX%m_9<(&J7?LR$Ucj_3{1wKShZ z@9^-EIghbFIu3{b^-V_(mmbXU56{E?R84jAEC6N3Xoh~Y*A&iAJQ?eqZ-)oJZS~F2 zu_J}D{~4=pYCKjprZe|Jv12%)`$4;(6gl3BRf6h;)WWGp*hp%mP`w}bKk@fiD)U_Y zv=|dd|I~EmAU{ZO$G`n+_ky?Olr*n@wpw_KQ{sAel&MT5`t^nnwsp;344v`nWRh#Bc9hRq}L_=u@LL$U;TJrW@1VEUW zW|+`0g3zl4bA(FLZdg|XNE8?eAq=n`U_zz6*NZG{FeFFgTC$enMdq+-&UtCR}oDeKd_@@7)UvI9o zGh{*%644=y{NxZBo1<5jKDcA+a1f3o9KSfYkX%UvHCB!u!H@K#e~94;IP>j=vYtQ* zQvROZulak6_4JR)lB>F+Vh8Ktmw}>2C_>Ptq3; z(EsS1MOt?|T^PhZEj$uZ-Dg?TcW<>}?le3d?~xyJzvg2LyD@>yag{c@=GM&jScFQu z(xAH|i6#oLhNi7);?HN%CFX_m!+yi==4tsuk3Cj7gk)C>{?MKJNdxQv?x;Lg4knjD zoBTX%hTUB`v>h)S6=G}Z&e#~;bbfp4jTVM(mnbNuyaAm}P0h#|sWg^iOJq~vB z;3yA%Z;#%_z@Xdl@YTKb^EMrj)Bxi8Z{?$qA2X9e=@7?NMlw`fXb8$sg^Of;d(W&ga-r43B zYwCY;1mNwHK(}?Ig1e1qU>a^(UIQ%7uEN!!MaeXWCeA=^sh$76#s9f zR)RPlra48#`=sEkqQPS_ynJn?*Rg@3q)z)2depVh{~;hLYJ-QGG6)b}wOC+6Z-}!M zX0en@mp5Hx=oo&r>iwnI)yli62W?Z|Upx2XS$%nGt(K3EA?Y1c#>!s-D|oY*6m^;j zgkczsq4P!dIgQfNL^JtiXZ}V_h+{~ALR3=dE&1}5kUp0ikfbLv_3yJ{GQb^n37p0- zCX)RtMrzP><8285wiov*0jV|lR(+PDKwpS|^Vt;vjg28XIoKk|^$2M=(~Jj9q|Lq@ z$-Xp?om>SUR0e9lyic$mzD1uJq(`0!S%O`DXlYm=lR;|lsw4goC#~<0r0TyewRt>w zD_3;2fkm5#I13-)iv$TRO&?-xw&mP`L1Savz;_qD+TB+vYJd!W4D6 zOnfaaVT-ExK+p-qzdoU8d2^8lWXXX40%-sQ(xzxZnJLFq9L#6 z)hBGmpt`~m-l$0)pRmXckUneQ%@9Zf3J1aC^~4gCSlp>;rCP9 z4Jl^s{GanT5Jo@u#Hxm~qNg_fneSSDq&jXef8gb6HcnBsMcC3{$HFD8_e z`PD%HHjPXl;eC34zInEU9mWroj(<9)d$UmZ&H1p^^AMWOb#v@zf2yr2IJmpvXw zA86o@H8UlCh1FAc`HN-zu$YR7G+ps6-KG0EyJ{FeWN>-(Vi)vj>9f`d z%?+=L^Az3j1k!MJ3wy?$EymzC^)ta0vd96ta0T1Qwb>=xW8FmG^q-1-%(0xn$>W9M zSVODD5Z0h74+r*?VvRs?bDv*iQ~oF2PfH&Ghyr#t%Y#!r8OK^^zSB5f(KkO`IK7s>zM=2J(H&q=^v}8q{^Az)G`CRPQ#k+LuutR% z>^gh0ggw1CaO#qSA}ofAEZHwWd$N%KBpzYSS!lK&5v9?^GrEg)x-4->SQQ;8`kJY` zS-hcj{3cj~K_YP+SY|?8HZNnER|#rnShEf+(WSzrCzw2pqflP*XU}uc2y3E(IVSXge`wj`@he=q#K&eTgC)yAT zDYi6UxP+o8(PRyTL>qHA$RFWrf%Di`#a>IUe5HbqH*j!8)IW!_QVTg+1;5g-s7^$>&N%7CfzeWaL7L0`Sz^bsh`7>BkmQbhNlr2 zE3DZW;A1m3W3yDAZ=LtObhblO3Y^z!nu$3P+(X^+*Y}QO{EcO8`E9yrkY0sBRp4XU z1+L4MFTVZ7VN7^oNwv4Pw};1*wRXr#@sRu!Retl*y) zhF}ZM`a3^jpug^=>(XpTO{Zl|WC2*((hyzoKysz*iGQwaHlNjr;#8B_p8uxDn}JF! z-Ph<`=;_Hjp0c@cMMZ)1reOLfUiA4Cn@<6kJgoV*Y<){)KZ1-`ASM(7atX7WU?%+!_nDvdp_T{E7;AI;$n7w}BB zZ}3)Yve&@C!yL|nR67(G@aw{lqlbRoAlek0Q!iz5lz|9%$W@DqlV+X+?&gR4n2Xcs(w4%7kAacz^K_C z!-&yh1!w9OgCZ5Ln=h!4E71((9L+ETLJmP?s~64!JC1M3ID>$j%~lDDv|2~F7!t#n zu|Up{t54Dlf(;Ud9MHjb1-UY2LU8Sof;;F_6sGj?x1ikNw;m%G;uLZn`u{-5r0nh_ zUN((%lliH2xE}v)nHQm*?f8wKz*;;2-m7Xjr$KeqwrWnEt~3R?95vwrJ?+#3-*-G@QYn9F zd~|!4&4)S*9>QID?>2bMJ<}DZ{QA0!+2_Xm&~QrhQg?AQBQ#S}+(KU(!!(Az^jtMe z(EU_gz!z^<@^+M8V+PA>*15X@Fvmibfl3_8X4@ze7bRLJ7BS=?FTjA}m4YmI!UTQ} zjuJ#U1K;8FEv~%I#Uu(_ntFodU%cCK@OKQ2j-z;oUs!pw{3^L}bvzsm5)Y&rSpMjU ztEbK!9&tuYG(zth!KcA?#z4v7N9Te&zg<)V=)%QtFI77qLP{6{f7K$~HSq0G)}RN# ze?2yV!Lyf8f)7daB1J_*)l02oKhU`*ORG{Bgk~KZRUpbHz1jdbl6w!Jpra@VWKrTm zK00NjU}A5j>OEzw{^#Y*gB*Qb$-A15w#Ur>*Pu{a{6S~#9i%MMPIlO+>P?d`R~ick z`efE)mKoYD>-lAtM?xO(dv78q*2J+$HwBJ zm$zPLIC$o2W@L5o{y}j4CH~TVX+A%*E4%yY#KFq(E2EQFGyeJ@&tC+bdC5&uP zPFaQliQgkzl)AOll-teLL+!bXf6%q(C#r|MLA8o`*s*Whfe!`z>9&rq={8LRKYI*) z$$K~F5%$a2wefE~q(dP)v0fHWbRa9Ws{dNe^jM8}H&56X3S~=Uf(!Mg=zadv`LUY* zvaTcIQ!td!#XDeP%vB(O#VWj%A;3%lr_^Ar~Cv@ zCjV)+`ZQxBOz<52(sSNUHSDq7@N8x$kTccQWhEsuCG?pDEISV5F1*gyWe+brOYmb0 zt607))>7}Yg!@CH50ivl{!sr*GJMBo?u4u7!?(tBX2u8p5PBS}>DFfR;s-6UgwV{f zdwQ8MQ@>X2w^np0h3WUDG1a+?_i`hfwoh2I_=})$(yOHNCG@yj$dv%8Y&}@bOYdAg z7QgkFI*-s~_OL&@4p8e>=RF_5nhx?uNNEge6m)oDQV8B7T(dB zK3c)ZhE|XQ4;ZlTjmP#{rCkl9LF%ah5IMw@rUR9nz3^_r9isRMYFh;$|D%xdMd9)n zBk9v83+KKG;hhm$FlSUJj_i6eQj@>#!KHE!*|f3bV}mY+%QcclS4n-#(_Uwr@pxCu zpkWMHnzr z79p~RM(D#wT>8!nCno|~T4l2WE?+iOXBheJ zo~J0Y0r%x-lBdr|NA4~=3O2L~@>+E1W>*wsiwn8p(OhW~f1yn(jlocREQu#sX`F4n zbd)RuX1Z7;DP%3Ju20pdkw8GWWL6)H+Y1+=`C54exwGZ8b2&uTw*hdy4{lb$$=>f)D>O} zT)JB*>IqzUOJB&Nhs9N}vU*0vtalFd`Sms*@=?=!3g$e*{a&(0Dp(!pIPZAQFY^@c z=P!U}{t9%KfL%}|#i|*bVUE~%?9tVO1#cZ3ApIWy{)?=UW6<|MqEE0Q+0`U*SSIqSjAnyJrbRI)O{pd~t)Y z@BDn8jVOjWsmOY-E0e{;o@+c+O_!|CoxZ0lCFy-zYKGn0vnwY8c%na8)0(VNcv2d6 zLl_6nMZJOnY1fyxE!!HeS+A8CrUToq#z7L8hQ!_c)!e<&MH-}}ftZg`i)&cy)s&cjxpn#%IJ zj;g=QYq%%y;blnW*sTrI=RHqMz2VdUaCzzPlUH75N`apROIZ|Nw3MPGq8kVh@KZ6v zqR1Zv@WT-+FH>`KbB@cgC*N{8kS#ktBJoNLWN_HhVsLi@6=#gNgneL}2S5*q=Zm}& zX#fsDC4?y!fJ>M!kPA0kaJ)zmCk&2Q-a_n4&b`_YvJD(EiC)BNHvoftR9U3Z_w&XH zGtKVdWhEqS$p(u6Dm<@p?TzKDwHYe!Vzb|LW1KW7lN2t=o^<-b5$PJ%^6*?4jj`Uj zBv3Y?D@$};_%92*AAdTOT(YsMj)~;bGu0mJ9)JuiO5#h>{Cb(p5zgE8;rSyWx!Mlw z7uwY?J0z08_qEsNUdJEU$sVa zyoXfCn(1)K=7e!8B4^m)y$9eHm(Ak@P(7a2Tu2WZxTVVc=Xz&T(=T1Z0~*VHR5aFT zMF%jD?-m46AvvCLQozXexSoL;DY{rrR+K1Lt;G;mTNKx&U( zsRyf(60$%^-3ws74^v`4S1CwvRZCUFux44g0mSOvXda_;l;LYWyb)=gSfIwhRtZ}& zt{?qcg_x~`fu2$8v5jN`3#qv_Pld-2mSo{-#Kk(&ykj7%OQE2g1*HIH$VC$bKw;d7 z5tbNpBYc*aM;;?3`y{Am6*T;62Op7>%3KVJNH;JpXWVSdFuvWcgj(1{3FYsvgjo}= z;3yaYX&!1ZMebQ1vJJ`X*LlGy+m3v_QPDnXN9ofL)(4j^_l{L9*~a?Gy1DGxB&n-J z_VU>+>(TlCW4f<(zuxgYXY~B$%>Jlz7dNnxtVPvZy)d?gSARcmJi*p{`>7&Xt2u_k7#lf^i=HO z&H4{0X4rK@a&W4k`-Gtj9vMIuq}Dch839S9#fSk{ANC83u6K7B}>+6?z)f+ z<_vPE&d}#~)93z-vtD>8-c~bxpN*glNuflhD|xZy=|Btbyb#dc=M6&RBUn$1AHFfM z#%(-+ag^@zzKb)Of=cntT+zMUw(L`E=|fEQyp5%=jHjI03->icgf6+eyw^i7>_|mb z9YkN};!wgI$@3iRYv-MxpAQ#A4D`8HjlNE*V0bRg8uF$-C|Z9SUY)-*DUi*d_mB;- zCR|yAf4KCXZEHFs+X{T%UO?d$YN2GegY#CQmWCk{p+Hb*a6x^y)|Lk7Cil9cS$ROv zvqdSIurfDEwdYc`p-unWt_yu#62ydHCMsSx=3q0e&XSI>R;vp{4+B}=A;NpEm4h9! z0cF;#AM3l74cayR{vCctHgi!Pr=1G>XKM&AY#u4>&ocZvY=+*3pQ;(X1h%akh`!Pm zHtW>^2sYjQ%hsqp-&?=;uY`pmPn(J}7nsNMd(Un43vP6=4rlgtz0s9Td<@`)if2vj z7cXlMRxpLVIlEgQS(g2nY`n9&p-Eq7>d!Dkw_ox#4~Ls2uN&Og(P=E-anwY(`mx|R ze|FAu=`!@X&pZZ9`O*M>_{Y|7+0ra_$w7vsjW2DR@@e)jsIdA_ry9v&oPR93Q7FDN z)cZW4Z~0*neqwdiC!?;i0l~w{;hwQVOIZSa z$-i?)z_|oq!8OBM8<_7MSf|8|_Z0c(r15Rfp7m907qWlZtH(X;t)djY67gEza%;{nhMK=@B0w{S`$|MFp1XXnk}5nXA&=S`c) zX;6(PU8S!(s>dv=S5DqGv{?io>z@eoirEW=!jJ4lclMFLFjzfM@+#mIBg%5%Wpe2A zMe#(npr)@YBBzT5eZ>3$x^OJ>ioP})a1bW_Rx2pW(R{b%{eW#fyqlUAYo8J)5{m;6 zTeQX=%u1yH$6%Y?9Oji-ZNEL-H_OR7t{B3bc~p3g zA^6Yv`J)zm8=is&JYZ^o(L$|@y|PmCK>jro9T$ zka1~|22ub4f=m=@qppVj2=(h)nDC+K0d#|;1I;iXM+2AUa~XmTGMvy!G$Tbj<{1XEM)Dj)L~_Js(vpHAGb z;Urk=Kj^|6Ko2@Tf~!OKUoTqs1?q5_61vq~p3RW+m4H(>ty!navX5)K=g#f%?9Awn zsCoI+rZ@M$GsdF-1@hVF-f84cJ>#qW9xkvEw}74)5c}U;(V{2!?P45j?tQN4qUY8P zw`GEx3qtQJt9sm+Z6O=NMtkcRrtD!irjQpd*zf!eIR|ndN_sYc_C3&T?A9H9M90L$ zCYsQQThLI+HQ}+gq87q!6M!pi5s>4d79D11z=%~t+&DQ`BdLJSQ2-Bsz(T|(Ve`G6 z)H~Y}Ao;J*^9H;f9|dVpK(zxgHG_0lLpe@aVT;)ga^gYEh2ldcN(~nb22AKW^vIk9 za&px2l$M$T@EW+^2wjKhjg`6JmWoLo2@u0o58;8wzmXCi6-toO5TrViA=w1JkU8z9 zD)c7+KvT?xtF?%jqN}HSPTX`j6c;0#cT)VTboT5U5p$zcze(WCt}Nk^zq2~dais(E z;c0Y`7GC&aL%I1mVS=mXs=E&K&|vYp7U_$wPmG+MY5B<= z!!L8JJlvB1$6899>)&ZT+q1Yk@EgnKqX)Nbn^ zrOu2~7fqweYwklt*MfNfH-tid^SxsOr8&r-Hlf*~)lvHH-?zF)&mA9tJ-a(S zwn+V8Dn-sKyS$hJ$(9=QiBO%;P=mtF@VGU2>kxYA02FL`6oOft5s~RCeV}cToFiY| z9M0|<;1pXhW8D5LZQ6}A;;!%lHw1yCiCadu^4_1Xqd^*}#@P$MDmB_vqug`mTaN($ zAS597D+^>F1=H9TzYdg%1i_J!i*BL!@?ze!Px%O@JOodQIgs2ezGI8CSpPjg|4pH2 zI?h2+AdD77iUTSH6BCrK!{Jgfn;&ky=u}bjx}~O3OkZfKns^dY`SqzML!x|}(YM&H zxkZ#^#p=}7uJYg5*gA4{5QJf~6emF{GXU~0fvwrRo; z&Vm2CMIkmNaax$`LM~1yC5H8NG56ork9?!fPi9ZY z@V{yH<*-^QYm@f24t=0*n!xvko&uR{Uuu9SiO5?}im0TE6~2DVP=nO$9XaU(=RM}W zWPPZrsW@j@I1dK@dqb;Zrd+FXYtMD7EP5lxtJwT18BZWlFR<hD1 zr@JKM)RR$_gQ?$NR;rbo>*LKY6fV7}bg+@k>dN{q>MjgrU;248r2NWEbYOK*!{%|_ zQqI}SZmef%$?R}xQKyt|GgKp3%zV@IZAn4c%ldK61hyNwXjcp*-^C;h`&viHfdos-Y{#JuSOo~UqXx^SX$kXI3!V6ikv7jP?dqG8jm?l;urbb@N?^bCxyTgdvt-~cF2vwsNyhdHTW4ORP*S-s z*DCDM{`-N8cLTZIJzrg!7gPyv{)D*Ko4N63p5P z1(h>ba>a|D?9!7EP!(3m{_vFkZoJe}Hn5I2(Z>FezVF`t*%*hx*jkKM=ki?IC=60cy{9d?!G3;wz zlRJAaS9}fi@*7X_n?Uy5X8!b6e%cF9=^UT4h}8?nSn^llp@KN!h2)B*tGNp==+YQI zYoS5M!`^&3fIaY!J_67~nYfmTC{GhF1Wq}`|LWPv`82*RXJ<`ai869AiZ&45?k80A z%t{KU_VCXvT;%gyj&vrS$aYNKeG9Z74X~xwP@TzCB%if%(5-tX+Cjp6*qcI=r|S8} z#6Cz-SATN4=t8xd2U8YzSU65U(@eLrUi!G%(sRi)3)91n(9RInbFS6it|QvH!tUfM z*_*;hv703T(t}lzO?|FxLF-txM3l#m9O+s*7m?7FbtL2`PhquY&4}jM)Ob?%q0P#d z73_(F1a$?%h0NAA9)k;o0*Y0-e3S}oEjS=+y|`YM2TmlO-ns5pb_=gIX(3sKmS`0 za}{ENp!Lno~nr;Laqg9%|`cz(mr?uFa8k3?2Z+~~fy)y#<`I$f2o|4nH# zF%^Ny*V$c3dWf8{rGf*@O^u}}n>cD9s8@fyA@5Do(KX9WgjJ_UH+|7uu6e@m(Allt zxN98iGv_ZlJ7||MZ4jcG#ul9th)vxMUHYAH7f~FEy;NIj;VRX;-s7#i#*WWiJXD^Y zVw;+%mU`P(BRbaL>oT3}>aifYu+v87!?P&a^9AT2w)$yjZXAzP#1Cn(t!3ZttN1K2 z2Lr-NL&3z$hdWxj0VV?4>3IDYaEWb)HRaJ(AW(pXDu-Da$_$_?HlZg8Up9t6nBiAz3>)3z5$=BJ`zR!tFLg%Y3?|j z`yHeKqzMe*vRc^PQZAB4@S@v!Z(eS}K56M~p)9H>DS!sZ4Vf^QnvGoUMWG=&Q8cA8 z5DYpVR?fHP=`O0hn><}vS;?{7`TJi9n%j^q+E)_RwMW7Wl)b2`7FY@x+fGF`jkBQ4 zS^8h$)DPeGX8h9?v}- ziU~ZJZOPshd6GHS*O?aRetvuP-_EBVriU@M*KUn$UdBJCuM#!I^AN|dd%~04zB_YN zUD#LByQ`Y>U&$-M;fVL^&2@u!vwL;7T|v#dOoi%q6w^tGkhK(oL!kM$ZAYHWVpSI6 z5a(blOEs2l^;{|loNWq}JSto;tI`Zc&O|x8f{oJ8y=rc>V%<8O8jiC~ut0KW4CzPj z-qC_YS?tBCuE@TwI!<|x`J@|`JDTl+8bFla7kOA?9i(XezF(Es)5~L*hV-rMlF8r$ zkMNm-_QH&trLDQ`Fo)CoL~v8gpfA)_SYbE0crkbB4~wu83ua@3&hf;>PJkH}hb5ZK z2~FMUl(_0PZVf(+x0;ayei740ZK_6iRiyN5{+Z{%GtooKU5DBJI>@D~p zr^40|FFxi%x_g;|YEAx!B#$}En$ap9XwI-e4HF+3;eXoiDemnK$5+ao`~ePSzbgSt z69UPP7P;(KxFT|;qnAp;(P zpH1{lp{M|p0<@wWI<9BtFz)UFKEVsuw>dmj-~ltZ<#ySYESXTYV2pC!u5ckWnJLImK*UuQQ9xc(;(g@QFF7eaw$r)10VI5LH6(=-qUpr}|vzCr)teCDV}- zeWPf~wM;8TpK;xX&ha&cCm8d>bVC@0$(z;DD$B`7>FQRD6yI@G*&n#vQU9^)UhD0Z zHj`X&d5{dCW6+Xo0wiBS4OX;ev~Al-y7=DItxk`AF9}l~tebFW%Zf9?+S-~K!$PTK zLR>Q*&tELTZg0HJRT|4?jwFY*CI~(}N$VS{X~|`dbv>1IMer|rib~qLLc9ArdEq04 zH+$E7#TL66Gv^$7Cokzn2!`Q5+F+!%AJjVp1cBv*r#E~}+tMx)YF=_pIPt+diK%nC zQCh_K;z=o8+Nzn+#ayhp<9rpsPYS0Ah&ih?FYDtiS#!`_)KHbflUcZW3B9X0}pTvfy+Q5M;werOJAji-U88_uyx60 zhdwSTyOlywd(hSJ_P8QuJxc3?g;$$$FNvQ*KH2&*LzAS%I#So#6`EU%*PtPTYPwA*<(b-w;(%-cT*QGp&x+C}?&%xQ!X zSYd<)Nv|{`z*xh=48M%Hsnyily_CHgS}IDPc|y-;`_GmYUx&Z^{|-V+Zjg5VRezMA zP`+j?x{YuYzqq`LE8CD^batc-(PHj^A%~r#nsx0?YVrMCjE%Z(fT}Y^2@JSfJ zZcIcbU;ejsWTuiUZ*L#1mP!TfRr&A_ee{r#5eU{I>ziv>{sq^LaurlkpU-mc{@O*s z%;s@@`S@iuY?*K_?1vn)+3>un47@>iu&bKY299qk`v9_IT~=TC<4AoTMcZ< zXeHfEW_x#D1s#IC1*4J(WEw^lCqjut`ZAD70tF8vma$!B@PQyy=Qn4u!`8BrYT{Dy zn}2mJ>#(bRdDc2{Fv2{m<0BT$uFU6g5t6CSE4+7WONDMLR|lxvC-KWe+mb!{ zk9mBoV9qJZo0qHW?UBb0557#Wc0G#dl015NcSd+-m}g~c<_Vbg86XmrucxLU;5HQo z9|HB4cb51Lg<)BsL8aO1-HfrrhV2A{5i{PXp#NLTM9s)eI;2FQ2^FCSZUJqHY&Ku_ z)Z48amDAppQnVRL6tECtL-D{h-J5Dhdr^M7Vd$())sZByVR%&!Vy0+XLH%wG(;wCRb9-h86j`qI0^x?53W3r>)WT^9=cF=y$#53#Gs~UMo}y~Q){D=py`v3T2DpE&pvY_*m#`|y?os* z@8^pTK+utU1EMa0NiJ&NMx@1I*+^iKd^64#kXEe}gSGO{t2S1k^m8U=L?*<0oeo$Q*hA3s(Lw;7jR zz=kI`Zus|}KMLApJw6xyULE2o`qIT_=$97W#~{WR-f}eWZ6#_b7zqlVau_^9!a_~4 zBOW375C|KZcP-(lPnbA5Dy>%o94Lz71IT_iEwR$xtJYotw0#nIt^r0Fo(}*Jw}HTJ zN>=Pq7^In?_3=X8j7A6Xc$_tl64g~P#fJ1ow&C-#8w`CiF@}6zlJ(mE*+5|TC8v>T zpk2Ya4me`16##dzpGGwXnR4RmRvMP)c*%__t`i#{oM{go_tAX34J;{ZO-@m{UM7Io*wReg;1{mfdXa9xRZ1+nYMWvX@Co6{4~R1m^!(qs-@T+x#B>wXKuNZxBpD1kH=1v~+u ziLGostOwl!4Vp{{5YTMe>;3!pfEU!O8yT6lBqR<&efy}S2S?5kflx1KAS0pc!896~ zxsL7xZEd!K98L!YP;3Tj-h>`j?=ZAus;X_^?V*KEj#OC1k-$ZKpaiVj;48^dfk}eJ zg5yX73RjuHkP%`$@{t8dQTZ|jh6)YIj43M-jEOp4&KxoTNK;|`2EXDWt{i+okledD zYPcy)Q8N`E!3&Qy$i)&Q9)P!qa~b?As1t*>yD8P;Wyab)2SQl>x?f3>DL}tYO)%OA zx5(QD|KNz5D$&$ddC%rT(Km$zQNDfq_6^5+T%4{qQa2mG8f;4_c!Ly&EQ9h5=t3!8 zO3Fpwr;L{F{-OVPbW(8&m9aZkUc<{4_iBngH6|cy408Gc-p4iy++W1b)fnniQ(hn1 zO{JLIN1eV~_fu5oWj@xB5SPkB#GNNOVX4Q2>6 ztfj7CCpt_#O;*)6HAhQhw72J5YOx5eU-9IelP2NfBo2l-QgFt zGYW-82l!LfiXmIqa8>)lB%RITZTtF+1W)s%{{((59Y4T5RFJ!sIZ-ih80Wmx{jOZf z)x?W35`;;9R_^iu9+AF)O{G%fZD+ zQcnSD#LF{{ss*JSR<}e`VH$SnjX@e6c8F}yhu|iWk{D1Mm4a=|(!Wp#0lL0e4B5?N zFlxaM#SqzZBM{OfKouMW?6x+lc%|3r9&_cWl&Bq104)AQi^Wqk9fJ;nvK+yO0Z=c< zksNJo7ZNEx7%P?65qp7-NhQ`3^3)hLG{_K8JDteistk@G;vkXRl<`7q#uzIc+%kko z6vFK(Q`l)BmsQJl02eJHV(`Jq(SWd&p<0;v3n|kOn&1(ff|&!NH;C31h9DYdptx5; zJ~IfHwPr#08+PTkWLzSN!d$er)@eE96dw_v`iX^`lbooAde zH-M^~Fo1!yBf}0#D+rlM7%=z>YO#cJOe_VHd~krLi~(9y#=C{P8q^*QkWa(R^#BDm zBY~g8-HBHT41o-A7~4^2ddW2ine~$1$i8YIM;*vlB$xBD< zK%*b;17;X8fT|!FQ?v*tEhHRVBng_11K(j5NHa11%3H2HDXb>ZD4MiCAAMMaV1Z~g z<0vG7dg)<%5Cux`C1Smag16jWs}wRbhoI^aD6F9<88O%s8}*Y4g{YI_{EbS2&`Dpd z-rQD+jEI1=o7mthujEdcAv(m26r1f^lTIL|nd;P}RU3Tmof(BZpcO7F$u;do?X(Af z{q_!t3?$4IMPq=|uGzfd1Air(@~EQ1R>qz|R{wqDWQ65{cW%liF+p{|g-KjB%I>~$T3sej{Q-9aTT zq2+{pMzn3pDM^Gc(%3*wPAO6+$3pT5eN%{~v>g2Fi!asnH#k8TxDtA=ZQB(9#wLSs z0g*;&i^|?Z4Iyl4fJnvSi9*4FQodLLwIG?~fC>{sMUtt#0!$6^q{ZVZ&A?+59#m)= z*EC6-4TveK7Liy7FKr!%=BuVeXh)O!D+I>NufgDx@+fK9!Ssue%BW~XQ=*@3Ut6?t z4YiLU%`7@jKT!tHKaGlV@zju@ZD zz&S_;6J`0SQ;8Pzffqk}`mRO813tPgR3RR|>7pg%ZV)vUpr$JABYM2S{ zCE(gf*3j|=2a&9(YFbP7Z|xd8VcES^T#yPGIw?a;#6mtydOd;!Qj=5tUyk>C-Vgd%YT3E!WQkceYUN^!XW!ds4?P7gS(aw5eSG!(2Z;f6wG zfwn9Yuw($AwY^v9$q!$=imP%3!k!>Y;6`D@jjjg(UX0jDLF#g!L_BG{@N8A~fvypC z8IFau__xTx19KwQR|TcFd4@dImSx7iY;09UNmO%Xm?W|!y(@Wb~c6^j8xmyBwvUy z(e{z=Fa&3~FcDBvv^5?oQ*s_nmD7L(8D;ME7K6k_Dd0MI*%UPF;4L|0&nsnUn*f(o zPeU^f9j_gl4#XsI@M(~IdW0Oze0_U44J+aAlw<3>kgA2F*w(y5UvJYzr7iz*Jc#X= zmPz`tT7`J=TFAc4nh=><*=n|zD!-R#qG~HsXnJZ&YL}I)7H+JzT$z~g_wkqKiu;PY zmKt@3cNeZ@&LwAr?_%~cg1-oU!b|*L!i|-dL7fL$lE!mR{P61C3p_<-WARq(F0GJFwbph8NIul=PIr?eLEBpmw7a7vLWH-rIsqdR#;+k@#(n_>VC zgm4gF70wzwI#zP9t$T&Q9?XfpHgJNi;jrEdnld_IH9dSp-2acJHvwzv%-_FHLJUEm z#Aq>;DnX*w5hY*^E+`>&0a0n~f{H>gD5D0cr40b5MR6m(so{x9ruu^I_Osj#4!4$RXFeF7-(c02Tt|B2uJwU+;LPHge>|2UT7FmXOEg}}v zR`kqGTzLphtx*@y7yuiht7JIHL%1eqgYzx|ppR3S+oImafY50o9C0Qe(&(tqEU^D$ zAoCm?U9JF0R9<+m+?-HOsyO6iL=owM?=viJ@INo}VDs?IAwdo4G9^T+vxX?(LJi9h zoJA0uH5;mNdjde2KnL-@3Kt=2Tt4nCOR&fjEnN`0RgKGzgD?k~LO}PDk+VF4E5QSS z=fxI(7OFjvHJL&V(pq9YMCb&N7pF==Y(qV|ADnnpl)8vAM(k0V4YDKbG3OzJ?a}GR zMUVv_S}rP}$EedOWUi<9RxXGdScZ# z&AVed_sQj4p?Zmh=-Ru>qIlNb?iFkJ(*ZLM$)B${`Hk4&x#z#WST~=Om*nw}&wgGV zJ4aSd*W%?h;o$y9)+cT$M0Uv<&6iLZiUqYPa+M3`S5FEEA$VByjx;vdzz3Ge8^XX$ z4rcA8&hceP;vzV)0HTR@{vWDzfoy?2Q&@ZI`ED&=?J3l#Iq0L!RzMy|9@TXmgjaQ@ zyIl}xFZyUrh}QZep}hnX1wR(>=d-mFm=YMlkV6H0h$I3Nt^h>UVBPDEg9)>71vmCE z@;x$uXOl>OQWHq`Sg$>j}^r#?n5gQkMHJ+aYZl=9jhSN z9mH|CfdtqTVue=(Jw?w_f`(&t*V#QgR?Gn;U*g5q z;%WykdZLLWuMFAMjD5To@v&w&IxH}>q9J*M#hUBIa>3Eg+-)K(*t%ka+r4iMnH#f4 zM*P|VE*q|h_YRo)vHf;o_{2BK(OG<49{IM>Jddpu}6)^M@fPQC-)*5y>=KW$~M@1ATa~qOZVC$X1-hu8#7Kq{q5w;U;O4f*LSEg)?Wh%ka; z3)Bp=eMn>=X{$U2hKS^P$O;h;F*tgHC>#v-yx8>|vi`(WU84Kd8O0{f#BK_T+|?*Q zkrahv2JvZ72b&^tP(ZkVnE@VOPbK;Ym(+VgGKEJiTSdmsPzYSRbSN7L%tRviv60qV z*(By@XuC>8d|x)Qe2_ATC4&%yTZ9dx_-}-i7?cy}A_*|4BzS1_$hpSs(#=jNa|YEL zzF$fTftKXcr9&l%qp^n^H^G_E5O^#pf4(og{He9Knh{sN4c{10j4&{W%caDIn8!)X z1!@-pJqt_7k_%HEf60|xrm@Y>%c|ZSNg*zM8NFql_QC3Za1s+0t0;1dy?Zt6jUIfF zSWd*siG3X0W4KO{@QjO*%WLuya=c=xfkNuWT;|eR9JUs<=#L07?EMHk+y~?tFo{Ce zyTt1+;D?*c&Y$dF9{mVf@P4zQo#U-hgK5#Nds!>5dcOIsoWf}Tu(evhgG2-5rrHYGbgNjc?hix?o6 zSOxMMJsC6x{udjwQDAS8H0p*%HBlhqsX2%Y!Q>sE81TRnjCc5qeRL*+wvC19X^Mb( zFq=V@1t+W!zPWi+CYZ-=0c0c~*!viIK$YtSN=n$i6`%dU>vo9^QF$UO z+ZKOd55B33Ytg9!X$p4?O^x_rgi>;csQ8mf`0H(ooF2VVj>Fc{0A^O;1dRYu3bw7F3J?!=R!2+*|LAKlW^N zKvBSDg_vCTN65PN3junXuX?)Knz9=kCGda?B!_c3zpI_yTD(?jG&Z#eYP;1a0Dv2jU=T#UJzjGK$DlgvLr zK1nPW2~O@pq5`Ib7V;fgtP=4M=PUacRmi~V8TAJdi^&SA{~!}dXwdHY7cQWh%bl;H zBPXFj24a=Wk}t!W2JA2d5?fH?1RtRXVJI9wyeOhz=aHB6-`vN0I!B&-$eGi4_S3lu z$R;ElY{8Rr_~iLsjc6b1HrJdRgt;xgLx`S1&YcPyBw$TJh+&vAgtGXZ`%{+e-?jit zFG7qWlgBZG$1w6ez}jsUM1TLm)5YPFa=3$&*SSgCo6oe4$F%fFpR^g;HU&GmLB2|| zjeC`2%LCr6|KR(f3)+Dqu&g|9>n~q#jTzSD^*2t|L=UHxLUA%dJ;OeOlgJ2R2 zF{aZMK(^pv?+LQe9k38Nnk8Cdr|#*3qn?wwi`BH`7M>kM9O8k&WfrlRMJ}}n1_C!w zyAhpRF%?EVW6lNOR?I}ZM?r;!s|EKiVz0xnuO)&MG*kkh|Dup#awM=OTZ8IEF1cxE zdp;q@03-#A%x_|`L0#{Rm5@nBbDU+!7^l^8$hippWO@*e0|Xf@MtMnw*&)Dv_q6}Hi~&>u zZJP{LgNtk_mK$W0YPX9{Ko>x1uCLMsTTlgLwS&_$1feVlW@C&-zgpkI*Feu6+C4VS+2@D%Wf}6M<5oUVf5wISJ3h!Ln>^n7_2W2z(h^(yc3UH} zJ&}x2x&oE~≶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

$_%8 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

Upr4gFlMd$wB4C`+_ELF@oN8N5 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νC_$sJ`NJ7L~3vO$p2a#o>BG8R4n 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

pJuK8)pj}Te1xe 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%0A5o0o|Cqsemn%@=9e?X`9k z@^>yudBpeNC^n>-`1~nBwx1M_v zD_v(|t4~d5+vb?cQl4B<5@`#3l-Ci@_9_hG0R`3eS)Er(3}dNuY&TMAc=(|9#DG4F zEM=)9E5%iTiTr8`b_mJ!Dfvm^5M7Y)FMSK+k;K#7?K}DCsrr?i=DA69euDAx&DTnH`Pj7~ii}&YQJqU#puXl=i=AEg<$E&XuO$AJ7a$ zF&9;KRsQyw-_X&N(WOnle^JC)UCbB5HpL>{ICXgL#hw50*y62ZXP@H(#=~;p^w{} zi=PaStUd+Z!sK@pb5R^NV|Zft!KmBIhdxL;xQTIPbfLmRLwXkq)m!-Fvxw|9Nx5FA1TC1 zb}SpzKPBLXD`ukFS^0MSMEK2W%thr+Djnm0JEJ2o9N)v4-T!YG1jdVfb~)PpKp3Lw z3lVIJ77H_Rd!fc(Z3i6^hn$Qc!ORUfT0;h8ZdQH4=|XxJM|pHHycMQd7Jqan~KjkdLt| zH@Cz0P<+R#rj>A9K815KG(`tnfKvScMW=xeNQdF<|3CCl?no@Fi{cr2)rKoE9hX{6 zcT;pMpdL@lAVav5XNFvKAoL=I4I+!A1+R~G0NF5%c%e~ht;e&Af9BdnJgHM`R5-;u z&^T4zDP_{v5bO!Z$Eu&r@Wlao~f@&PlyCXwxxI zrH+kSGJ2LjwLFktsXDe2`28@N;iFpdmTvxW7q`8HUJ&3)^Z`Gu540i19(Hk*d(leh z*XY#W2q-PqHT~JzG#3vyxe0#DPQ%OR>$;bJEQrQMo9qp6*Xp}5Gd6d$zSwbR@~f2o zYnWzr-m3eek;|kRGD;MIJ61LRL9g3*$L(cw7R+tJ3nKa}>utOQn~UQUhiLhK=>bRN z$My1&R!%K1R^&Q_zFadmhpvAtGek_I;$L}Ik?}WCr%OWgqL3+(+(ZF3&|Y&TdZm&BlLCJQ1-8Fl)nCvZ zrQ6k5VByaoA%LVO3Sj;U;fRJgVX$Cl5zru|+P?17Bz0pF9Xlneo zqBAKadr26-F|8lZ92y58RdIBbZP60%Rfd9nWCrSjyHW;9CZ7RbG*)U zui?w}-6@$sNb{>G25#RQ`fLLPoW^CcP30Q!G{&8aeF9KDb6zS)>dN%ru5E|})#k=} zb3@2@Aebsu)2#2GRha)}Gzi(%IYW2-@^6~A|=u2+W0l3AD=pAP!C+euX0*Mj{}@76;;SxO>pi=`5X?$ixc%SE%3 ze^gHR7=jQ3xEOziA7kvnm48%DVg+tAuK)DX)tl28y8v?@=2Y{Kr=#pI1%93w=7+AN z%HzCpW>fsSiwcFVE~Y~Nqz>7%oZcIVv-2MSXS$QuD(j^llMC78Qu~rmOg&*fmcmo7 zo4UY}%j@w>WTY!Ezd=qyp)7sYA)`mlBce6lY0mTCn2L*?Vp6frmyB6M$GJ1>8Asxc zfUQsxpD2^1XyF3h zF=?nIsz)5OEKWjtMqJT<}etBzsAXCygK=v7=$f9-5j)?E%ojVc1}rpz3e0RzIb+5&FjM@*uQxS zbv}V{*C0T~dj#(uC6Q|NeC_|vP;vCLA8Hw}gbfqpts|}Faf99e5zfUSy>fg{n=GbO z3R9F6<~1#tCNX$#`rT^n2H3FHdmRX=x0)}Gdv_*#`+`P%`E=Ux*2O}{vVxzux z?I!3WeJI!#B~=<);xEzdrWnzLbDb}8(iMK^&fqyN0QzD#@3VoW2R^)h_)nuZj2CpZ z`8Q$>)E>AD0>vXxEE6~0!Pg;aJxRCTp$QutA>QVB*OarhA+mo0^Cp3hVIqosx>aKR z@w&K@fqD&gRbwk(F7I7v>)`NY4{?9Y(FCsdh2EbCQ^YfGG_mz05lgo~j*Q7!{kLw- zOc%y)pDd3A%2Af9YIz3Dbl44_AKysWuO@g)YnwR%WSJXa#BO%^mAliB{42t&Ua$XG xqTgC9m9(4HQl&$;0p2(aPB7$-|9X4oKMnW)^;h3Ar|_T71J8c*osQyb{~!MN>Inb< literal 0 HcmV?d00001 diff --git a/tests/integration/ap.posting.spec.ts b/tests/integration/ap.posting.spec.ts new file mode 100644 index 0000000..16e04b5 --- /dev/null +++ b/tests/integration/ap.posting.spec.ts @@ -0,0 +1,235 @@ +/** + * Requires a real, migrated, seeded Postgres database (see SETUP.md) reachable via DATABASE_URL. + * Run with: npm run test:integration + */ +import { PrismaClient } from '@prisma/client'; +import * as apInvoicesService from '../../src/modules/ap/apInvoices.service'; +import * as apDebitNotesService from '../../src/modules/ap/apDebitNotes.service'; +import * as apPaymentsService from '../../src/modules/ap/apPayments.service'; +import { APAllocationError, APDocumentStateError } from '../../src/modules/ap/ap.errors'; + +const prisma = new PrismaClient(); + +async function getAccount(accountCode: string) { + return prisma.gLAccount.findUniqueOrThrow({ where: { accountCode } }); +} + +describe('Accounts Payable — posting and allocation (real DB)', () => { + let adminId: number; + let branchHQId: number; + let apAccount: { id: number }; + let expenseAccount: { id: number }; + let inputTaxAccount: { id: number }; + let bankAccount: { id: number }; + let supplierId: number; + let stdTaxCodeId: number; + + beforeAll(async () => { + const admin = await prisma.user.findUniqueOrThrow({ where: { email: 'joosth2002@icloud.com' } }); + adminId = admin.id; + + apAccount = await getAccount('2000-000-000-HQ'); + expenseAccount = await getAccount('5100-000-000-HQ'); + inputTaxAccount = await getAccount('2200-000-000-HQ'); + bankAccount = await getAccount('1000-000-000-HQ'); + + const hqSegmentValue = await prisma.accountSegmentValue.findFirstOrThrow({ + where: { code: 'HQ', segmentDef: { isBranchSegment: true } }, + }); + branchHQId = hqSegmentValue.id; + + const stdTaxCode = await prisma.taxCode.findUniqueOrThrow({ where: { code: 'STD' } }); + stdTaxCodeId = stdTaxCode.id; + + const supplier = await prisma.supplier.create({ + data: { + code: `AP-TEST-${Date.now()}`, + name: 'Integration Test Supplier', + branchSegmentValueId: branchHQId, + }, + }); + supplierId = supplier.id; + }); + + afterAll(async () => { + await prisma.$disconnect(); + }); + + it('creates a draft invoice with computed tax and does not touch the GL', async () => { + const beforeJournalCount = await prisma.journalEntry.count(); + + const invoice = await apInvoicesService.createInvoiceDraft( + { + supplierId, + invoiceDate: '2026-03-01', + dueDate: '2026-03-31', + lines: [ + { description: 'Office supplies', quantity: 10, unitPrice: 100, expenseGLAccountId: expenseAccount.id, taxCodeId: stdTaxCodeId }, + { description: 'Zero-rated service', quantity: 1, unitPrice: 50, expenseGLAccountId: expenseAccount.id }, + ], + }, + adminId, + ); + + expect(invoice.status).toBe('DRAFT'); + expect(invoice.subtotal.toString()).toBe('1050'); + expect(invoice.taxTotal.toString()).toBe('150'); + expect(invoice.total.toString()).toBe('1200'); + expect(invoice.balance.toString()).toBe('1200'); + + const afterJournalCount = await prisma.journalEntry.count(); + expect(afterJournalCount).toBe(beforeJournalCount); + }); + + it('posts a supplier invoice to a balanced GL entry: Dr Expense + Dr Input Tax / Cr AP Control', async () => { + const draft = await apInvoicesService.createInvoiceDraft( + { + supplierId, + invoiceDate: '2026-03-05', + dueDate: '2026-04-04', + lines: [{ description: 'Consulting', quantity: 2, unitPrice: 500, expenseGLAccountId: expenseAccount.id, taxCodeId: stdTaxCodeId }], + }, + adminId, + ); + + const posted = await apInvoicesService.postInvoice(draft.id, adminId); + expect(posted.status).toBe('POSTED'); + expect(posted.journalEntryId).not.toBeNull(); + + const entry = await prisma.journalEntry.findUniqueOrThrow({ + where: { id: posted.journalEntryId! }, + include: { lines: true }, + }); + expect(entry.totalDebits.toString()).toBe(entry.totalCredits.toString()); + expect(entry.sourceModule).toBe('AP'); + expect(entry.sourceType).toBe('APInvoice'); + expect(entry.sourceId).toBe(posted.id); + + const apLine = entry.lines.find((line) => line.glAccountId === apAccount.id); + const expenseLine = entry.lines.find((line) => line.glAccountId === expenseAccount.id); + const taxLine = entry.lines.find((line) => line.glAccountId === inputTaxAccount.id); + expect(apLine?.credit.toString()).toBe('1150'); + expect(expenseLine?.debit.toString()).toBe('1000'); + expect(taxLine?.debit.toString()).toBe('150'); + expect(apLine?.apInvoiceId).toBe(posted.id); + }); + + it('rejects posting the same invoice twice', async () => { + const draft = await apInvoicesService.createInvoiceDraft( + { supplierId, invoiceDate: '2026-03-06', dueDate: '2026-04-05', lines: [{ description: 'X', quantity: 1, unitPrice: 10, expenseGLAccountId: expenseAccount.id }] }, + adminId, + ); + await apInvoicesService.postInvoice(draft.id, adminId); + await expect(apInvoicesService.postInvoice(draft.id, adminId)).rejects.toBeInstanceOf(APDocumentStateError); + }); + + it('posts a payment (Dr AP Control / Cr Bank) and allocates it against an open invoice', async () => { + const invoiceDraft = await apInvoicesService.createInvoiceDraft( + { supplierId, invoiceDate: '2026-03-10', dueDate: '2026-04-09', lines: [{ description: 'Goods', quantity: 1, unitPrice: 300, expenseGLAccountId: expenseAccount.id }] }, + adminId, + ); + const invoice = await apInvoicesService.postInvoice(invoiceDraft.id, adminId); + expect(invoice.balance.toString()).toBe('300'); + + const paymentDraft = await apPaymentsService.createPaymentDraft( + { supplierId, paymentDate: '2026-03-15', amount: 300, bankGLAccountId: bankAccount.id }, + adminId, + ); + const payment = await apPaymentsService.postPayment(paymentDraft.id, adminId); + expect(payment.status).toBe('POSTED'); + + const entry = await prisma.journalEntry.findUniqueOrThrow({ where: { id: payment.journalEntryId! }, include: { lines: true } }); + const apLine = entry.lines.find((line) => line.glAccountId === apAccount.id); + const bankLine = entry.lines.find((line) => line.glAccountId === bankAccount.id); + expect(apLine?.debit.toString()).toBe('300'); + expect(bankLine?.credit.toString()).toBe('300'); + + await apPaymentsService.allocatePayment(payment.id, [{ invoiceId: invoice.id, amount: 300 }]); + + const invoiceAfter = await prisma.aPInvoice.findUniqueOrThrow({ where: { id: invoice.id } }); + const paymentAfter = await prisma.aPPayment.findUniqueOrThrow({ where: { id: payment.id } }); + expect(invoiceAfter.balance.toString()).toBe('0'); + expect(paymentAfter.unallocatedAmount.toString()).toBe('0'); + }); + + it('rejects an allocation that exceeds the invoice balance', async () => { + const invoiceDraft = await apInvoicesService.createInvoiceDraft( + { supplierId, invoiceDate: '2026-03-11', dueDate: '2026-04-10', lines: [{ description: 'Goods', quantity: 1, unitPrice: 50, expenseGLAccountId: expenseAccount.id }] }, + adminId, + ); + const invoice = await apInvoicesService.postInvoice(invoiceDraft.id, adminId); + + const paymentDraft = await apPaymentsService.createPaymentDraft( + { supplierId, paymentDate: '2026-03-16', amount: 200, bankGLAccountId: bankAccount.id }, + adminId, + ); + const payment = await apPaymentsService.postPayment(paymentDraft.id, adminId); + + await expect(apPaymentsService.allocatePayment(payment.id, [{ invoiceId: invoice.id, amount: 200 }])).rejects.toBeInstanceOf( + APAllocationError, + ); + + const invoiceAfter = await prisma.aPInvoice.findUniqueOrThrow({ where: { id: invoice.id } }); + expect(invoiceAfter.balance.toString()).toBe('50'); + }); + + it('posts a debit note as the reverse of an invoice and allocates it against the invoice', async () => { + const invoiceDraft = await apInvoicesService.createInvoiceDraft( + { + supplierId, + invoiceDate: '2026-03-12', + dueDate: '2026-04-11', + lines: [{ description: 'Faulty goods', quantity: 1, unitPrice: 100, expenseGLAccountId: expenseAccount.id, taxCodeId: stdTaxCodeId }], + }, + adminId, + ); + const invoice = await apInvoicesService.postInvoice(invoiceDraft.id, adminId); + expect(invoice.total.toString()).toBe('115'); + + const debitNoteDraft = await apDebitNotesService.createDebitNoteDraft( + { + supplierId, + debitNoteDate: '2026-03-13', + reason: 'Return', + lines: [{ description: 'Faulty goods', quantity: 1, unitPrice: 100, expenseGLAccountId: expenseAccount.id, taxCodeId: stdTaxCodeId }], + }, + adminId, + ); + const debitNote = await apDebitNotesService.postDebitNote(debitNoteDraft.id, adminId); + expect(debitNote.total.toString()).toBe('115'); + + const entry = await prisma.journalEntry.findUniqueOrThrow({ where: { id: debitNote.journalEntryId! }, include: { lines: true } }); + expect(entry.totalDebits.toString()).toBe(entry.totalCredits.toString()); + const apLine = entry.lines.find((line) => line.glAccountId === apAccount.id); + const expenseLine = entry.lines.find((line) => line.glAccountId === expenseAccount.id); + expect(apLine?.debit.toString()).toBe('115'); + expect(expenseLine?.credit.toString()).toBe('100'); + + await apDebitNotesService.allocateDebitNote(debitNote.id, [{ invoiceId: invoice.id, amount: 115 }]); + + const invoiceAfter = await prisma.aPInvoice.findUniqueOrThrow({ where: { id: invoice.id } }); + const debitNoteAfter = await prisma.aPDebitNote.findUniqueOrThrow({ where: { id: debitNote.id } }); + expect(invoiceAfter.balance.toString()).toBe('0'); + expect(debitNoteAfter.balance.toString()).toBe('0'); + }); + + it('voids a draft invoice without touching the GL, and refuses to void a posted one', async () => { + const draft = await apInvoicesService.createInvoiceDraft( + { supplierId, invoiceDate: '2026-03-14', dueDate: '2026-04-13', lines: [{ description: 'X', quantity: 1, unitPrice: 10, expenseGLAccountId: expenseAccount.id }] }, + adminId, + ); + const voided = await apInvoicesService.voidInvoiceDraft(draft.id); + expect(voided.status).toBe('VOID'); + + const posted = await apInvoicesService.postInvoice( + ( + await apInvoicesService.createInvoiceDraft( + { supplierId, invoiceDate: '2026-03-14', dueDate: '2026-04-13', lines: [{ description: 'X', quantity: 1, unitPrice: 10, expenseGLAccountId: expenseAccount.id }] }, + adminId, + ) + ).id, + adminId, + ); + await expect(apInvoicesService.voidInvoiceDraft(posted.id)).rejects.toBeInstanceOf(APDocumentStateError); + }); +}); diff --git a/tests/integration/ar.posting.spec.ts b/tests/integration/ar.posting.spec.ts new file mode 100644 index 0000000..fd69940 --- /dev/null +++ b/tests/integration/ar.posting.spec.ts @@ -0,0 +1,235 @@ +/** + * Requires a real, migrated, seeded Postgres database (see SETUP.md) reachable via DATABASE_URL. + * Run with: npm run test:integration + */ +import { PrismaClient } from '@prisma/client'; +import * as arInvoicesService from '../../src/modules/ar/arInvoices.service'; +import * as arCreditNotesService from '../../src/modules/ar/arCreditNotes.service'; +import * as arReceiptsService from '../../src/modules/ar/arReceipts.service'; +import { ARAllocationError, ARDocumentStateError } from '../../src/modules/ar/ar.errors'; + +const prisma = new PrismaClient(); + +async function getAccount(accountCode: string) { + return prisma.gLAccount.findUniqueOrThrow({ where: { accountCode } }); +} + +describe('Accounts Receivable — posting and allocation (real DB)', () => { + let adminId: number; + let branchHQId: number; + let arAccount: { id: number }; + let salesAccount: { id: number }; + let taxAccount: { id: number }; + let bankAccount: { id: number }; + let customerId: number; + let stdTaxCodeId: number; + + beforeAll(async () => { + const admin = await prisma.user.findUniqueOrThrow({ where: { email: 'joosth2002@icloud.com' } }); + adminId = admin.id; + + arAccount = await getAccount('1100-000-000-HQ'); + salesAccount = await getAccount('4000-000-000-HQ'); + taxAccount = await getAccount('2100-000-000-HQ'); + bankAccount = await getAccount('1000-000-000-HQ'); + + const hqSegmentValue = await prisma.accountSegmentValue.findFirstOrThrow({ + where: { code: 'HQ', segmentDef: { isBranchSegment: true } }, + }); + branchHQId = hqSegmentValue.id; + + const stdTaxCode = await prisma.taxCode.findUniqueOrThrow({ where: { code: 'STD' } }); + stdTaxCodeId = stdTaxCode.id; + + const customer = await prisma.customer.create({ + data: { + code: `AR-TEST-${Date.now()}`, + name: 'Integration Test Customer', + branchSegmentValueId: branchHQId, + }, + }); + customerId = customer.id; + }); + + afterAll(async () => { + await prisma.$disconnect(); + }); + + it('creates a draft invoice with computed tax and does not touch the GL', async () => { + const beforeJournalCount = await prisma.journalEntry.count(); + + const invoice = await arInvoicesService.createInvoiceDraft( + { + customerId, + invoiceDate: '2026-03-01', + dueDate: '2026-03-31', + lines: [ + { description: 'Widgets', quantity: 10, unitPrice: 100, revenueGLAccountId: salesAccount.id, taxCodeId: stdTaxCodeId }, + { description: 'Zero-rated service', quantity: 1, unitPrice: 50, revenueGLAccountId: salesAccount.id }, + ], + }, + adminId, + ); + + expect(invoice.status).toBe('DRAFT'); + expect(invoice.subtotal.toString()).toBe('1050'); + expect(invoice.taxTotal.toString()).toBe('150'); // 15% of 1000, zero-rated line contributes 0 + expect(invoice.total.toString()).toBe('1200'); + expect(invoice.balance.toString()).toBe('1200'); + + const afterJournalCount = await prisma.journalEntry.count(); + expect(afterJournalCount).toBe(beforeJournalCount); + }); + + it('posts an invoice to a balanced GL entry: Dr AR = total, Cr Sales = subtotal, Cr Output Tax = tax', async () => { + const draft = await arInvoicesService.createInvoiceDraft( + { + customerId, + invoiceDate: '2026-03-05', + dueDate: '2026-04-04', + lines: [{ description: 'Consulting', quantity: 2, unitPrice: 500, revenueGLAccountId: salesAccount.id, taxCodeId: stdTaxCodeId }], + }, + adminId, + ); + + const posted = await arInvoicesService.postInvoice(draft.id, adminId); + expect(posted.status).toBe('POSTED'); + expect(posted.journalEntryId).not.toBeNull(); + + const entry = await prisma.journalEntry.findUniqueOrThrow({ + where: { id: posted.journalEntryId! }, + include: { lines: true }, + }); + expect(entry.totalDebits.toString()).toBe(entry.totalCredits.toString()); + expect(entry.sourceModule).toBe('AR'); + expect(entry.sourceType).toBe('ARInvoice'); + expect(entry.sourceId).toBe(posted.id); + + const arLine = entry.lines.find((line) => line.glAccountId === arAccount.id); + const salesLine = entry.lines.find((line) => line.glAccountId === salesAccount.id); + const taxLine = entry.lines.find((line) => line.glAccountId === taxAccount.id); + expect(arLine?.debit.toString()).toBe('1150'); + expect(salesLine?.credit.toString()).toBe('1000'); + expect(taxLine?.credit.toString()).toBe('150'); + expect(arLine?.arInvoiceId).toBe(posted.id); + }); + + it('rejects posting the same invoice twice', async () => { + const draft = await arInvoicesService.createInvoiceDraft( + { customerId, invoiceDate: '2026-03-06', dueDate: '2026-04-05', lines: [{ description: 'X', quantity: 1, unitPrice: 10, revenueGLAccountId: salesAccount.id }] }, + adminId, + ); + await arInvoicesService.postInvoice(draft.id, adminId); + await expect(arInvoicesService.postInvoice(draft.id, adminId)).rejects.toBeInstanceOf(ARDocumentStateError); + }); + + it('posts a receipt (Dr Bank / Cr AR) and allocates it against an open invoice', async () => { + const invoiceDraft = await arInvoicesService.createInvoiceDraft( + { customerId, invoiceDate: '2026-03-10', dueDate: '2026-04-09', lines: [{ description: 'Goods', quantity: 1, unitPrice: 300, revenueGLAccountId: salesAccount.id }] }, + adminId, + ); + const invoice = await arInvoicesService.postInvoice(invoiceDraft.id, adminId); + expect(invoice.balance.toString()).toBe('300'); + + const receiptDraft = await arReceiptsService.createReceiptDraft( + { customerId, receiptDate: '2026-03-15', amount: 300, bankGLAccountId: bankAccount.id }, + adminId, + ); + const receipt = await arReceiptsService.postReceipt(receiptDraft.id, adminId); + expect(receipt.status).toBe('POSTED'); + + const entry = await prisma.journalEntry.findUniqueOrThrow({ where: { id: receipt.journalEntryId! }, include: { lines: true } }); + const bankLine = entry.lines.find((line) => line.glAccountId === bankAccount.id); + const arLine = entry.lines.find((line) => line.glAccountId === arAccount.id); + expect(bankLine?.debit.toString()).toBe('300'); + expect(arLine?.credit.toString()).toBe('300'); + + await arReceiptsService.allocateReceipt(receipt.id, [{ invoiceId: invoice.id, amount: 300 }]); + + const invoiceAfter = await prisma.aRInvoice.findUniqueOrThrow({ where: { id: invoice.id } }); + const receiptAfter = await prisma.aRReceipt.findUniqueOrThrow({ where: { id: receipt.id } }); + expect(invoiceAfter.balance.toString()).toBe('0'); + expect(receiptAfter.unallocatedAmount.toString()).toBe('0'); + }); + + it('rejects an allocation that exceeds the invoice balance', async () => { + const invoiceDraft = await arInvoicesService.createInvoiceDraft( + { customerId, invoiceDate: '2026-03-11', dueDate: '2026-04-10', lines: [{ description: 'Goods', quantity: 1, unitPrice: 50, revenueGLAccountId: salesAccount.id }] }, + adminId, + ); + const invoice = await arInvoicesService.postInvoice(invoiceDraft.id, adminId); + + const receiptDraft = await arReceiptsService.createReceiptDraft( + { customerId, receiptDate: '2026-03-16', amount: 200, bankGLAccountId: bankAccount.id }, + adminId, + ); + const receipt = await arReceiptsService.postReceipt(receiptDraft.id, adminId); + + await expect(arReceiptsService.allocateReceipt(receipt.id, [{ invoiceId: invoice.id, amount: 200 }])).rejects.toBeInstanceOf( + ARAllocationError, + ); + + const invoiceAfter = await prisma.aRInvoice.findUniqueOrThrow({ where: { id: invoice.id } }); + expect(invoiceAfter.balance.toString()).toBe('50'); + }); + + it('posts a credit note as the reverse of an invoice and allocates it against the invoice', async () => { + const invoiceDraft = await arInvoicesService.createInvoiceDraft( + { + customerId, + invoiceDate: '2026-03-12', + dueDate: '2026-04-11', + lines: [{ description: 'Faulty goods', quantity: 1, unitPrice: 100, revenueGLAccountId: salesAccount.id, taxCodeId: stdTaxCodeId }], + }, + adminId, + ); + const invoice = await arInvoicesService.postInvoice(invoiceDraft.id, adminId); + expect(invoice.total.toString()).toBe('115'); + + const creditNoteDraft = await arCreditNotesService.createCreditNoteDraft( + { + customerId, + creditNoteDate: '2026-03-13', + reason: 'Return', + lines: [{ description: 'Faulty goods', quantity: 1, unitPrice: 100, revenueGLAccountId: salesAccount.id, taxCodeId: stdTaxCodeId }], + }, + adminId, + ); + const creditNote = await arCreditNotesService.postCreditNote(creditNoteDraft.id, adminId); + expect(creditNote.total.toString()).toBe('115'); + + const entry = await prisma.journalEntry.findUniqueOrThrow({ where: { id: creditNote.journalEntryId! }, include: { lines: true } }); + expect(entry.totalDebits.toString()).toBe(entry.totalCredits.toString()); + const arLine = entry.lines.find((line) => line.glAccountId === arAccount.id); + const salesLine = entry.lines.find((line) => line.glAccountId === salesAccount.id); + expect(arLine?.credit.toString()).toBe('115'); + expect(salesLine?.debit.toString()).toBe('100'); + + await arCreditNotesService.allocateCreditNote(creditNote.id, [{ invoiceId: invoice.id, amount: 115 }]); + + const invoiceAfter = await prisma.aRInvoice.findUniqueOrThrow({ where: { id: invoice.id } }); + const creditNoteAfter = await prisma.aRCreditNote.findUniqueOrThrow({ where: { id: creditNote.id } }); + expect(invoiceAfter.balance.toString()).toBe('0'); + expect(creditNoteAfter.balance.toString()).toBe('0'); + }); + + it('voids a draft invoice without touching the GL, and refuses to void a posted one', async () => { + const draft = await arInvoicesService.createInvoiceDraft( + { customerId, invoiceDate: '2026-03-14', dueDate: '2026-04-13', lines: [{ description: 'X', quantity: 1, unitPrice: 10, revenueGLAccountId: salesAccount.id }] }, + adminId, + ); + const voided = await arInvoicesService.voidInvoiceDraft(draft.id); + expect(voided.status).toBe('VOID'); + + const posted = await arInvoicesService.postInvoice( + ( + await arInvoicesService.createInvoiceDraft( + { customerId, invoiceDate: '2026-03-14', dueDate: '2026-04-13', lines: [{ description: 'X', quantity: 1, unitPrice: 10, revenueGLAccountId: salesAccount.id }] }, + adminId, + ) + ).id, + adminId, + ); + await expect(arInvoicesService.voidInvoiceDraft(posted.id)).rejects.toBeInstanceOf(ARDocumentStateError); + }); +}); diff --git a/tests/integration/handoff.spec.ts b/tests/integration/handoff.spec.ts new file mode 100644 index 0000000..9baa919 --- /dev/null +++ b/tests/integration/handoff.spec.ts @@ -0,0 +1,82 @@ +/** + * Requires the real, migrated, seeded company-app database (see SETUP.md) reachable via + * DATABASE_URL, and the Manager's real handoff keypair at ../manager/keys/ (see + * manager/SETUP.md — npm run generate-handoff-keys). Run with: npm run test:integration + */ +import fs from 'fs'; +import path from 'path'; +import jwt from 'jsonwebtoken'; +import crypto from 'crypto'; +import request from 'supertest'; +import { createApp } from '../../src/app'; +import { prisma } from '../../src/lib/prisma'; + +const app = createApp(); +const managerPrivateKey = fs.readFileSync(path.resolve(__dirname, '../../manager/keys/handoff-private.pem'), 'utf8'); + +const ADMIN_EMAIL = 'joosth2002@icloud.com'; + +function mintHandoffToken(overrides: Partial<{ sub: string; companySlug: string; expiresIn: number }> = {}) { + const claims = { sub: overrides.sub ?? ADMIN_EMAIL, pid: 1, cid: 1, companySlug: overrides.companySlug ?? 'demo' }; + return jwt.sign(claims, managerPrivateKey, { + algorithm: 'RS256', + expiresIn: overrides.expiresIn ?? 90, + jwtid: crypto.randomUUID(), + }); +} + +describe('Company app — handoff token exchange (real DB, real keypair)', () => { + afterAll(async () => { + await prisma.$disconnect(); + }); + + it('exchanges a valid handoff token for a working session', async () => { + const token = mintHandoffToken(); + const response = await request(app).post('/api/auth/handoff').send({ token }); + expect(response.status).toBe(200); + expect(response.body.accessToken).toBeDefined(); + expect(response.body.user.email).toBe(ADMIN_EMAIL); + + const me = await request(app).get('/api/auth/me').set('Authorization', `Bearer ${response.body.accessToken}`); + expect(me.status).toBe(200); + expect(me.body.user.email).toBe(ADMIN_EMAIL); + }); + + it('rejects the same token twice (single-use / replay protection)', async () => { + const token = mintHandoffToken(); + const first = await request(app).post('/api/auth/handoff').send({ token }); + expect(first.status).toBe(200); + + const second = await request(app).post('/api/auth/handoff').send({ token }); + expect(second.status).toBe(401); + expect(second.body.error).toMatch(/already been used/i); + }); + + it('rejects a token minted for a different company slug', async () => { + const token = mintHandoffToken({ companySlug: 'some-other-company' }); + const response = await request(app).post('/api/auth/handoff').send({ token }); + expect(response.status).toBe(401); + expect(response.body.error).toMatch(/not issued for this company/i); + }); + + it('rejects an expired token', async () => { + const token = mintHandoffToken({ expiresIn: -10 }); + const response = await request(app).post('/api/auth/handoff').send({ token }); + expect(response.status).toBe(401); + }); + + it('rejects a well-formed but unsigned/forged token', async () => { + const forged = jwt.sign({ sub: ADMIN_EMAIL, pid: 1, cid: 1, companySlug: 'demo' }, 'not-the-real-key', { + algorithm: 'HS256', + expiresIn: 90, + jwtid: crypto.randomUUID(), + }); + const response = await request(app).post('/api/auth/handoff').send({ token: forged }); + expect(response.status).toBe(401); + }); + + it('the old POST /api/auth/login route no longer exists', async () => { + const response = await request(app).post('/api/auth/login').send({ email: 'x', password: 'y' }); + expect(response.status).toBe(404); + }); +}); diff --git a/tests/integration/posting.balance.spec.ts b/tests/integration/posting.balance.spec.ts new file mode 100644 index 0000000..1ce9c62 --- /dev/null +++ b/tests/integration/posting.balance.spec.ts @@ -0,0 +1,126 @@ +/** + * Requires a real, migrated, seeded Postgres database (see SETUP.md) reachable via DATABASE_URL. + * Run with: npm run test:integration + */ +import { PrismaClient } from '@prisma/client'; +import { PostingService } from '../../src/modules/gl/posting.service'; +import { UnbalancedEntryError } from '../../src/modules/gl/posting.types'; + +const prisma = new PrismaClient(); + +async function getAccount(accountCode: string) { + return prisma.gLAccount.findUniqueOrThrow({ where: { accountCode } }); +} + +describe('PostingService — double-entry balance invariant (real DB)', () => { + let adminId: number; + let bankHQ: { id: number }; + let salesHQ: { id: number }; + + beforeAll(async () => { + const admin = await prisma.user.findUniqueOrThrow({ where: { email: 'joosth2002@icloud.com' } }); + adminId = admin.id; + bankHQ = await getAccount('1000-000-000-HQ'); + salesHQ = await getAccount('4000-000-000-HQ'); + }); + + afterAll(async () => { + await prisma.$disconnect(); + }); + + it('posts a balanced entry and persists matching totals', async () => { + const entry = await PostingService.postEntry({ + journalCode: 'GJ', + entryDate: new Date(), + description: 'Integration test — balanced entry', + sourceModule: 'GL', + sourceType: 'IntegrationTest', + createdById: adminId, + lines: [ + { glAccountId: bankHQ.id, debit: 250, credit: 0 }, + { glAccountId: salesHQ.id, debit: 0, credit: 250 }, + ], + }); + + expect(entry.totalDebits.toString()).toBe('250'); + expect(entry.totalCredits.toString()).toBe('250'); + + const lines = await prisma.journalEntryLine.findMany({ where: { journalEntryId: entry.id } }); + const totalDebits = lines.reduce((sum, line) => sum + Number(line.debit), 0); + const totalCredits = lines.reduce((sum, line) => sum + Number(line.credit), 0); + expect(totalDebits).toBe(totalCredits); + }); + + it('rejects an unbalanced entry via the application layer and writes nothing', async () => { + const before = await prisma.journalEntry.count(); + + await expect( + PostingService.postEntry({ + journalCode: 'GJ', + entryDate: new Date(), + description: 'Integration test — unbalanced entry', + sourceModule: 'GL', + sourceType: 'IntegrationTest', + createdById: adminId, + lines: [ + { glAccountId: bankHQ.id, debit: 100, credit: 0 }, + { glAccountId: salesHQ.id, debit: 0, credit: 40 }, + ], + }), + ).rejects.toBeInstanceOf(UnbalancedEntryError); + + const after = await prisma.journalEntry.count(); + expect(after).toBe(before); + }); + + it('rejects an unbalanced write at the database layer even bypassing PostingService', async () => { + // Prove Layer 3 (the deferred trigger) is the real backstop: attempt to insert an + // unbalanced JournalEntryLine set directly via raw SQL, bypassing the service entirely. + // + // Note: with Prisma's interactive transactions, a commit failure caused by a DEFERRED + // constraint trigger is not always surfaced as a rejected promise (observed with + // @prisma/client 5.22 — the engine logs "transaction failed to commit" and correctly + // rolls back at the database level, but the JS promise can still resolve). So the + // authoritative assertion here is "nothing persisted", checked directly against the + // database after the attempt — not whether the promise rejected. + const marker = `TRIGGER-TEST-${Date.now()}`; + + try { + await prisma.$transaction(async (tx) => { + const entry = await tx.journalEntry.create({ + data: { + entryNumber: marker, + journalId: (await tx.journal.findUniqueOrThrow({ where: { code: 'GJ' } })).id, + fiscalPeriodId: ( + await tx.fiscalPeriod.findFirstOrThrow({ where: { status: 'OPEN' } }) + ).id, + entryDate: new Date(), + description: 'Trigger bypass attempt — must be rejected at commit', + sourceModule: 'GL', + status: 'POSTED', + totalDebits: 100, + totalCredits: 100, + createdById: adminId, + }, + }); + await tx.$executeRawUnsafe( + `INSERT INTO "JournalEntryLine" ("journalEntryId", "lineNumber", "glAccountId", debit, credit, "currencyCode", "exchangeRateToBase") + VALUES ($1, 1, $2, 100, 0, 'BASE', 1)`, + entry.id, + bankHQ.id, + ); + await tx.$executeRawUnsafe( + `INSERT INTO "JournalEntryLine" ("journalEntryId", "lineNumber", "glAccountId", debit, credit, "currencyCode", "exchangeRateToBase") + VALUES ($1, 2, $2, 0, 40, 'BASE', 1)`, + entry.id, + salesHQ.id, + ); + }); + } catch { + // Expected outcome on Prisma versions that do propagate the commit failure — fine either way. + } + + const persisted = await prisma.journalEntry.findUnique({ where: { entryNumber: marker } }); + expect(persisted).toBeNull(); + }); +}); diff --git a/tests/unit/posting.validation.spec.ts b/tests/unit/posting.validation.spec.ts new file mode 100644 index 0000000..22a346f --- /dev/null +++ b/tests/unit/posting.validation.spec.ts @@ -0,0 +1,93 @@ +import { InvalidLineError, UnbalancedEntryError } from '../../src/modules/gl/posting.types'; + +const transactionMock = jest.fn(); + +jest.mock('../../src/lib/prisma', () => ({ + prisma: { $transaction: transactionMock }, +})); + +// eslint-disable-next-line import/first +import { postEntry } from '../../src/modules/gl/posting.service'; + +const baseDraft = { + journalCode: 'GJ', + entryDate: new Date('2026-01-15'), + description: 'Test entry', + sourceModule: 'GL' as const, + createdById: 1, +}; + +describe('PostingService.postEntry — pre-write validation (no DB required)', () => { + beforeEach(() => { + transactionMock.mockReset(); + }); + + it('rejects an unbalanced entry before touching the database', async () => { + await expect( + postEntry({ + ...baseDraft, + lines: [ + { glAccountId: 1, debit: 100, credit: 0 }, + { glAccountId: 2, debit: 0, credit: 50 }, + ], + }), + ).rejects.toBeInstanceOf(UnbalancedEntryError); + expect(transactionMock).not.toHaveBeenCalled(); + }); + + it('rejects a line with both debit and credit set', async () => { + await expect( + postEntry({ + ...baseDraft, + lines: [ + { glAccountId: 1, debit: 100, credit: 100 }, + { glAccountId: 2, debit: 0, credit: 0 }, + ], + }), + ).rejects.toBeInstanceOf(InvalidLineError); + expect(transactionMock).not.toHaveBeenCalled(); + }); + + it('rejects a line with neither debit nor credit set', async () => { + await expect( + postEntry({ + ...baseDraft, + lines: [ + { glAccountId: 1, debit: 0, credit: 0 }, + { glAccountId: 2, debit: 100, credit: 100 }, + ], + }), + ).rejects.toBeInstanceOf(InvalidLineError); + expect(transactionMock).not.toHaveBeenCalled(); + }); + + it('rejects a negative amount', async () => { + await expect( + postEntry({ + ...baseDraft, + lines: [ + { glAccountId: 1, debit: -50, credit: 0 }, + { glAccountId: 2, debit: 0, credit: -50 }, + ], + }), + ).rejects.toBeInstanceOf(InvalidLineError); + expect(transactionMock).not.toHaveBeenCalled(); + }); + + it('rejects an entry with no lines', async () => { + await expect(postEntry({ ...baseDraft, lines: [] })).rejects.toBeInstanceOf(InvalidLineError); + expect(transactionMock).not.toHaveBeenCalled(); + }); + + it('proceeds to the DB transaction once a balanced, valid draft is given', async () => { + transactionMock.mockResolvedValue({ id: 1 }); + await postEntry({ + ...baseDraft, + lines: [ + { glAccountId: 1, debit: 100, credit: 0 }, + { glAccountId: 2, debit: 0, credit: 100 }, + ], + }); + expect(transactionMock).toHaveBeenCalledTimes(1); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6d5aa8e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node", + "lib": ["ES2022"], + "outDir": "dist", + "rootDir": ".", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": false, + "sourceMap": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*.ts", "prisma/seed.ts", "scripts/**/*.ts"], + "exclude": ["node_modules", "dist", "client"] +}

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%0A!hB0`n(P+4ZzPw=)aXTL=r03h?fpm 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 z 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 z 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­P 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