@xpns-it/shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # @xpns-it/shared
2
+
3
+ Shared types, DTOs, and schemas for xpns.it platform.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @xpns-it/shared
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { CreateJobRequestDTO, JobStatusDTO } from '@xpns-it/shared'
15
+ import { NormalizedTransactionSchema, SCHEMA_VERSION } from '@xpns-it/shared/schema'
16
+ import { JobRow } from '@xpns-it/shared/db'
17
+ ```
18
+
19
+ ## Building
20
+
21
+ ```bash
22
+ npm run build
23
+ ```
24
+
25
+ This generates both ESM and CJS outputs with TypeScript declarations.
26
+
27
+ ## Publishing
28
+
29
+ ```bash
30
+ npm version patch | minor | major
31
+ npm publish --access=public
32
+ ```
33
+
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=index.cjs.map
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,70 @@
1
+ import { J as JobStatus, a as JobStage } from '../jobs-rk1qaTvJ.cjs';
2
+
3
+ /**
4
+ * Database row type definitions (interfaces only, no Sequelize dependency)
5
+ */
6
+
7
+ interface JobRow {
8
+ id: string;
9
+ userId: string;
10
+ uploadInstanceId: string;
11
+ taxYearId: string;
12
+ type: 'document_analysis' | 'email_analysis';
13
+ status: JobStatus;
14
+ priority: number;
15
+ attempts: number;
16
+ maxAttempts: number;
17
+ lockedAt: Date | null;
18
+ lockedBy: string | null;
19
+ runAfter: Date | null;
20
+ progress: number;
21
+ stage: JobStage;
22
+ errorCode: string | null;
23
+ errorMessage: string | null;
24
+ createdAt: Date;
25
+ updatedAt: Date;
26
+ }
27
+ interface JobResultRow {
28
+ id: string;
29
+ jobId: string;
30
+ schemaVersion: string;
31
+ resultJson: Record<string, any>;
32
+ summaryJson: Record<string, any>;
33
+ createdAt: Date;
34
+ updatedAt: Date;
35
+ }
36
+ interface JobEventRow {
37
+ id: string;
38
+ jobId: string;
39
+ level: 'info' | 'warn' | 'error';
40
+ message: string;
41
+ meta: Record<string, any> | null;
42
+ createdAt: Date;
43
+ }
44
+ interface UploadRow {
45
+ id: string;
46
+ userId: string;
47
+ taxYearId: string;
48
+ source: 'upload' | 'email_scan';
49
+ uploadedAt: Date;
50
+ status: 'pending' | 'processing' | 'completed' | 'failed';
51
+ error: string | null;
52
+ createdAt: Date;
53
+ updatedAt: Date;
54
+ }
55
+ interface DocumentRow {
56
+ id: string;
57
+ userId: string;
58
+ uploadInstanceId: string;
59
+ taxYearId: string;
60
+ filename: string;
61
+ mimeType: string;
62
+ size: number;
63
+ uploadedAt: Date;
64
+ status: 'pending' | 'processing' | 'completed' | 'failed';
65
+ type: 'bank_statement' | 'invoice' | 'receipt' | 'other';
66
+ createdAt: Date;
67
+ updatedAt: Date;
68
+ }
69
+
70
+ export type { DocumentRow, JobEventRow, JobResultRow, JobRow, UploadRow };
@@ -0,0 +1,70 @@
1
+ import { J as JobStatus, a as JobStage } from '../jobs-rk1qaTvJ.js';
2
+
3
+ /**
4
+ * Database row type definitions (interfaces only, no Sequelize dependency)
5
+ */
6
+
7
+ interface JobRow {
8
+ id: string;
9
+ userId: string;
10
+ uploadInstanceId: string;
11
+ taxYearId: string;
12
+ type: 'document_analysis' | 'email_analysis';
13
+ status: JobStatus;
14
+ priority: number;
15
+ attempts: number;
16
+ maxAttempts: number;
17
+ lockedAt: Date | null;
18
+ lockedBy: string | null;
19
+ runAfter: Date | null;
20
+ progress: number;
21
+ stage: JobStage;
22
+ errorCode: string | null;
23
+ errorMessage: string | null;
24
+ createdAt: Date;
25
+ updatedAt: Date;
26
+ }
27
+ interface JobResultRow {
28
+ id: string;
29
+ jobId: string;
30
+ schemaVersion: string;
31
+ resultJson: Record<string, any>;
32
+ summaryJson: Record<string, any>;
33
+ createdAt: Date;
34
+ updatedAt: Date;
35
+ }
36
+ interface JobEventRow {
37
+ id: string;
38
+ jobId: string;
39
+ level: 'info' | 'warn' | 'error';
40
+ message: string;
41
+ meta: Record<string, any> | null;
42
+ createdAt: Date;
43
+ }
44
+ interface UploadRow {
45
+ id: string;
46
+ userId: string;
47
+ taxYearId: string;
48
+ source: 'upload' | 'email_scan';
49
+ uploadedAt: Date;
50
+ status: 'pending' | 'processing' | 'completed' | 'failed';
51
+ error: string | null;
52
+ createdAt: Date;
53
+ updatedAt: Date;
54
+ }
55
+ interface DocumentRow {
56
+ id: string;
57
+ userId: string;
58
+ uploadInstanceId: string;
59
+ taxYearId: string;
60
+ filename: string;
61
+ mimeType: string;
62
+ size: number;
63
+ uploadedAt: Date;
64
+ status: 'pending' | 'processing' | 'completed' | 'failed';
65
+ type: 'bank_statement' | 'invoice' | 'receipt' | 'other';
66
+ createdAt: Date;
67
+ updatedAt: Date;
68
+ }
69
+
70
+ export type { DocumentRow, JobEventRow, JobResultRow, JobRow, UploadRow };
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=index.cjs.map
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,56 @@
1
+ export { C as CreateJobRequestDTO, b as CreateJobResponseDTO, d as JobResultDTO, a as JobStage, J as JobStatus, c as JobStatusDTO } from '../jobs-rk1qaTvJ.cjs';
2
+
3
+ /**
4
+ * Upload-related DTOs
5
+ */
6
+ interface UploadDTO {
7
+ id: string;
8
+ userId: string;
9
+ taxYearId: string;
10
+ source: 'upload' | 'email_scan';
11
+ uploadedAt: string;
12
+ status: 'pending' | 'processing' | 'completed' | 'failed';
13
+ error?: string;
14
+ }
15
+ interface DocumentDTO {
16
+ id: string;
17
+ userId: string;
18
+ uploadInstanceId: string;
19
+ taxYearId: string;
20
+ filename: string;
21
+ mimeType: string;
22
+ size: number;
23
+ uploadedAt: string;
24
+ status: 'pending' | 'processing' | 'completed' | 'failed';
25
+ type: 'bank_statement' | 'invoice' | 'receipt' | 'other';
26
+ }
27
+
28
+ /**
29
+ * Result-related DTOs
30
+ */
31
+ interface ExpenseResultDTO {
32
+ id: string;
33
+ documentId: string;
34
+ date: string;
35
+ description: string;
36
+ amount: number;
37
+ category: string;
38
+ confidence: 'low' | 'medium' | 'high';
39
+ source?: 'email' | 'file' | null;
40
+ sourceFileName?: string | null;
41
+ metadata?: Record<string, any>;
42
+ }
43
+ interface ProcessingSummaryDTO {
44
+ totalExpenses: number;
45
+ totalDocuments: number;
46
+ totalEmailBatches: number;
47
+ totalAmount: number;
48
+ categoryBreakdown: Record<string, number>;
49
+ dateRange?: {
50
+ start: string;
51
+ end: string;
52
+ };
53
+ warnings?: string[];
54
+ }
55
+
56
+ export type { DocumentDTO, ExpenseResultDTO, ProcessingSummaryDTO, UploadDTO };
@@ -0,0 +1,56 @@
1
+ export { C as CreateJobRequestDTO, b as CreateJobResponseDTO, d as JobResultDTO, a as JobStage, J as JobStatus, c as JobStatusDTO } from '../jobs-rk1qaTvJ.js';
2
+
3
+ /**
4
+ * Upload-related DTOs
5
+ */
6
+ interface UploadDTO {
7
+ id: string;
8
+ userId: string;
9
+ taxYearId: string;
10
+ source: 'upload' | 'email_scan';
11
+ uploadedAt: string;
12
+ status: 'pending' | 'processing' | 'completed' | 'failed';
13
+ error?: string;
14
+ }
15
+ interface DocumentDTO {
16
+ id: string;
17
+ userId: string;
18
+ uploadInstanceId: string;
19
+ taxYearId: string;
20
+ filename: string;
21
+ mimeType: string;
22
+ size: number;
23
+ uploadedAt: string;
24
+ status: 'pending' | 'processing' | 'completed' | 'failed';
25
+ type: 'bank_statement' | 'invoice' | 'receipt' | 'other';
26
+ }
27
+
28
+ /**
29
+ * Result-related DTOs
30
+ */
31
+ interface ExpenseResultDTO {
32
+ id: string;
33
+ documentId: string;
34
+ date: string;
35
+ description: string;
36
+ amount: number;
37
+ category: string;
38
+ confidence: 'low' | 'medium' | 'high';
39
+ source?: 'email' | 'file' | null;
40
+ sourceFileName?: string | null;
41
+ metadata?: Record<string, any>;
42
+ }
43
+ interface ProcessingSummaryDTO {
44
+ totalExpenses: number;
45
+ totalDocuments: number;
46
+ totalEmailBatches: number;
47
+ totalAmount: number;
48
+ categoryBreakdown: Record<string, number>;
49
+ dateRange?: {
50
+ start: string;
51
+ end: string;
52
+ };
53
+ warnings?: string[];
54
+ }
55
+
56
+ export type { DocumentDTO, ExpenseResultDTO, ProcessingSummaryDTO, UploadDTO };
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/dist/index.cjs ADDED
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ // src/schema/parsing.ts
6
+ var SCHEMA_VERSION = "1.0.0";
7
+ var NormalizedTransactionSchema = zod.z.object({
8
+ date: zod.z.string().datetime(),
9
+ // ISO 8601
10
+ description: zod.z.string(),
11
+ amountSigned: zod.z.number(),
12
+ // Positive for income, negative for expenses
13
+ currency: zod.z.string().optional().default("USD"),
14
+ balance: zod.z.number().optional(),
15
+ source: zod.z.enum(["email", "file"]).optional(),
16
+ confidence: zod.z.enum(["low", "medium", "high"]).optional().default("medium"),
17
+ metadata: zod.z.record(zod.z.unknown()).optional()
18
+ });
19
+ var NormalizedExpenseReportSchema = zod.z.object({
20
+ statementPeriod: zod.z.object({
21
+ start: zod.z.string().datetime(),
22
+ end: zod.z.string().datetime()
23
+ }).optional(),
24
+ transactions: zod.z.array(NormalizedTransactionSchema),
25
+ totals: zod.z.object({
26
+ income: zod.z.number().optional(),
27
+ expenses: zod.z.number().optional(),
28
+ net: zod.z.number().optional()
29
+ }).optional(),
30
+ warnings: zod.z.array(zod.z.string()).optional(),
31
+ metadata: zod.z.record(zod.z.unknown()).optional()
32
+ });
33
+ function validateTransaction(data) {
34
+ return NormalizedTransactionSchema.parse(data);
35
+ }
36
+ function validateExpenseReport(data) {
37
+ return NormalizedExpenseReportSchema.parse(data);
38
+ }
39
+
40
+ exports.NormalizedExpenseReportSchema = NormalizedExpenseReportSchema;
41
+ exports.NormalizedTransactionSchema = NormalizedTransactionSchema;
42
+ exports.SCHEMA_VERSION = SCHEMA_VERSION;
43
+ exports.validateExpenseReport = validateExpenseReport;
44
+ exports.validateTransaction = validateTransaction;
45
+ //# sourceMappingURL=index.cjs.map
46
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/parsing.ts"],"names":["z"],"mappings":";;;;;AAMO,IAAM,cAAA,GAAiB;AAKvB,IAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAClD,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,YAAA,EAAcA,MAAE,MAAA,EAAO;AAAA;AAAA,EACvB,UAAUA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC7C,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,SAAS,MAAM,CAAC,EAAE,QAAA,EAAS;AAAA,EAC3C,UAAA,EAAYA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzE,UAAUA,KAAA,CAAE,MAAA,CAAOA,MAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,IAAM,6BAAA,GAAgCA,MAAE,MAAA,CAAO;AAAA,EACpD,eAAA,EAAiBA,MACd,MAAA,CAAO;AAAA,IACN,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,YAAA,EAAcA,KAAA,CAAE,KAAA,CAAM,2BAA2B,CAAA;AAAA,EACjD,MAAA,EAAQA,MACL,MAAA,CAAO;AAAA,IACN,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC9B,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,UAAUA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACvC,UAAUA,KAAA,CAAE,MAAA,CAAOA,MAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,SAAS,oBAAoB,IAAA,EAAsC;AACxE,EAAA,OAAO,2BAAA,CAA4B,MAAM,IAAI,CAAA;AAC/C;AAKO,SAAS,sBAAsB,IAAA,EAAwC;AAC5E,EAAA,OAAO,6BAAA,CAA8B,MAAM,IAAI,CAAA;AACjD","file":"index.cjs","sourcesContent":["import { z } from 'zod'\n\n/**\n * Schema version for parsing results\n * Increment when breaking changes are made\n */\nexport const SCHEMA_VERSION = '1.0.0'\n\n/**\n * Normalized transaction schema\n */\nexport const NormalizedTransactionSchema = z.object({\n date: z.string().datetime(), // ISO 8601\n description: z.string(),\n amountSigned: z.number(), // Positive for income, negative for expenses\n currency: z.string().optional().default('USD'),\n balance: z.number().optional(),\n source: z.enum(['email', 'file']).optional(),\n confidence: z.enum(['low', 'medium', 'high']).optional().default('medium'),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedTransaction = z.infer<typeof NormalizedTransactionSchema>\n\n/**\n * Normalized expense report schema\n */\nexport const NormalizedExpenseReportSchema = z.object({\n statementPeriod: z\n .object({\n start: z.string().datetime(),\n end: z.string().datetime(),\n })\n .optional(),\n transactions: z.array(NormalizedTransactionSchema),\n totals: z\n .object({\n income: z.number().optional(),\n expenses: z.number().optional(),\n net: z.number().optional(),\n })\n .optional(),\n warnings: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedExpenseReport = z.infer<typeof NormalizedExpenseReportSchema>\n\n/**\n * Validate a transaction against the schema\n */\nexport function validateTransaction(data: unknown): NormalizedTransaction {\n return NormalizedTransactionSchema.parse(data)\n}\n\n/**\n * Validate an expense report against the schema\n */\nexport function validateExpenseReport(data: unknown): NormalizedExpenseReport {\n return NormalizedExpenseReportSchema.parse(data)\n}\n\n"]}
@@ -0,0 +1,5 @@
1
+ export { C as CreateJobRequestDTO, b as CreateJobResponseDTO, d as JobResultDTO, a as JobStage, J as JobStatus, c as JobStatusDTO } from './jobs-rk1qaTvJ.cjs';
2
+ export { DocumentDTO, ExpenseResultDTO, ProcessingSummaryDTO, UploadDTO } from './dto/index.cjs';
3
+ export { NormalizedExpenseReport, NormalizedExpenseReportSchema, NormalizedTransaction, NormalizedTransactionSchema, SCHEMA_VERSION, validateExpenseReport, validateTransaction } from './schema/index.cjs';
4
+ export { DocumentRow, JobEventRow, JobResultRow, JobRow, UploadRow } from './db/index.cjs';
5
+ import 'zod';
@@ -0,0 +1,5 @@
1
+ export { C as CreateJobRequestDTO, b as CreateJobResponseDTO, d as JobResultDTO, a as JobStage, J as JobStatus, c as JobStatusDTO } from './jobs-rk1qaTvJ.js';
2
+ export { DocumentDTO, ExpenseResultDTO, ProcessingSummaryDTO, UploadDTO } from './dto/index.js';
3
+ export { NormalizedExpenseReport, NormalizedExpenseReportSchema, NormalizedTransaction, NormalizedTransactionSchema, SCHEMA_VERSION, validateExpenseReport, validateTransaction } from './schema/index.js';
4
+ export { DocumentRow, JobEventRow, JobResultRow, JobRow, UploadRow } from './db/index.js';
5
+ import 'zod';
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/schema/parsing.ts
4
+ var SCHEMA_VERSION = "1.0.0";
5
+ var NormalizedTransactionSchema = z.object({
6
+ date: z.string().datetime(),
7
+ // ISO 8601
8
+ description: z.string(),
9
+ amountSigned: z.number(),
10
+ // Positive for income, negative for expenses
11
+ currency: z.string().optional().default("USD"),
12
+ balance: z.number().optional(),
13
+ source: z.enum(["email", "file"]).optional(),
14
+ confidence: z.enum(["low", "medium", "high"]).optional().default("medium"),
15
+ metadata: z.record(z.unknown()).optional()
16
+ });
17
+ var NormalizedExpenseReportSchema = z.object({
18
+ statementPeriod: z.object({
19
+ start: z.string().datetime(),
20
+ end: z.string().datetime()
21
+ }).optional(),
22
+ transactions: z.array(NormalizedTransactionSchema),
23
+ totals: z.object({
24
+ income: z.number().optional(),
25
+ expenses: z.number().optional(),
26
+ net: z.number().optional()
27
+ }).optional(),
28
+ warnings: z.array(z.string()).optional(),
29
+ metadata: z.record(z.unknown()).optional()
30
+ });
31
+ function validateTransaction(data) {
32
+ return NormalizedTransactionSchema.parse(data);
33
+ }
34
+ function validateExpenseReport(data) {
35
+ return NormalizedExpenseReportSchema.parse(data);
36
+ }
37
+
38
+ export { NormalizedExpenseReportSchema, NormalizedTransactionSchema, SCHEMA_VERSION, validateExpenseReport, validateTransaction };
39
+ //# sourceMappingURL=index.js.map
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/parsing.ts"],"names":[],"mappings":";;;AAMO,IAAM,cAAA,GAAiB;AAKvB,IAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EAClD,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA;AAAA,EACvB,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC7C,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,MAAA,EAAQ,EAAE,IAAA,CAAK,CAAC,SAAS,MAAM,CAAC,EAAE,QAAA,EAAS;AAAA,EAC3C,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzE,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,IAAM,6BAAA,GAAgC,EAAE,MAAA,CAAO;AAAA,EACpD,eAAA,EAAiB,EACd,MAAA,CAAO;AAAA,IACN,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,2BAA2B,CAAA;AAAA,EACjD,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC9B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACvC,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,SAAS,oBAAoB,IAAA,EAAsC;AACxE,EAAA,OAAO,2BAAA,CAA4B,MAAM,IAAI,CAAA;AAC/C;AAKO,SAAS,sBAAsB,IAAA,EAAwC;AAC5E,EAAA,OAAO,6BAAA,CAA8B,MAAM,IAAI,CAAA;AACjD","file":"index.js","sourcesContent":["import { z } from 'zod'\n\n/**\n * Schema version for parsing results\n * Increment when breaking changes are made\n */\nexport const SCHEMA_VERSION = '1.0.0'\n\n/**\n * Normalized transaction schema\n */\nexport const NormalizedTransactionSchema = z.object({\n date: z.string().datetime(), // ISO 8601\n description: z.string(),\n amountSigned: z.number(), // Positive for income, negative for expenses\n currency: z.string().optional().default('USD'),\n balance: z.number().optional(),\n source: z.enum(['email', 'file']).optional(),\n confidence: z.enum(['low', 'medium', 'high']).optional().default('medium'),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedTransaction = z.infer<typeof NormalizedTransactionSchema>\n\n/**\n * Normalized expense report schema\n */\nexport const NormalizedExpenseReportSchema = z.object({\n statementPeriod: z\n .object({\n start: z.string().datetime(),\n end: z.string().datetime(),\n })\n .optional(),\n transactions: z.array(NormalizedTransactionSchema),\n totals: z\n .object({\n income: z.number().optional(),\n expenses: z.number().optional(),\n net: z.number().optional(),\n })\n .optional(),\n warnings: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedExpenseReport = z.infer<typeof NormalizedExpenseReportSchema>\n\n/**\n * Validate a transaction against the schema\n */\nexport function validateTransaction(data: unknown): NormalizedTransaction {\n return NormalizedTransactionSchema.parse(data)\n}\n\n/**\n * Validate an expense report against the schema\n */\nexport function validateExpenseReport(data: unknown): NormalizedExpenseReport {\n return NormalizedExpenseReportSchema.parse(data)\n}\n\n"]}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Job-related DTOs
3
+ */
4
+ type JobStatus = 'queued' | 'processing' | 'completed' | 'failed' | 'canceled';
5
+ type JobStage = 'start' | 'load' | 'preprocess' | 'email_batching' | 'document_processing' | 'llm' | 'aggregate' | 'finalize';
6
+ interface CreateJobRequestDTO {
7
+ uploadInstanceId: string;
8
+ userId: string;
9
+ taxYearId: string;
10
+ type: 'document_analysis' | 'email_analysis';
11
+ }
12
+ interface CreateJobResponseDTO {
13
+ jobId: string;
14
+ status: JobStatus;
15
+ uploadId: string;
16
+ }
17
+ interface JobStatusDTO {
18
+ jobId: string;
19
+ status: JobStatus;
20
+ progress: number;
21
+ stage: JobStage;
22
+ errorCode?: string;
23
+ errorMessage?: string;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ startedAt?: string;
27
+ completedAt?: string;
28
+ }
29
+ interface JobResultDTO {
30
+ jobId: string;
31
+ status: 'completed';
32
+ schemaVersion: string;
33
+ result: {
34
+ totalExpenses: number;
35
+ totalDocuments: number;
36
+ totalEmailBatches: number;
37
+ expenses: Array<{
38
+ id: string;
39
+ documentId: string;
40
+ date: string;
41
+ description: string;
42
+ amount: number;
43
+ category: string;
44
+ confidence: 'low' | 'medium' | 'high';
45
+ source?: 'email' | 'file' | null;
46
+ sourceFileName?: string | null;
47
+ metadata?: Record<string, any>;
48
+ }>;
49
+ summary: {
50
+ totalAmount: number;
51
+ categoryBreakdown: Record<string, number>;
52
+ dateRange?: {
53
+ start: string;
54
+ end: string;
55
+ };
56
+ };
57
+ warnings?: string[];
58
+ };
59
+ }
60
+
61
+ export type { CreateJobRequestDTO as C, JobStatus as J, JobStage as a, CreateJobResponseDTO as b, JobStatusDTO as c, JobResultDTO as d };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Job-related DTOs
3
+ */
4
+ type JobStatus = 'queued' | 'processing' | 'completed' | 'failed' | 'canceled';
5
+ type JobStage = 'start' | 'load' | 'preprocess' | 'email_batching' | 'document_processing' | 'llm' | 'aggregate' | 'finalize';
6
+ interface CreateJobRequestDTO {
7
+ uploadInstanceId: string;
8
+ userId: string;
9
+ taxYearId: string;
10
+ type: 'document_analysis' | 'email_analysis';
11
+ }
12
+ interface CreateJobResponseDTO {
13
+ jobId: string;
14
+ status: JobStatus;
15
+ uploadId: string;
16
+ }
17
+ interface JobStatusDTO {
18
+ jobId: string;
19
+ status: JobStatus;
20
+ progress: number;
21
+ stage: JobStage;
22
+ errorCode?: string;
23
+ errorMessage?: string;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ startedAt?: string;
27
+ completedAt?: string;
28
+ }
29
+ interface JobResultDTO {
30
+ jobId: string;
31
+ status: 'completed';
32
+ schemaVersion: string;
33
+ result: {
34
+ totalExpenses: number;
35
+ totalDocuments: number;
36
+ totalEmailBatches: number;
37
+ expenses: Array<{
38
+ id: string;
39
+ documentId: string;
40
+ date: string;
41
+ description: string;
42
+ amount: number;
43
+ category: string;
44
+ confidence: 'low' | 'medium' | 'high';
45
+ source?: 'email' | 'file' | null;
46
+ sourceFileName?: string | null;
47
+ metadata?: Record<string, any>;
48
+ }>;
49
+ summary: {
50
+ totalAmount: number;
51
+ categoryBreakdown: Record<string, number>;
52
+ dateRange?: {
53
+ start: string;
54
+ end: string;
55
+ };
56
+ };
57
+ warnings?: string[];
58
+ };
59
+ }
60
+
61
+ export type { CreateJobRequestDTO as C, JobStatus as J, JobStage as a, CreateJobResponseDTO as b, JobStatusDTO as c, JobResultDTO as d };
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+
5
+ // src/schema/parsing.ts
6
+ var SCHEMA_VERSION = "1.0.0";
7
+ var NormalizedTransactionSchema = zod.z.object({
8
+ date: zod.z.string().datetime(),
9
+ // ISO 8601
10
+ description: zod.z.string(),
11
+ amountSigned: zod.z.number(),
12
+ // Positive for income, negative for expenses
13
+ currency: zod.z.string().optional().default("USD"),
14
+ balance: zod.z.number().optional(),
15
+ source: zod.z.enum(["email", "file"]).optional(),
16
+ confidence: zod.z.enum(["low", "medium", "high"]).optional().default("medium"),
17
+ metadata: zod.z.record(zod.z.unknown()).optional()
18
+ });
19
+ var NormalizedExpenseReportSchema = zod.z.object({
20
+ statementPeriod: zod.z.object({
21
+ start: zod.z.string().datetime(),
22
+ end: zod.z.string().datetime()
23
+ }).optional(),
24
+ transactions: zod.z.array(NormalizedTransactionSchema),
25
+ totals: zod.z.object({
26
+ income: zod.z.number().optional(),
27
+ expenses: zod.z.number().optional(),
28
+ net: zod.z.number().optional()
29
+ }).optional(),
30
+ warnings: zod.z.array(zod.z.string()).optional(),
31
+ metadata: zod.z.record(zod.z.unknown()).optional()
32
+ });
33
+ function validateTransaction(data) {
34
+ return NormalizedTransactionSchema.parse(data);
35
+ }
36
+ function validateExpenseReport(data) {
37
+ return NormalizedExpenseReportSchema.parse(data);
38
+ }
39
+
40
+ exports.NormalizedExpenseReportSchema = NormalizedExpenseReportSchema;
41
+ exports.NormalizedTransactionSchema = NormalizedTransactionSchema;
42
+ exports.SCHEMA_VERSION = SCHEMA_VERSION;
43
+ exports.validateExpenseReport = validateExpenseReport;
44
+ exports.validateTransaction = validateTransaction;
45
+ //# sourceMappingURL=index.cjs.map
46
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schema/parsing.ts"],"names":["z"],"mappings":";;;;;AAMO,IAAM,cAAA,GAAiB;AAKvB,IAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAClD,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,YAAA,EAAcA,MAAE,MAAA,EAAO;AAAA;AAAA,EACvB,UAAUA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC7C,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,SAAS,MAAM,CAAC,EAAE,QAAA,EAAS;AAAA,EAC3C,UAAA,EAAYA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzE,UAAUA,KAAA,CAAE,MAAA,CAAOA,MAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,IAAM,6BAAA,GAAgCA,MAAE,MAAA,CAAO;AAAA,EACpD,eAAA,EAAiBA,MACd,MAAA,CAAO;AAAA,IACN,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,YAAA,EAAcA,KAAA,CAAE,KAAA,CAAM,2BAA2B,CAAA;AAAA,EACjD,MAAA,EAAQA,MACL,MAAA,CAAO;AAAA,IACN,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC9B,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,UAAUA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACvC,UAAUA,KAAA,CAAE,MAAA,CAAOA,MAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,SAAS,oBAAoB,IAAA,EAAsC;AACxE,EAAA,OAAO,2BAAA,CAA4B,MAAM,IAAI,CAAA;AAC/C;AAKO,SAAS,sBAAsB,IAAA,EAAwC;AAC5E,EAAA,OAAO,6BAAA,CAA8B,MAAM,IAAI,CAAA;AACjD","file":"index.cjs","sourcesContent":["import { z } from 'zod'\n\n/**\n * Schema version for parsing results\n * Increment when breaking changes are made\n */\nexport const SCHEMA_VERSION = '1.0.0'\n\n/**\n * Normalized transaction schema\n */\nexport const NormalizedTransactionSchema = z.object({\n date: z.string().datetime(), // ISO 8601\n description: z.string(),\n amountSigned: z.number(), // Positive for income, negative for expenses\n currency: z.string().optional().default('USD'),\n balance: z.number().optional(),\n source: z.enum(['email', 'file']).optional(),\n confidence: z.enum(['low', 'medium', 'high']).optional().default('medium'),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedTransaction = z.infer<typeof NormalizedTransactionSchema>\n\n/**\n * Normalized expense report schema\n */\nexport const NormalizedExpenseReportSchema = z.object({\n statementPeriod: z\n .object({\n start: z.string().datetime(),\n end: z.string().datetime(),\n })\n .optional(),\n transactions: z.array(NormalizedTransactionSchema),\n totals: z\n .object({\n income: z.number().optional(),\n expenses: z.number().optional(),\n net: z.number().optional(),\n })\n .optional(),\n warnings: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedExpenseReport = z.infer<typeof NormalizedExpenseReportSchema>\n\n/**\n * Validate a transaction against the schema\n */\nexport function validateTransaction(data: unknown): NormalizedTransaction {\n return NormalizedTransactionSchema.parse(data)\n}\n\n/**\n * Validate an expense report against the schema\n */\nexport function validateExpenseReport(data: unknown): NormalizedExpenseReport {\n return NormalizedExpenseReportSchema.parse(data)\n}\n\n"]}
@@ -0,0 +1,152 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Schema version for parsing results
5
+ * Increment when breaking changes are made
6
+ */
7
+ declare const SCHEMA_VERSION = "1.0.0";
8
+ /**
9
+ * Normalized transaction schema
10
+ */
11
+ declare const NormalizedTransactionSchema: z.ZodObject<{
12
+ date: z.ZodString;
13
+ description: z.ZodString;
14
+ amountSigned: z.ZodNumber;
15
+ currency: z.ZodDefault<z.ZodOptional<z.ZodString>>;
16
+ balance: z.ZodOptional<z.ZodNumber>;
17
+ source: z.ZodOptional<z.ZodEnum<["email", "file"]>>;
18
+ confidence: z.ZodDefault<z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>>;
19
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ date: string;
22
+ description: string;
23
+ amountSigned: number;
24
+ currency: string;
25
+ confidence: "low" | "medium" | "high";
26
+ balance?: number | undefined;
27
+ source?: "email" | "file" | undefined;
28
+ metadata?: Record<string, unknown> | undefined;
29
+ }, {
30
+ date: string;
31
+ description: string;
32
+ amountSigned: number;
33
+ currency?: string | undefined;
34
+ balance?: number | undefined;
35
+ source?: "email" | "file" | undefined;
36
+ confidence?: "low" | "medium" | "high" | undefined;
37
+ metadata?: Record<string, unknown> | undefined;
38
+ }>;
39
+ type NormalizedTransaction = z.infer<typeof NormalizedTransactionSchema>;
40
+ /**
41
+ * Normalized expense report schema
42
+ */
43
+ declare const NormalizedExpenseReportSchema: z.ZodObject<{
44
+ statementPeriod: z.ZodOptional<z.ZodObject<{
45
+ start: z.ZodString;
46
+ end: z.ZodString;
47
+ }, "strip", z.ZodTypeAny, {
48
+ start: string;
49
+ end: string;
50
+ }, {
51
+ start: string;
52
+ end: string;
53
+ }>>;
54
+ transactions: z.ZodArray<z.ZodObject<{
55
+ date: z.ZodString;
56
+ description: z.ZodString;
57
+ amountSigned: z.ZodNumber;
58
+ currency: z.ZodDefault<z.ZodOptional<z.ZodString>>;
59
+ balance: z.ZodOptional<z.ZodNumber>;
60
+ source: z.ZodOptional<z.ZodEnum<["email", "file"]>>;
61
+ confidence: z.ZodDefault<z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>>;
62
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ date: string;
65
+ description: string;
66
+ amountSigned: number;
67
+ currency: string;
68
+ confidence: "low" | "medium" | "high";
69
+ balance?: number | undefined;
70
+ source?: "email" | "file" | undefined;
71
+ metadata?: Record<string, unknown> | undefined;
72
+ }, {
73
+ date: string;
74
+ description: string;
75
+ amountSigned: number;
76
+ currency?: string | undefined;
77
+ balance?: number | undefined;
78
+ source?: "email" | "file" | undefined;
79
+ confidence?: "low" | "medium" | "high" | undefined;
80
+ metadata?: Record<string, unknown> | undefined;
81
+ }>, "many">;
82
+ totals: z.ZodOptional<z.ZodObject<{
83
+ income: z.ZodOptional<z.ZodNumber>;
84
+ expenses: z.ZodOptional<z.ZodNumber>;
85
+ net: z.ZodOptional<z.ZodNumber>;
86
+ }, "strip", z.ZodTypeAny, {
87
+ income?: number | undefined;
88
+ expenses?: number | undefined;
89
+ net?: number | undefined;
90
+ }, {
91
+ income?: number | undefined;
92
+ expenses?: number | undefined;
93
+ net?: number | undefined;
94
+ }>>;
95
+ warnings: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
96
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
97
+ }, "strip", z.ZodTypeAny, {
98
+ transactions: {
99
+ date: string;
100
+ description: string;
101
+ amountSigned: number;
102
+ currency: string;
103
+ confidence: "low" | "medium" | "high";
104
+ balance?: number | undefined;
105
+ source?: "email" | "file" | undefined;
106
+ metadata?: Record<string, unknown> | undefined;
107
+ }[];
108
+ metadata?: Record<string, unknown> | undefined;
109
+ statementPeriod?: {
110
+ start: string;
111
+ end: string;
112
+ } | undefined;
113
+ totals?: {
114
+ income?: number | undefined;
115
+ expenses?: number | undefined;
116
+ net?: number | undefined;
117
+ } | undefined;
118
+ warnings?: string[] | undefined;
119
+ }, {
120
+ transactions: {
121
+ date: string;
122
+ description: string;
123
+ amountSigned: number;
124
+ currency?: string | undefined;
125
+ balance?: number | undefined;
126
+ source?: "email" | "file" | undefined;
127
+ confidence?: "low" | "medium" | "high" | undefined;
128
+ metadata?: Record<string, unknown> | undefined;
129
+ }[];
130
+ metadata?: Record<string, unknown> | undefined;
131
+ statementPeriod?: {
132
+ start: string;
133
+ end: string;
134
+ } | undefined;
135
+ totals?: {
136
+ income?: number | undefined;
137
+ expenses?: number | undefined;
138
+ net?: number | undefined;
139
+ } | undefined;
140
+ warnings?: string[] | undefined;
141
+ }>;
142
+ type NormalizedExpenseReport = z.infer<typeof NormalizedExpenseReportSchema>;
143
+ /**
144
+ * Validate a transaction against the schema
145
+ */
146
+ declare function validateTransaction(data: unknown): NormalizedTransaction;
147
+ /**
148
+ * Validate an expense report against the schema
149
+ */
150
+ declare function validateExpenseReport(data: unknown): NormalizedExpenseReport;
151
+
152
+ export { type NormalizedExpenseReport, NormalizedExpenseReportSchema, type NormalizedTransaction, NormalizedTransactionSchema, SCHEMA_VERSION, validateExpenseReport, validateTransaction };
@@ -0,0 +1,152 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Schema version for parsing results
5
+ * Increment when breaking changes are made
6
+ */
7
+ declare const SCHEMA_VERSION = "1.0.0";
8
+ /**
9
+ * Normalized transaction schema
10
+ */
11
+ declare const NormalizedTransactionSchema: z.ZodObject<{
12
+ date: z.ZodString;
13
+ description: z.ZodString;
14
+ amountSigned: z.ZodNumber;
15
+ currency: z.ZodDefault<z.ZodOptional<z.ZodString>>;
16
+ balance: z.ZodOptional<z.ZodNumber>;
17
+ source: z.ZodOptional<z.ZodEnum<["email", "file"]>>;
18
+ confidence: z.ZodDefault<z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>>;
19
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ date: string;
22
+ description: string;
23
+ amountSigned: number;
24
+ currency: string;
25
+ confidence: "low" | "medium" | "high";
26
+ balance?: number | undefined;
27
+ source?: "email" | "file" | undefined;
28
+ metadata?: Record<string, unknown> | undefined;
29
+ }, {
30
+ date: string;
31
+ description: string;
32
+ amountSigned: number;
33
+ currency?: string | undefined;
34
+ balance?: number | undefined;
35
+ source?: "email" | "file" | undefined;
36
+ confidence?: "low" | "medium" | "high" | undefined;
37
+ metadata?: Record<string, unknown> | undefined;
38
+ }>;
39
+ type NormalizedTransaction = z.infer<typeof NormalizedTransactionSchema>;
40
+ /**
41
+ * Normalized expense report schema
42
+ */
43
+ declare const NormalizedExpenseReportSchema: z.ZodObject<{
44
+ statementPeriod: z.ZodOptional<z.ZodObject<{
45
+ start: z.ZodString;
46
+ end: z.ZodString;
47
+ }, "strip", z.ZodTypeAny, {
48
+ start: string;
49
+ end: string;
50
+ }, {
51
+ start: string;
52
+ end: string;
53
+ }>>;
54
+ transactions: z.ZodArray<z.ZodObject<{
55
+ date: z.ZodString;
56
+ description: z.ZodString;
57
+ amountSigned: z.ZodNumber;
58
+ currency: z.ZodDefault<z.ZodOptional<z.ZodString>>;
59
+ balance: z.ZodOptional<z.ZodNumber>;
60
+ source: z.ZodOptional<z.ZodEnum<["email", "file"]>>;
61
+ confidence: z.ZodDefault<z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>>;
62
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ date: string;
65
+ description: string;
66
+ amountSigned: number;
67
+ currency: string;
68
+ confidence: "low" | "medium" | "high";
69
+ balance?: number | undefined;
70
+ source?: "email" | "file" | undefined;
71
+ metadata?: Record<string, unknown> | undefined;
72
+ }, {
73
+ date: string;
74
+ description: string;
75
+ amountSigned: number;
76
+ currency?: string | undefined;
77
+ balance?: number | undefined;
78
+ source?: "email" | "file" | undefined;
79
+ confidence?: "low" | "medium" | "high" | undefined;
80
+ metadata?: Record<string, unknown> | undefined;
81
+ }>, "many">;
82
+ totals: z.ZodOptional<z.ZodObject<{
83
+ income: z.ZodOptional<z.ZodNumber>;
84
+ expenses: z.ZodOptional<z.ZodNumber>;
85
+ net: z.ZodOptional<z.ZodNumber>;
86
+ }, "strip", z.ZodTypeAny, {
87
+ income?: number | undefined;
88
+ expenses?: number | undefined;
89
+ net?: number | undefined;
90
+ }, {
91
+ income?: number | undefined;
92
+ expenses?: number | undefined;
93
+ net?: number | undefined;
94
+ }>>;
95
+ warnings: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
96
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
97
+ }, "strip", z.ZodTypeAny, {
98
+ transactions: {
99
+ date: string;
100
+ description: string;
101
+ amountSigned: number;
102
+ currency: string;
103
+ confidence: "low" | "medium" | "high";
104
+ balance?: number | undefined;
105
+ source?: "email" | "file" | undefined;
106
+ metadata?: Record<string, unknown> | undefined;
107
+ }[];
108
+ metadata?: Record<string, unknown> | undefined;
109
+ statementPeriod?: {
110
+ start: string;
111
+ end: string;
112
+ } | undefined;
113
+ totals?: {
114
+ income?: number | undefined;
115
+ expenses?: number | undefined;
116
+ net?: number | undefined;
117
+ } | undefined;
118
+ warnings?: string[] | undefined;
119
+ }, {
120
+ transactions: {
121
+ date: string;
122
+ description: string;
123
+ amountSigned: number;
124
+ currency?: string | undefined;
125
+ balance?: number | undefined;
126
+ source?: "email" | "file" | undefined;
127
+ confidence?: "low" | "medium" | "high" | undefined;
128
+ metadata?: Record<string, unknown> | undefined;
129
+ }[];
130
+ metadata?: Record<string, unknown> | undefined;
131
+ statementPeriod?: {
132
+ start: string;
133
+ end: string;
134
+ } | undefined;
135
+ totals?: {
136
+ income?: number | undefined;
137
+ expenses?: number | undefined;
138
+ net?: number | undefined;
139
+ } | undefined;
140
+ warnings?: string[] | undefined;
141
+ }>;
142
+ type NormalizedExpenseReport = z.infer<typeof NormalizedExpenseReportSchema>;
143
+ /**
144
+ * Validate a transaction against the schema
145
+ */
146
+ declare function validateTransaction(data: unknown): NormalizedTransaction;
147
+ /**
148
+ * Validate an expense report against the schema
149
+ */
150
+ declare function validateExpenseReport(data: unknown): NormalizedExpenseReport;
151
+
152
+ export { type NormalizedExpenseReport, NormalizedExpenseReportSchema, type NormalizedTransaction, NormalizedTransactionSchema, SCHEMA_VERSION, validateExpenseReport, validateTransaction };
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/schema/parsing.ts
4
+ var SCHEMA_VERSION = "1.0.0";
5
+ var NormalizedTransactionSchema = z.object({
6
+ date: z.string().datetime(),
7
+ // ISO 8601
8
+ description: z.string(),
9
+ amountSigned: z.number(),
10
+ // Positive for income, negative for expenses
11
+ currency: z.string().optional().default("USD"),
12
+ balance: z.number().optional(),
13
+ source: z.enum(["email", "file"]).optional(),
14
+ confidence: z.enum(["low", "medium", "high"]).optional().default("medium"),
15
+ metadata: z.record(z.unknown()).optional()
16
+ });
17
+ var NormalizedExpenseReportSchema = z.object({
18
+ statementPeriod: z.object({
19
+ start: z.string().datetime(),
20
+ end: z.string().datetime()
21
+ }).optional(),
22
+ transactions: z.array(NormalizedTransactionSchema),
23
+ totals: z.object({
24
+ income: z.number().optional(),
25
+ expenses: z.number().optional(),
26
+ net: z.number().optional()
27
+ }).optional(),
28
+ warnings: z.array(z.string()).optional(),
29
+ metadata: z.record(z.unknown()).optional()
30
+ });
31
+ function validateTransaction(data) {
32
+ return NormalizedTransactionSchema.parse(data);
33
+ }
34
+ function validateExpenseReport(data) {
35
+ return NormalizedExpenseReportSchema.parse(data);
36
+ }
37
+
38
+ export { NormalizedExpenseReportSchema, NormalizedTransactionSchema, SCHEMA_VERSION, validateExpenseReport, validateTransaction };
39
+ //# sourceMappingURL=index.js.map
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schema/parsing.ts"],"names":[],"mappings":";;;AAMO,IAAM,cAAA,GAAiB;AAKvB,IAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EAClD,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAC1B,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA;AAAA,EACvB,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC7C,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,MAAA,EAAQ,EAAE,IAAA,CAAK,CAAC,SAAS,MAAM,CAAC,EAAE,QAAA,EAAS;AAAA,EAC3C,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzE,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,IAAM,6BAAA,GAAgC,EAAE,MAAA,CAAO;AAAA,EACpD,eAAA,EAAiB,EACd,MAAA,CAAO;AAAA,IACN,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,2BAA2B,CAAA;AAAA,EACjD,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC9B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACvC,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,SAAS,oBAAoB,IAAA,EAAsC;AACxE,EAAA,OAAO,2BAAA,CAA4B,MAAM,IAAI,CAAA;AAC/C;AAKO,SAAS,sBAAsB,IAAA,EAAwC;AAC5E,EAAA,OAAO,6BAAA,CAA8B,MAAM,IAAI,CAAA;AACjD","file":"index.js","sourcesContent":["import { z } from 'zod'\n\n/**\n * Schema version for parsing results\n * Increment when breaking changes are made\n */\nexport const SCHEMA_VERSION = '1.0.0'\n\n/**\n * Normalized transaction schema\n */\nexport const NormalizedTransactionSchema = z.object({\n date: z.string().datetime(), // ISO 8601\n description: z.string(),\n amountSigned: z.number(), // Positive for income, negative for expenses\n currency: z.string().optional().default('USD'),\n balance: z.number().optional(),\n source: z.enum(['email', 'file']).optional(),\n confidence: z.enum(['low', 'medium', 'high']).optional().default('medium'),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedTransaction = z.infer<typeof NormalizedTransactionSchema>\n\n/**\n * Normalized expense report schema\n */\nexport const NormalizedExpenseReportSchema = z.object({\n statementPeriod: z\n .object({\n start: z.string().datetime(),\n end: z.string().datetime(),\n })\n .optional(),\n transactions: z.array(NormalizedTransactionSchema),\n totals: z\n .object({\n income: z.number().optional(),\n expenses: z.number().optional(),\n net: z.number().optional(),\n })\n .optional(),\n warnings: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n})\n\nexport type NormalizedExpenseReport = z.infer<typeof NormalizedExpenseReportSchema>\n\n/**\n * Validate a transaction against the schema\n */\nexport function validateTransaction(data: unknown): NormalizedTransaction {\n return NormalizedTransactionSchema.parse(data)\n}\n\n/**\n * Validate an expense report against the schema\n */\nexport function validateExpenseReport(data: unknown): NormalizedExpenseReport {\n return NormalizedExpenseReportSchema.parse(data)\n}\n\n"]}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@xpns-it/shared",
3
+ "version": "1.0.0",
4
+ "description": "Shared types, DTOs, and schemas for xpns.it",
5
+ "private": false,
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ },
16
+ "./dto": {
17
+ "types": "./dist/dto/index.d.ts",
18
+ "import": "./dist/dto/index.js",
19
+ "require": "./dist/dto/index.cjs"
20
+ },
21
+ "./schema": {
22
+ "types": "./dist/schema/index.d.ts",
23
+ "import": "./dist/schema/index.js",
24
+ "require": "./dist/schema/index.cjs"
25
+ },
26
+ "./db": {
27
+ "types": "./dist/db/index.d.ts",
28
+ "import": "./dist/db/index.js",
29
+ "require": "./dist/db/index.cjs"
30
+ }
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsup",
37
+ "dev": "tsup --watch",
38
+ "typecheck": "tsc --noEmit",
39
+ "prepublishOnly": "npm run build"
40
+ },
41
+ "keywords": [],
42
+ "author": "",
43
+ "license": "ISC",
44
+ "dependencies": {
45
+ "zod": "^3.22.4"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^20.0.0",
49
+ "tsup": "^8.0.0",
50
+ "typescript": "^5.0.0"
51
+ }
52
+ }
53
+