@accounter/server 0.0.9-alpha-20251231083050-a0e737863ca2a9fa68506d15357e55d9287972cb → 0.0.9-alpha-20251231163357-33d4c33fec5e21dad2e04d1f293f6248d2550588

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +27 -5
  2. package/README.md +66 -3
  3. package/dist/server/scripts/seed-admin-context.js +20 -25
  4. package/dist/server/scripts/seed-admin-context.js.map +1 -1
  5. package/dist/server/src/__tests__/db-bootstrap.test.js +7 -2
  6. package/dist/server/src/__tests__/db-bootstrap.test.js.map +1 -1
  7. package/dist/server/src/__tests__/factories/business.d.ts +1 -1
  8. package/dist/server/src/__tests__/factories/financial-account.d.ts +1 -1
  9. package/dist/server/src/__tests__/factories/index.test.js +1 -0
  10. package/dist/server/src/__tests__/factories/index.test.js.map +1 -1
  11. package/dist/server/src/__tests__/factories/tax-category.d.ts +1 -1
  12. package/dist/server/src/__tests__/factories/tax-category.js +1 -1
  13. package/dist/server/src/__tests__/factories/tax-category.js.map +1 -1
  14. package/dist/server/src/__tests__/factories/tax-category.test.js +8 -6
  15. package/dist/server/src/__tests__/factories/tax-category.test.js.map +1 -1
  16. package/dist/server/src/__tests__/helpers/fixture-loader.d.ts +1 -1
  17. package/dist/server/src/__tests__/helpers/fixture-loader.js +25 -52
  18. package/dist/server/src/__tests__/helpers/fixture-loader.js.map +1 -1
  19. package/dist/server/src/__tests__/helpers/migration-verification.d.ts +1 -1
  20. package/dist/server/src/__tests__/helpers/migration-verification.js.map +1 -1
  21. package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js +4 -4
  22. package/dist/server/src/__tests__/helpers/seed-helpers.business.test.js.map +1 -1
  23. package/dist/server/src/__tests__/helpers/seed-helpers.d.ts +9 -9
  24. package/dist/server/src/__tests__/helpers/seed-helpers.js +57 -54
  25. package/dist/server/src/__tests__/helpers/seed-helpers.js.map +1 -1
  26. package/dist/server/src/__tests__/seed-admin-context.integration.test.js +2 -1
  27. package/dist/server/src/__tests__/seed-admin-context.integration.test.js.map +1 -1
  28. package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js +3 -2
  29. package/dist/server/src/demo-fixtures/__tests__/deterministic-uuid.test.js.map +1 -1
  30. package/dist/server/src/demo-fixtures/__tests__/seed-and-validate.test.d.ts +1 -0
  31. package/dist/server/src/demo-fixtures/__tests__/seed-and-validate.test.js +69 -0
  32. package/dist/server/src/demo-fixtures/__tests__/seed-and-validate.test.js.map +1 -0
  33. package/dist/server/src/demo-fixtures/__tests__/use-case-registry.test.d.ts +1 -0
  34. package/dist/server/src/demo-fixtures/__tests__/use-case-registry.test.js +26 -0
  35. package/dist/server/src/demo-fixtures/__tests__/use-case-registry.test.js.map +1 -0
  36. package/dist/server/src/demo-fixtures/helpers/admin-context.d.ts +10 -0
  37. package/dist/server/src/demo-fixtures/helpers/admin-context.js +40 -0
  38. package/dist/server/src/demo-fixtures/helpers/admin-context.js.map +1 -0
  39. package/dist/server/src/demo-fixtures/helpers/placeholder.d.ts +45 -0
  40. package/dist/server/src/demo-fixtures/helpers/placeholder.js +50 -0
  41. package/dist/server/src/demo-fixtures/helpers/placeholder.js.map +1 -0
  42. package/dist/server/src/demo-fixtures/helpers/seed-exchange-rates.d.ts +21 -0
  43. package/dist/server/src/demo-fixtures/helpers/seed-exchange-rates.js +26 -0
  44. package/dist/server/src/demo-fixtures/helpers/seed-exchange-rates.js.map +1 -0
  45. package/dist/server/src/demo-fixtures/helpers/seed-vat.d.ts +20 -0
  46. package/dist/server/src/demo-fixtures/helpers/seed-vat.js +30 -0
  47. package/dist/server/src/demo-fixtures/helpers/seed-vat.js.map +1 -0
  48. package/dist/server/src/demo-fixtures/use-cases/equity/shareholder-dividend.d.ts +9 -0
  49. package/dist/server/src/demo-fixtures/use-cases/equity/shareholder-dividend.js +86 -0
  50. package/dist/server/src/demo-fixtures/use-cases/equity/shareholder-dividend.js.map +1 -0
  51. package/dist/server/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.d.ts +12 -0
  52. package/dist/server/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.js +375 -0
  53. package/dist/server/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.js.map +1 -0
  54. package/dist/server/src/demo-fixtures/use-cases/income/client-payment-with-refund.d.ts +10 -0
  55. package/dist/server/src/demo-fixtures/use-cases/income/client-payment-with-refund.js +113 -0
  56. package/dist/server/src/demo-fixtures/use-cases/income/client-payment-with-refund.js.map +1 -0
  57. package/dist/server/src/demo-fixtures/use-cases/index.d.ts +41 -0
  58. package/dist/server/src/demo-fixtures/use-cases/index.js +50 -0
  59. package/dist/server/src/demo-fixtures/use-cases/index.js.map +1 -0
  60. package/dist/server/src/demo-fixtures/validate-demo-data.d.ts +1 -0
  61. package/dist/server/src/demo-fixtures/validate-demo-data.js +117 -0
  62. package/dist/server/src/demo-fixtures/validate-demo-data.js.map +1 -0
  63. package/dist/server/src/demo-fixtures/validators/ledger-validators.d.ts +349 -0
  64. package/dist/server/src/demo-fixtures/validators/ledger-validators.js +602 -0
  65. package/dist/server/src/demo-fixtures/validators/ledger-validators.js.map +1 -0
  66. package/dist/server/src/demo-fixtures/validators/ledger-validators.test.d.ts +1 -0
  67. package/dist/server/src/demo-fixtures/validators/ledger-validators.test.js +247 -0
  68. package/dist/server/src/demo-fixtures/validators/ledger-validators.test.js.map +1 -0
  69. package/dist/server/src/demo-fixtures/validators/types.d.ts +69 -0
  70. package/dist/server/src/demo-fixtures/validators/types.js +8 -0
  71. package/dist/server/src/demo-fixtures/validators/types.js.map +1 -0
  72. package/dist/server/src/fixtures/fixture-spec.d.ts +146 -0
  73. package/dist/server/src/fixtures/fixture-spec.js +2 -0
  74. package/dist/server/src/fixtures/fixture-spec.js.map +1 -0
  75. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js +4 -0
  76. package/dist/server/src/modules/charges-matcher/__tests__/single-match-integration.test.js.map +1 -1
  77. package/dist/server/src/modules/deel/resolvers/deel.resolvers.js +0 -3
  78. package/dist/server/src/modules/deel/resolvers/deel.resolvers.js.map +1 -1
  79. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js +4 -3
  80. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.js.map +1 -1
  81. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js +5 -3
  82. package/dist/server/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.js.map +1 -1
  83. package/dist/server/src/shared/constants.d.ts +1 -0
  84. package/dist/server/src/shared/constants.js +1 -0
  85. package/dist/server/src/shared/constants.js.map +1 -1
  86. package/dist/server/src/shared/helpers/misc.js +2 -2
  87. package/dist/server/src/shared/helpers/misc.js.map +1 -1
  88. package/docs/demo-staging-guide.md +611 -0
  89. package/package.json +6 -3
  90. package/scripts/seed-admin-context.ts +22 -33
  91. package/src/__tests__/db-bootstrap.test.ts +9 -2
  92. package/src/__tests__/factories/business.ts +1 -1
  93. package/src/__tests__/factories/financial-account.ts +1 -1
  94. package/src/__tests__/factories/index.test.ts +1 -0
  95. package/src/__tests__/factories/tax-category.test.ts +8 -6
  96. package/src/__tests__/factories/tax-category.ts +2 -2
  97. package/src/__tests__/helpers/fixture-loader.ts +26 -61
  98. package/src/__tests__/helpers/migration-verification.ts +2 -2
  99. package/src/__tests__/helpers/seed-helpers.business.test.ts +4 -4
  100. package/src/__tests__/helpers/seed-helpers.ts +66 -75
  101. package/src/__tests__/seed-admin-context.integration.test.ts +2 -1
  102. package/src/demo-fixtures/__tests__/deterministic-uuid.test.ts +3 -2
  103. package/src/demo-fixtures/__tests__/seed-and-validate.test.ts +96 -0
  104. package/src/demo-fixtures/__tests__/use-case-registry.test.ts +27 -0
  105. package/src/demo-fixtures/helpers/admin-context.ts +59 -0
  106. package/src/demo-fixtures/helpers/placeholder.ts +50 -0
  107. package/src/demo-fixtures/helpers/seed-exchange-rates.ts +29 -0
  108. package/src/demo-fixtures/helpers/seed-vat.ts +35 -0
  109. package/src/demo-fixtures/use-cases/equity/shareholder-dividend.ts +88 -0
  110. package/src/demo-fixtures/use-cases/expenses/monthly-expense-foreign-currency.ts +377 -0
  111. package/src/demo-fixtures/use-cases/income/client-payment-with-refund.ts +115 -0
  112. package/src/demo-fixtures/use-cases/index.ts +52 -0
  113. package/src/demo-fixtures/validate-demo-data.ts +153 -0
  114. package/src/demo-fixtures/validators/README.md +190 -0
  115. package/src/demo-fixtures/validators/ledger-validators.test.ts +298 -0
  116. package/src/demo-fixtures/validators/ledger-validators.ts +711 -0
  117. package/src/demo-fixtures/validators/types.ts +83 -0
  118. package/src/fixtures/fixture-spec.ts +158 -0
  119. package/src/modules/charges-matcher/__tests__/single-match-integration.test.ts +6 -0
  120. package/src/modules/deel/resolvers/deel.resolvers.ts +0 -3
  121. package/src/modules/ledger/__tests__/ledger-scenario-a.integration.test.ts +4 -3
  122. package/src/modules/ledger/__tests__/ledger-scenario-b.integration.test.ts +6 -3
  123. package/src/shared/constants.ts +2 -0
  124. package/src/shared/helpers/misc.ts +2 -3
@@ -0,0 +1,83 @@
1
+ /**
2
+ * TypeScript interfaces for ledger validation
3
+ *
4
+ * These types match the database schema from accounter_schema.ledger_records
5
+ * and provide context for comprehensive validation of demo data.
6
+ */
7
+
8
+ /**
9
+ * Ledger record interface matching the database schema
10
+ *
11
+ * Numeric fields are typed as `string | null` because PostgreSQL returns
12
+ * numeric values as strings when queried via pg driver.
13
+ */
14
+ export interface LedgerRecord {
15
+ id: string;
16
+ owner_id: string | null;
17
+ charge_id: string;
18
+
19
+ debit_entity1: string | null;
20
+ debit_foreign_amount1: string | null;
21
+ debit_local_amount1: string | null;
22
+
23
+ credit_entity1: string | null;
24
+ credit_foreign_amount1: string | null;
25
+ credit_local_amount1: string | null;
26
+
27
+ debit_entity2: string | null;
28
+ debit_foreign_amount2: string | null;
29
+ debit_local_amount2: string | null;
30
+
31
+ credit_entity2: string | null;
32
+ credit_foreign_amount2: string | null;
33
+ credit_local_amount2: string | null;
34
+
35
+ currency: string;
36
+ invoice_date: Date;
37
+ value_date: Date;
38
+ description: string | null;
39
+ reference1: string | null;
40
+ locked: boolean;
41
+ }
42
+
43
+ /**
44
+ * Validation context containing configuration for validation rules
45
+ *
46
+ * Used to pass contextual information to validator functions such as
47
+ * which use-case is being validated and what tolerance to use for
48
+ * balance comparisons.
49
+ */
50
+ export interface ValidationContext {
51
+ /** Unique identifier of the use-case being validated */
52
+ useCaseId: string;
53
+
54
+ /** Default local currency (e.g., 'ILS') for foreign currency validation */
55
+ defaultCurrency: string;
56
+
57
+ /** Tolerance for floating-point balance comparisons (e.g., 0.01) */
58
+ tolerance: number;
59
+ }
60
+
61
+ /**
62
+ * Entity balance tracking for multi-record entity-level validation
63
+ *
64
+ * Aggregates debit and credit amounts across all ledger records
65
+ * for a specific financial entity to verify the entity's net
66
+ * position balances correctly.
67
+ */
68
+ export interface EntityBalance {
69
+ /** Financial entity UUID */
70
+ entityId: string;
71
+
72
+ /** Total debit amount in local currency */
73
+ totalDebit: number;
74
+
75
+ /** Total credit amount in local currency */
76
+ totalCredit: number;
77
+
78
+ /** Net balance (totalDebit - totalCredit), should be ~0 */
79
+ netBalance: number;
80
+
81
+ /** Number of ledger records involving this entity */
82
+ recordCount: number;
83
+ }
@@ -0,0 +1,158 @@
1
+ import type { LedgerRecord } from '../demo-fixtures/validators/types.js';
2
+ import type { financial_account_type } from '../modules/financial-accounts/types.js';
3
+ import type { CountryCode, Currency } from '../shared/enums.js';
4
+
5
+ /**
6
+ * Tax Category Mapping for Financial Accounts
7
+ */
8
+ export interface TaxCategoryMapping {
9
+ taxCategoryId: string;
10
+ currency: Currency;
11
+ }
12
+
13
+ /**
14
+ * Business Entity Fixture
15
+ */
16
+ export interface BusinessFixture {
17
+ id: string;
18
+ name: string;
19
+ country: CountryCode;
20
+ canSettleWithReceipt: boolean;
21
+ }
22
+
23
+ /**
24
+ * Tax Category Fixture
25
+ */
26
+ export interface TaxCategoryFixture {
27
+ id: string;
28
+ name: string;
29
+ }
30
+
31
+ /**
32
+ * Financial Account Fixture
33
+ */
34
+ export interface FinancialAccountFixture {
35
+ id: string;
36
+ accountNumber: string;
37
+ type: financial_account_type; // 'BANK_ACCOUNT', 'CREDIT_CARD', etc.
38
+ currency: Currency;
39
+ taxCategoryMappings?: TaxCategoryMapping[];
40
+ }
41
+
42
+ /**
43
+ * Charge Fixture
44
+ */
45
+ export interface ChargeFixture {
46
+ id: string;
47
+ ownerId: string; // Supports {{ADMIN_BUSINESS_ID}} placeholder
48
+ userDescription: string;
49
+ }
50
+
51
+ /**
52
+ * Transaction Fixture
53
+ */
54
+ export interface TransactionFixture {
55
+ id: string;
56
+ chargeId: string;
57
+ businessId: string;
58
+ amount: string; // Decimal as string for precision
59
+ currency: Currency;
60
+ eventDate: string; // ISO date string
61
+ debitDate: string; // ISO date string
62
+ accountNumber: string;
63
+ }
64
+
65
+ /**
66
+ * Document Fixture
67
+ */
68
+ export interface DocumentFixture {
69
+ id: string;
70
+ chargeId: string;
71
+ creditorId: string;
72
+ debtorId: string; // Supports {{ADMIN_BUSINESS_ID}} placeholder
73
+ serialNumber: string;
74
+ type: string; // 'INVOICE', 'RECEIPT', etc.
75
+ date: string; // ISO date string
76
+ totalAmount: string; // Decimal as string
77
+ currencyCode: Currency;
78
+ }
79
+
80
+ /**
81
+ * Tag Fixture (Optional)
82
+ */
83
+ export interface TagFixture {
84
+ id: string;
85
+ name: string;
86
+ description?: string;
87
+ }
88
+
89
+ /**
90
+ * Fixture Collection for a Use-Case
91
+ */
92
+ export interface FixtureSpec {
93
+ businesses: BusinessFixture[];
94
+ taxCategories: TaxCategoryFixture[];
95
+ financialAccounts: FinancialAccountFixture[];
96
+ charges: ChargeFixture[];
97
+ transactions: TransactionFixture[];
98
+ documents: DocumentFixture[];
99
+ tags?: TagFixture[];
100
+ }
101
+
102
+ /**
103
+ * Use-Case Metadata
104
+ */
105
+ export interface UseCaseMetadata {
106
+ author: string;
107
+ createdAt: string; // ISO date string
108
+ updatedAt: string; // ISO date string
109
+ volumeMultiplier?: number; // Optional: Create N instances (default 1)
110
+ }
111
+
112
+ /**
113
+ * Ledger Expectations for Validation
114
+ */
115
+ export interface UseCaseExpectations {
116
+ ledgerRecordCount: number;
117
+ totalDebitILS?: string; // Decimal as string
118
+ totalCreditILS?: string; // Decimal as string
119
+ }
120
+
121
+ /**
122
+ * Use-Case Category
123
+ */
124
+ export type UseCaseCategory = 'expenses' | 'income' | 'equity' | 'payroll' | 'other';
125
+
126
+ /**
127
+ * Complete Use-Case Specification
128
+ */
129
+ export interface UseCaseSpec {
130
+ id: string; // Unique slug: 'monthly-expense-foreign-currency'
131
+ name: string; // Display name: 'Monthly Expense (Foreign Currency)'
132
+ description: string; // Long-form explanation for docs
133
+ category: UseCaseCategory;
134
+ fixtures: FixtureSpec;
135
+ metadata: UseCaseMetadata;
136
+ expectations?: UseCaseExpectations;
137
+ }
138
+
139
+ /**
140
+ * Fixture Collection for a Use-Case
141
+ */
142
+ export interface ExtendedFixtureSpec {
143
+ businesses: BusinessFixture[];
144
+ taxCategories: TaxCategoryFixture[];
145
+ financialAccounts: FinancialAccountFixture[];
146
+ charges: ChargeFixture[];
147
+ transactions: TransactionFixture[];
148
+ documents: DocumentFixture[];
149
+ meta?: {
150
+ id: string;
151
+ description?: string;
152
+ version?: string;
153
+ [key: string]: unknown;
154
+ };
155
+ tags?: TagFixture[];
156
+ expectations?: UseCaseExpectations & { ledger?: LedgerRecord[] };
157
+ placeholders?: Record<string, string>;
158
+ }
@@ -1,4 +1,10 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
+
3
+ // Mock merge-charges helper before importing providers that use it
4
+ vi.mock('@modules/charges/helpers/merge-charges.helper.js', () => ({
5
+ mergeChargesExecutor: vi.fn(),
6
+ }));
7
+
2
8
  import { createMockTransaction, createMockDocument } from './test-helpers.js';
3
9
 
4
10
  // Mock the module imports to avoid dependency issues
@@ -44,9 +44,6 @@ export const deelResolvers: DeelModule.Resolvers = {
44
44
  const { injector, adminContext } = context;
45
45
  try {
46
46
  const invoices = await fetchAndFilterInvoices(injector);
47
- if (invoices.length === 0) {
48
- return [];
49
- }
50
47
 
51
48
  const receipts = await fetchReceipts(injector);
52
49
 
@@ -99,7 +99,8 @@ describe('Ledger Generation - Expense Scenario A', () => {
99
99
  try {
100
100
  await insertClient.query('BEGIN');
101
101
 
102
- await insertFixture(insertClient, expenseScenarioA);
102
+ const adminContext = await buildAdminContextFromDb(insertClient);
103
+ await insertFixture(insertClient, expenseScenarioA, adminContext.defaultAdminBusinessId);
103
104
 
104
105
  const chargeId = makeUUID('charge', 'charge-office-supplies');
105
106
 
@@ -218,10 +219,11 @@ describe('Ledger Generation - Expense Scenario A', () => {
218
219
  `SELECT * FROM ${qualifyTable('charges')} WHERE id = $1`,
219
220
  [chargeId],
220
221
  );
222
+ const adminContext = await buildAdminContextFromDb(client);
221
223
  if (existingCharge.rows.length === 0) {
222
224
  // Reinsert fixture quickly
223
225
  await client.query('BEGIN');
224
- await insertFixture(client, expenseScenarioA);
226
+ await insertFixture(client, expenseScenarioA, adminContext.defaultAdminBusinessId);
225
227
  await client.query('COMMIT');
226
228
  }
227
229
 
@@ -230,7 +232,6 @@ describe('Ledger Generation - Expense Scenario A', () => {
230
232
  [chargeId],
231
233
  );
232
234
  const charge = chargeResult.rows[0];
233
- const adminContext = await buildAdminContextFromDb(client);
234
235
  const mockUser: UserType = {
235
236
  username: 'test-admin',
236
237
  userId: adminContext.defaultAdminBusinessId,
@@ -104,7 +104,10 @@ describe('Ledger Generation - Expense Scenario B (Foreign Currency)', () => {
104
104
  try {
105
105
  await insertClient.query('BEGIN');
106
106
 
107
- await insertFixture(insertClient, expenseScenarioB);
107
+ // Build AdminContext from database
108
+ const adminContext = await buildAdminContextFromDb(insertClient);
109
+
110
+ await insertFixture(insertClient, expenseScenarioB, adminContext.defaultAdminBusinessId);
108
111
 
109
112
  const chargeId = makeUUID('charge', 'charge-consulting-services');
110
113
 
@@ -228,9 +231,10 @@ describe('Ledger Generation - Expense Scenario B (Foreign Currency)', () => {
228
231
  `SELECT * FROM ${qualifyTable('charges')} WHERE id = $1`,
229
232
  [chargeId],
230
233
  );
234
+ const adminContext = await buildAdminContextFromDb(client);
231
235
  if (existingCharge.rows.length === 0) {
232
236
  await client.query('BEGIN');
233
- await insertFixture(client, expenseScenarioB);
237
+ await insertFixture(client, expenseScenarioB, adminContext.defaultAdminBusinessId);
234
238
  await client.query('COMMIT');
235
239
  }
236
240
 
@@ -239,7 +243,6 @@ describe('Ledger Generation - Expense Scenario B (Foreign Currency)', () => {
239
243
  [chargeId],
240
244
  );
241
245
  const charge = chargeResult.rows[0];
242
- const adminContext = await buildAdminContextFromDb(client);
243
246
  const mockUser: UserType = {
244
247
  username: 'test-admin-usd',
245
248
  userId: adminContext.defaultAdminBusinessId,
@@ -4,6 +4,8 @@ export const TIMELESS_DATE_REGEX =
4
4
 
5
5
  export const UUID_REGEX =
6
6
  /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/;
7
+ export const UUID5_REGEX =
8
+ /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-5[0-9a-fA-F]{3}\b-[89abAB][0-9a-fA-F]{3}\b-[0-9a-fA-F]{12}$/;
7
9
 
8
10
  export const DECREASED_VAT_RATIO = 2 / 3;
9
11
 
@@ -1,4 +1,5 @@
1
1
  import { format } from 'date-fns';
2
+ import { UUID_REGEX } from '../constants.js';
2
3
  import type { TimelessDateString } from '../types/index.js';
3
4
 
4
5
  function parseIntRound(v: number) {
@@ -38,9 +39,7 @@ export function isTimelessDateString(date: string): date is TimelessDateString {
38
39
  }
39
40
 
40
41
  export function isUUID(raw: string) {
41
- const regexExp =
42
- /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/gi;
43
- return regexExp.test(raw);
42
+ return UUID_REGEX.test(raw);
44
43
  }
45
44
 
46
45
  function convertMonthNameToNumber(monthName: string): string | null {