@danielarndt0/cnpj-db-loader 2.2.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.
@@ -0,0 +1,969 @@
1
+ declare class AppError extends Error {
2
+ readonly code: string;
3
+ readonly details?: unknown;
4
+ constructor(message: string, code?: string, details?: unknown);
5
+ }
6
+
7
+ declare class ServiceError extends AppError {
8
+ constructor(message: string, details?: unknown);
9
+ }
10
+
11
+ declare class ValidationError extends AppError {
12
+ constructor(message: string, details?: unknown);
13
+ }
14
+
15
+ type AppEnvironment = "development" | "test" | "production";
16
+ type AppConfig = {
17
+ appName: string;
18
+ version: string;
19
+ environment: AppEnvironment;
20
+ description: string;
21
+ };
22
+ type DatasetBlock = "companies" | "establishments" | "partners" | "simples_options" | "countries" | "cities" | "partner_qualifications" | "legal_natures" | "cnaes";
23
+ type DatabaseConfig = {
24
+ defaultDbUrl?: string;
25
+ };
26
+
27
+ type Result<T> = {
28
+ ok: true;
29
+ data: T;
30
+ };
31
+ type Failure = {
32
+ ok: false;
33
+ error: string;
34
+ };
35
+
36
+ declare function ensureDirectory(filePath: string): Promise<void>;
37
+ declare function safeReadText(filePath: string): Promise<string | undefined>;
38
+ declare function safeWriteText(filePath: string, content: string): Promise<void>;
39
+
40
+ declare function prettyJson(value: unknown): string;
41
+
42
+ declare function toTitleCase(value: string): string;
43
+
44
+ declare function defaultExtractedOutputPath(inputPath: string): string;
45
+
46
+ type SupportedOs = "windows" | "macos" | "linux" | "unknown";
47
+ declare function detectOs(): SupportedOs;
48
+
49
+ declare function readDatabaseConfig(): Promise<DatabaseConfig>;
50
+ declare function writeDatabaseConfig(config: DatabaseConfig): Promise<void>;
51
+ declare function assertPostgresUrl(url: string): void;
52
+ declare function setDefaultDbUrl(url: string): Promise<void>;
53
+ declare function resetDefaultDbUrl(): Promise<void>;
54
+
55
+ type FieldDefinition = {
56
+ sourceLabel: string;
57
+ columnName: string;
58
+ dataType: "text" | "integer" | "numeric" | "date" | "boolean";
59
+ nullable?: boolean;
60
+ notes?: string;
61
+ };
62
+ type TableLayout = {
63
+ key: string;
64
+ tableName: string;
65
+ sourceName: string;
66
+ description: string;
67
+ fields: FieldDefinition[];
68
+ };
69
+
70
+ type DatasetType = "companies" | "establishments" | "partners" | "simples_options" | "countries" | "cities" | "partner_qualifications" | "legal_natures" | "cnaes" | "reasons" | "zip-archive" | "unknown";
71
+ type InputDetectionMode = "zip-archives-only" | "extracted-tree" | "mixed" | "empty";
72
+ type FileInspection = {
73
+ relativePath: string;
74
+ entryName: string;
75
+ entryKind: "file" | "directory";
76
+ size: number;
77
+ inferredType: DatasetType;
78
+ requiresExtraction: boolean;
79
+ };
80
+ type InspectSummary = {
81
+ inputPath: string;
82
+ detectedInputMode: InputDetectionMode;
83
+ totalEntries: number;
84
+ zipArchivesFound: number;
85
+ extractedEntriesFound: number;
86
+ recognizedByType: Record<string, number>;
87
+ recognizedDatasets: Partial<Record<DatasetType, number>>;
88
+ warnings: string[];
89
+ nextStep?: string | undefined;
90
+ entries: FileInspection[];
91
+ };
92
+ declare function inspectFiles(inputPath: string): Promise<InspectSummary>;
93
+
94
+ type ImportDatasetType = Exclude<DatasetType, "zip-archive" | "unknown">;
95
+ type ImportCheckpointStatus = "pending" | "in_progress" | "completed" | "failed";
96
+ type ImportCheckpointRecord = {
97
+ dataset: ImportDatasetType;
98
+ filePath: string;
99
+ fileSize: number;
100
+ fileMtime: Date;
101
+ byteOffset: number;
102
+ rowsCommitted: number;
103
+ status: ImportCheckpointStatus;
104
+ lastError?: string | null;
105
+ };
106
+ type ImportFilePlan = {
107
+ dataset: ImportDatasetType;
108
+ absolutePath: string;
109
+ displayPath: string;
110
+ fileSize: number;
111
+ fileMtime: Date;
112
+ totalRows: number;
113
+ totalBatches: number;
114
+ checkpoint?: ImportCheckpointRecord;
115
+ };
116
+ type ImportDatasetPlan = {
117
+ dataset: ImportDatasetType;
118
+ files: ImportFilePlan[];
119
+ totalRows: number;
120
+ totalBatches: number;
121
+ };
122
+ type ImportPlanStatus = "planned" | "in_progress" | "completed" | "failed" | "cancelled";
123
+ type ImportPhaseStatus = "pending" | "in_progress" | "completed" | "failed";
124
+ type ImportPlanRecord = {
125
+ id: number;
126
+ sourceFingerprint: string;
127
+ inputPath: string;
128
+ validatedPath: string;
129
+ batchSize: number;
130
+ targetDatabase: string;
131
+ totalDatasets: number;
132
+ totalFiles: number;
133
+ totalRows: number;
134
+ totalBatches: number;
135
+ executionOrder: ImportDatasetType[];
136
+ status: ImportPlanStatus;
137
+ loadStatus: ImportPhaseStatus;
138
+ materializationStatus: ImportPhaseStatus;
139
+ lastPhase: string | null;
140
+ lastError: string | null;
141
+ createdAt: Date;
142
+ updatedAt: Date;
143
+ lastUsedAt: Date;
144
+ };
145
+ type ImportSchemaCapabilities = {
146
+ includeEstablishmentCnpjFullInInsert: boolean;
147
+ includePartnerDedupeKeyInInsert: boolean;
148
+ requiresLookupReconciliation: boolean;
149
+ };
150
+ type ImportDatasetPerformanceSummary = {
151
+ dataset: ImportDatasetType;
152
+ files: number;
153
+ plannedRows: number;
154
+ importedRows: number;
155
+ plannedBatches: number;
156
+ committedBatches: number;
157
+ resumedFiles: number;
158
+ skippedCompletedFiles: number;
159
+ retriedRows: number;
160
+ retriedBatches: number;
161
+ quarantinedRows: number;
162
+ scanDurationMs: number;
163
+ importDurationMs: number;
164
+ insertDurationMs: number;
165
+ retryDurationMs: number;
166
+ quarantineDurationMs: number;
167
+ materializationDurationMs: number;
168
+ rowsPerSecond: number;
169
+ batchesPerMinute: number;
170
+ };
171
+ type ImportPerformanceSummary = {
172
+ planReused: boolean;
173
+ totalDurationMs: number;
174
+ scanDurationMs: number;
175
+ executionDurationMs: number;
176
+ lookupLoadDurationMs: number;
177
+ insertDurationMs: number;
178
+ retryDurationMs: number;
179
+ quarantineDurationMs: number;
180
+ materializationDurationMs: number;
181
+ rowsPerSecond: number;
182
+ batchesPerMinute: number;
183
+ datasets: ImportDatasetPerformanceSummary[];
184
+ };
185
+ type ImportProgressEvent = {
186
+ kind: "preparing_start";
187
+ inputPath: string;
188
+ validatedPath: string;
189
+ totalDatasets: number;
190
+ totalFiles: number;
191
+ batchSize: number;
192
+ loadBatchSize?: number;
193
+ materializeBatchSize?: number;
194
+ targetDatabase: string;
195
+ } | {
196
+ kind: "preparing_progress";
197
+ scannedFiles: number;
198
+ totalFiles: number;
199
+ countedRows: number;
200
+ currentFileDisplayPath: string;
201
+ } | {
202
+ kind: "plan_ready";
203
+ totalDatasets: number;
204
+ totalFiles: number;
205
+ batchSize: number;
206
+ loadBatchSize?: number;
207
+ materializeBatchSize?: number;
208
+ totalRows: number;
209
+ totalBatches: number;
210
+ targetDatabase: string;
211
+ executionOrder: ImportDatasetType[];
212
+ reused: boolean;
213
+ planId: number | null;
214
+ } | {
215
+ kind: "start";
216
+ inputPath: string;
217
+ validatedPath: string;
218
+ totalDatasets: number;
219
+ totalFiles: number;
220
+ targetDatabase: string;
221
+ totalRows: number;
222
+ totalBatches: number;
223
+ committedRows: number;
224
+ committedBatches: number;
225
+ } | {
226
+ kind: "progress";
227
+ dataset: ImportDatasetType;
228
+ datasetIndex: number;
229
+ totalDatasets: number;
230
+ currentFilePath: string;
231
+ currentFileDisplayPath: string;
232
+ fileIndex: number;
233
+ completedFiles: number;
234
+ totalFiles: number;
235
+ currentFileRowsCommitted: number;
236
+ currentFileRowsTotal: number;
237
+ committedRows: number;
238
+ committedBatches: number;
239
+ totalBatches: number;
240
+ currentBatch: number;
241
+ batchSize: number;
242
+ checkpointOffset: number;
243
+ currentFileSize: number;
244
+ verboseProgress: boolean;
245
+ } | {
246
+ kind: "materialization_start";
247
+ totalDatasets: number;
248
+ datasets: ImportDatasetType[];
249
+ completedFiles: number;
250
+ totalFiles: number;
251
+ processedRows: number;
252
+ totalRows: number;
253
+ committedBatches: number;
254
+ totalBatches: number;
255
+ } | {
256
+ kind: "materialization_progress";
257
+ dataset: ImportDatasetType;
258
+ datasetIndex: number;
259
+ totalDatasets: number;
260
+ completedDatasets: number;
261
+ targetTable: string;
262
+ stepLabel: string;
263
+ completedFiles: number;
264
+ totalFiles: number;
265
+ processedRows: number;
266
+ totalRows: number;
267
+ committedBatches: number;
268
+ totalBatches: number;
269
+ elapsedMs?: number;
270
+ reason?: string;
271
+ chunkSize?: number;
272
+ rowsMaterialized?: number;
273
+ datasetRowCount?: number;
274
+ chunksCompleted?: number;
275
+ estimatedChunks?: number;
276
+ lastStagingId?: number;
277
+ } | {
278
+ kind: "materialization_finish";
279
+ totalDatasets: number;
280
+ completedDatasets: number;
281
+ } | {
282
+ kind: "finish";
283
+ totalDatasets: number;
284
+ totalFiles: number;
285
+ completedFiles: number;
286
+ processedRows: number;
287
+ totalRows: number;
288
+ committedBatches: number;
289
+ totalBatches: number;
290
+ quarantinedRows: number;
291
+ };
292
+ type ImportProgressListener = (event: ImportProgressEvent) => void;
293
+ type ImportOptions = {
294
+ dbUrl?: string;
295
+ dataset?: ImportDatasetType | undefined;
296
+ batchSize?: number | undefined;
297
+ loadBatchSize?: number | undefined;
298
+ materializeBatchSize?: number | undefined;
299
+ verboseProgress?: boolean | undefined;
300
+ onProgress?: ImportProgressListener | undefined;
301
+ };
302
+ type ImportExecutionMode = "full" | "load" | "materialize";
303
+ type ImportSummary = {
304
+ executionMode: ImportExecutionMode;
305
+ inputPath: string;
306
+ validatedPath: string;
307
+ targetDatabase: string;
308
+ importPlanId: number | null;
309
+ reusedImportPlan: boolean;
310
+ importedDatasets: ImportDatasetType[];
311
+ importedFiles: number;
312
+ processedRows: number;
313
+ plannedRows: number;
314
+ committedBatches: number;
315
+ plannedBatches: number;
316
+ quarantinedRows: number;
317
+ resumedFiles: number;
318
+ skippedCompletedFiles: number;
319
+ datasetSummaries: Array<{
320
+ dataset: ImportDatasetType;
321
+ files: number;
322
+ rows: number;
323
+ }>;
324
+ performance: ImportPerformanceSummary;
325
+ warnings: string[];
326
+ progressLogPath: string;
327
+ };
328
+
329
+ type DatabaseCleanupScope = "staging" | "materialized" | "checkpoints" | "plans";
330
+ type CheckpointCleanupPhase = "load" | "materialization" | "all";
331
+ type DatabaseCleanupSummary = {
332
+ scope: DatabaseCleanupScope;
333
+ targetDatabase: string;
334
+ dataset?: ImportDatasetType | undefined;
335
+ phase?: CheckpointCleanupPhase | undefined;
336
+ validatedPath?: string | undefined;
337
+ planId?: number | undefined;
338
+ truncatedTables: string[];
339
+ deletedLoadCheckpoints: number;
340
+ deletedMaterializationCheckpoints: number;
341
+ deletedPlans: number;
342
+ notes: string[];
343
+ };
344
+
345
+ declare function resolveDatabaseUrl(override?: string): Promise<string>;
346
+ declare function testDatabaseConnection(url: string): Promise<void>;
347
+ declare function cleanupDatabaseStagingData(options?: {
348
+ dbUrl?: string;
349
+ dataset?: ImportDatasetType | undefined;
350
+ validatedPath?: string | undefined;
351
+ }): Promise<DatabaseCleanupSummary>;
352
+ declare function cleanupDatabaseMaterializedData(options?: {
353
+ dbUrl?: string;
354
+ dataset?: ImportDatasetType | undefined;
355
+ }): Promise<DatabaseCleanupSummary>;
356
+ declare function cleanupDatabaseCheckpointsData(options?: {
357
+ dbUrl?: string;
358
+ phase?: CheckpointCleanupPhase | undefined;
359
+ dataset?: ImportDatasetType | undefined;
360
+ validatedPath?: string | undefined;
361
+ planId?: number | undefined;
362
+ }): Promise<DatabaseCleanupSummary>;
363
+ declare function cleanupDatabasePlansData(options?: {
364
+ dbUrl?: string;
365
+ validatedPath?: string | undefined;
366
+ planId?: number | undefined;
367
+ }): Promise<DatabaseCleanupSummary>;
368
+ declare function resolveDbUrl(override?: string): Promise<string>;
369
+
370
+ declare function getAllLayouts(): TableLayout[];
371
+ declare function getLayoutSummary(): Array<Pick<TableLayout, "key" | "tableName" | "sourceName">>;
372
+
373
+ declare function runDoctor(inputPath?: string, dbUrl?: string): Promise<string[]>;
374
+
375
+ declare const SCHEMA_PROFILES: readonly ["full", "final", "staging"];
376
+ type SchemaProfile = (typeof SCHEMA_PROFILES)[number];
377
+ type SchemaGenerationOptions = {
378
+ profile?: SchemaProfile;
379
+ };
380
+
381
+ declare function generateSchemaSql(options?: SchemaGenerationOptions): string;
382
+ declare function writeSchemaFile(outFile: string, options?: SchemaGenerationOptions): Promise<void>;
383
+ declare function resolveSchemaProfile(profile?: string): SchemaProfile;
384
+
385
+ type ValidationSummary = {
386
+ ok: boolean;
387
+ errors: string[];
388
+ warnings: string[];
389
+ inspected: InspectSummary;
390
+ validatedPath: string;
391
+ presentDatasets: DatasetType[];
392
+ missingDatasets: DatasetType[];
393
+ nextStep?: string | undefined;
394
+ };
395
+ declare function validateInputDirectory(inputPath: string): Promise<ValidationSummary>;
396
+
397
+ type ExtractionEntry = {
398
+ archivePath: string;
399
+ archiveName: string;
400
+ destinationPath: string;
401
+ success: boolean;
402
+ sizeInBytes: number;
403
+ errorMessage?: string;
404
+ };
405
+ type ExtractionSummary = {
406
+ inputPath: string;
407
+ outputPath: string;
408
+ operatingSystem: string;
409
+ zipFilesFound: number;
410
+ extractedArchives: string[];
411
+ skippedEntries: string[];
412
+ failedArchives: string[];
413
+ totalArchiveBytes: number;
414
+ extractedArchiveBytes: number;
415
+ entries: ExtractionEntry[];
416
+ };
417
+ type ExtractionProgressEvent = {
418
+ kind: "start";
419
+ totalArchives: number;
420
+ totalBytes: number;
421
+ inputPath: string;
422
+ outputPath: string;
423
+ } | {
424
+ kind: "archive-start";
425
+ currentArchiveName: string;
426
+ currentArchivePath: string;
427
+ archiveSizeInBytes: number;
428
+ archiveIndex: number;
429
+ totalArchives: number;
430
+ completedArchives: number;
431
+ extractedBytes: number;
432
+ totalBytes: number;
433
+ } | {
434
+ kind: "archive-complete";
435
+ currentArchiveName: string;
436
+ currentArchivePath: string;
437
+ archiveSizeInBytes: number;
438
+ archiveIndex: number;
439
+ totalArchives: number;
440
+ completedArchives: number;
441
+ extractedBytes: number;
442
+ totalBytes: number;
443
+ } | {
444
+ kind: "archive-failed";
445
+ currentArchiveName: string;
446
+ currentArchivePath: string;
447
+ archiveSizeInBytes: number;
448
+ archiveIndex: number;
449
+ totalArchives: number;
450
+ completedArchives: number;
451
+ extractedBytes: number;
452
+ totalBytes: number;
453
+ errorMessage: string;
454
+ } | {
455
+ kind: "finish";
456
+ totalArchives: number;
457
+ completedArchives: number;
458
+ failedArchives: number;
459
+ extractedBytes: number;
460
+ totalBytes: number;
461
+ outputPath: string;
462
+ };
463
+ type ExtractionProgressListener = (event: ExtractionProgressEvent) => void;
464
+ declare function extractArchives(inputPath: string, outputPath?: string, onProgress?: ExtractionProgressListener): Promise<ExtractionSummary>;
465
+
466
+ type InputMode = "unzip" | "already-extracted";
467
+ declare function resolveInputMode(options: {
468
+ unzip?: boolean;
469
+ alreadyExtracted?: boolean;
470
+ }): InputMode;
471
+
472
+ declare const LOG_LEVELS: readonly ["trace", "debug", "info", "warning", "error", "critical", "fatal"];
473
+ type LogLevel = (typeof LOG_LEVELS)[number];
474
+ declare const LOG_STATUSES: readonly ["success", "failure"];
475
+ type LogStatus = (typeof LOG_STATUSES)[number];
476
+ type LogRecord = Record<string, unknown>;
477
+ type StructuredLogEntry = LogRecord & {
478
+ timestamp: string;
479
+ level: LogLevel;
480
+ severity: LogLevel;
481
+ event: string;
482
+ kind: string;
483
+ command?: string;
484
+ status?: LogStatus;
485
+ message?: string;
486
+ };
487
+
488
+ type WriteLogOptions = {
489
+ baseDirectory?: string;
490
+ event?: string;
491
+ level?: LogLevel;
492
+ status?: LogStatus;
493
+ message?: string;
494
+ };
495
+ declare function getUserAppDirectoryPath(): string;
496
+ declare function getLogsDirectoryPath(baseDirectory?: string): string;
497
+ declare function writeCommandLog(commandName: string, payload: unknown, baseDirectoryOrOptions?: string | WriteLogOptions, maybeOptions?: Omit<WriteLogOptions, "baseDirectory">): Promise<string>;
498
+ declare function writeCommandFailureLog(commandName: string, error: unknown, input?: {
499
+ argv?: string[];
500
+ context?: Record<string, unknown>;
501
+ baseDirectory?: string;
502
+ fatal?: boolean;
503
+ }): Promise<string>;
504
+ declare function createJsonLinesLog(commandName: string, baseDirectory?: string): Promise<string>;
505
+ declare function appendJsonLinesLog(filePath: string, payload: unknown, options?: Omit<WriteLogOptions, "baseDirectory" | "status"> & {
506
+ command?: string;
507
+ status?: LogStatus;
508
+ }): Promise<void>;
509
+
510
+ declare function importDataToDatabase(inputPath: string, options?: ImportOptions): Promise<ImportSummary>;
511
+ declare function loadImportDataToStaging(inputPath: string, options?: ImportOptions): Promise<ImportSummary>;
512
+ declare function materializeImportedData(inputPath: string, options?: ImportOptions): Promise<ImportSummary>;
513
+
514
+ type QuarantineStatsFilters = {
515
+ dataset?: string;
516
+ category?: string;
517
+ stage?: string;
518
+ retryable?: boolean;
519
+ terminal?: boolean;
520
+ };
521
+ type QuarantineListFilters = QuarantineStatsFilters & {
522
+ limit: number;
523
+ afterId?: number;
524
+ };
525
+ type QuarantineStatsCount = {
526
+ key: string;
527
+ count: number;
528
+ };
529
+ type QuarantineStatsSummary = {
530
+ totalRows: number;
531
+ retryableRows: number;
532
+ terminalRows: number;
533
+ rowsByDataset: QuarantineStatsCount[];
534
+ rowsByCategory: QuarantineStatsCount[];
535
+ rowsByStage: QuarantineStatsCount[];
536
+ appliedFilters: QuarantineStatsFilters;
537
+ };
538
+ type QuarantineListRow = {
539
+ id: number;
540
+ dataset: string;
541
+ filePath: string;
542
+ rowNumber: number | null;
543
+ checkpointOffset: number | null;
544
+ errorCode: string | null;
545
+ errorCategory: string | null;
546
+ errorStage: string | null;
547
+ errorMessage: string;
548
+ retryCount: number;
549
+ canRetryLater: boolean;
550
+ createdAt: string;
551
+ };
552
+ type QuarantineListSummary = {
553
+ rows: QuarantineListRow[];
554
+ appliedFilters: QuarantineListFilters;
555
+ };
556
+ type QuarantineRecord = {
557
+ id: number;
558
+ dataset: string;
559
+ filePath: string;
560
+ rowNumber: number | null;
561
+ checkpointOffset: number | null;
562
+ errorCode: string | null;
563
+ errorCategory: string | null;
564
+ errorStage: string | null;
565
+ errorMessage: string;
566
+ rawLine: string;
567
+ parsedPayload: Record<string, unknown> | null;
568
+ sanitizationsApplied: unknown[];
569
+ retryCount: number;
570
+ canRetryLater: boolean;
571
+ createdAt: string;
572
+ };
573
+
574
+ declare function getQuarantineStats(filters: QuarantineStatsFilters & {
575
+ dbUrl?: string;
576
+ }): Promise<QuarantineStatsSummary>;
577
+ declare function listQuarantineRows(filters: QuarantineListFilters & {
578
+ dbUrl?: string;
579
+ }): Promise<QuarantineListSummary>;
580
+ declare function showQuarantineRow(id: number, options?: {
581
+ dbUrl?: string;
582
+ }): Promise<QuarantineRecord>;
583
+
584
+ type SanitizeDatasetType = Exclude<DatasetType, "zip-archive" | "unknown">;
585
+ type SanitizeFilePlan = {
586
+ dataset: SanitizeDatasetType;
587
+ relativePath: string;
588
+ absolutePath: string;
589
+ outputPath: string;
590
+ displayPath: string;
591
+ fileSize: number;
592
+ };
593
+ type SanitizePlan = {
594
+ validatedPath: string;
595
+ outputPath: string;
596
+ totalFiles: number;
597
+ totalBytes: number;
598
+ datasets: SanitizeDatasetType[];
599
+ files: SanitizeFilePlan[];
600
+ };
601
+ type SanitizeSummary = {
602
+ inputPath: string;
603
+ validatedPath: string;
604
+ outputPath: string;
605
+ totalFiles: number;
606
+ totalBytes: number;
607
+ processedFiles: number;
608
+ processedRows: number;
609
+ nulBytesRemoved: number;
610
+ changedFiles: number;
611
+ unchangedFiles: number;
612
+ datasets: SanitizeDatasetType[];
613
+ files: Array<{
614
+ dataset: SanitizeDatasetType;
615
+ relativePath: string;
616
+ outputPath: string;
617
+ lineCount: number;
618
+ changed: boolean;
619
+ nulBytesRemoved: number;
620
+ }>;
621
+ warnings: string[];
622
+ nextStep?: string | undefined;
623
+ };
624
+ type SanitizeProgressEvent = {
625
+ kind: "start";
626
+ validatedPath: string;
627
+ outputPath: string;
628
+ totalFiles: number;
629
+ totalBytes: number;
630
+ datasets: SanitizeDatasetType[];
631
+ } | {
632
+ kind: "progress";
633
+ currentFileDisplayPath: string;
634
+ fileIndex: number;
635
+ totalFiles: number;
636
+ bytesProcessed: number;
637
+ totalBytes: number;
638
+ fileBytesProcessed: number;
639
+ currentFileSize: number;
640
+ processedRows: number;
641
+ nulBytesRemoved: number;
642
+ changedFiles: number;
643
+ } | {
644
+ kind: "finish";
645
+ totalFiles: number;
646
+ processedRows: number;
647
+ nulBytesRemoved: number;
648
+ changedFiles: number;
649
+ totalBytes: number;
650
+ };
651
+ type SanitizeProgressListener = (event: SanitizeProgressEvent) => void;
652
+ type SanitizeOptions = {
653
+ outputPath?: string | undefined;
654
+ dataset?: SanitizeDatasetType | undefined;
655
+ onProgress?: SanitizeProgressListener | undefined;
656
+ };
657
+
658
+ declare function sanitizeInputDirectory(inputPath: string, options?: SanitizeOptions): Promise<SanitizeSummary>;
659
+
660
+ type FederalRevenueReferenceMode = "latest" | "current" | "explicit";
661
+ type FederalRevenueClientOptions = {
662
+ baseUrl?: string | undefined;
663
+ shareToken?: string | undefined;
664
+ userAgent?: string | undefined;
665
+ };
666
+ type FederalRevenueReference = {
667
+ reference: string;
668
+ href: string;
669
+ };
670
+ type FederalRevenueFile = {
671
+ name: string;
672
+ href: string;
673
+ downloadUrl: string;
674
+ sizeInBytes?: number | undefined;
675
+ lastModified?: string | undefined;
676
+ etag?: string | undefined;
677
+ };
678
+ type FederalRevenueReferenceSelection = {
679
+ mode: FederalRevenueReferenceMode;
680
+ selectedReference: string;
681
+ availableReferences: string[];
682
+ };
683
+ type FederalRevenueCheckOptions = FederalRevenueClientOptions & {
684
+ reference?: string | undefined;
685
+ current?: boolean | undefined;
686
+ };
687
+ type FederalRevenueCheckSummary = {
688
+ selectedReference: string;
689
+ selectionMode: FederalRevenueReferenceMode;
690
+ availableReferences: string[];
691
+ files: FederalRevenueFile[];
692
+ totalFiles: number;
693
+ totalBytes: number;
694
+ remoteBaseUrl: string;
695
+ };
696
+ type FederalRevenueDownloadStatus = "downloaded" | "skipped" | "failed";
697
+ type FederalRevenueLocalFileStatus = "downloaded" | "failed" | "partial" | "missing";
698
+ type FederalRevenueManifestLastCommand = "download" | "sync" | "retry";
699
+ type FederalRevenueManifestLastStatus = "running" | "completed" | "failed";
700
+ type FederalRevenueManifestFile = {
701
+ fileName: string;
702
+ filePath: string;
703
+ partialFilePath: string;
704
+ href: string;
705
+ downloadUrl: string;
706
+ status: FederalRevenueLocalFileStatus;
707
+ updatedAt: string;
708
+ remoteSizeInBytes?: number | undefined;
709
+ localSizeInBytes?: number | undefined;
710
+ lastModified?: string | undefined;
711
+ etag?: string | undefined;
712
+ downloadedAt?: string | undefined;
713
+ errorMessage?: string | undefined;
714
+ };
715
+ type FederalRevenueManifest = {
716
+ version: 1;
717
+ reference: string;
718
+ remoteBaseUrl: string;
719
+ outputPath: string;
720
+ createdAt: string;
721
+ updatedAt: string;
722
+ lastCommand: FederalRevenueManifestLastCommand;
723
+ lastStatus: FederalRevenueManifestLastStatus;
724
+ files: FederalRevenueManifestFile[];
725
+ };
726
+ type FederalRevenueDownloadEntry = {
727
+ fileName: string;
728
+ filePath: string;
729
+ status: FederalRevenueDownloadStatus;
730
+ sizeInBytes?: number | undefined;
731
+ remoteSizeInBytes?: number | undefined;
732
+ errorMessage?: string | undefined;
733
+ };
734
+ type FederalRevenueDownloadSummary = {
735
+ reference: string;
736
+ selectionMode: FederalRevenueReferenceMode;
737
+ outputPath: string;
738
+ manifestPath: string;
739
+ remoteBaseUrl: string;
740
+ filesFound: number;
741
+ downloadedFiles: number;
742
+ skippedFiles: number;
743
+ failedFiles: number;
744
+ partialFiles: number;
745
+ missingFiles: number;
746
+ totalBytes: number;
747
+ downloadedBytes: number;
748
+ entries: FederalRevenueDownloadEntry[];
749
+ startedAt: string;
750
+ finishedAt: string;
751
+ warnings: string[];
752
+ nextStep?: string | undefined;
753
+ };
754
+ type FederalRevenueDownloadProgressEvent = {
755
+ kind: "start";
756
+ reference: string;
757
+ outputPath: string;
758
+ totalFiles: number;
759
+ totalBytes: number;
760
+ } | {
761
+ kind: "file-start";
762
+ reference: string;
763
+ fileName: string;
764
+ fileIndex: number;
765
+ totalFiles: number;
766
+ completedFiles: number;
767
+ downloadedBytes: number;
768
+ totalBytes: number;
769
+ fileSizeInBytes?: number | undefined;
770
+ } | {
771
+ kind: "file-complete";
772
+ reference: string;
773
+ fileName: string;
774
+ fileIndex: number;
775
+ totalFiles: number;
776
+ completedFiles: number;
777
+ downloadedBytes: number;
778
+ totalBytes: number;
779
+ fileSizeInBytes?: number | undefined;
780
+ } | {
781
+ kind: "file-skipped";
782
+ reference: string;
783
+ fileName: string;
784
+ fileIndex: number;
785
+ totalFiles: number;
786
+ completedFiles: number;
787
+ downloadedBytes: number;
788
+ totalBytes: number;
789
+ fileSizeInBytes?: number | undefined;
790
+ } | {
791
+ kind: "file-failed";
792
+ reference: string;
793
+ fileName: string;
794
+ fileIndex: number;
795
+ totalFiles: number;
796
+ completedFiles: number;
797
+ downloadedBytes: number;
798
+ totalBytes: number;
799
+ errorMessage: string;
800
+ fileSizeInBytes?: number | undefined;
801
+ } | {
802
+ kind: "finish";
803
+ reference: string;
804
+ outputPath: string;
805
+ totalFiles: number;
806
+ downloadedFiles: number;
807
+ skippedFiles: number;
808
+ failedFiles: number;
809
+ downloadedBytes: number;
810
+ totalBytes: number;
811
+ };
812
+ type FederalRevenueDownloadProgressListener = (event: FederalRevenueDownloadProgressEvent) => void;
813
+ type FederalRevenueDownloadOptions = FederalRevenueCheckOptions & {
814
+ outputPath?: string | undefined;
815
+ retries?: number | undefined;
816
+ overwrite?: boolean | undefined;
817
+ incompleteOnly?: boolean | undefined;
818
+ manifestCommand?: FederalRevenueManifestLastCommand | undefined;
819
+ onProgress?: FederalRevenueDownloadProgressListener | undefined;
820
+ };
821
+ type FederalRevenueSyncLockOptions = {
822
+ forceLock?: boolean | undefined;
823
+ };
824
+ type FederalRevenueSyncOptions = FederalRevenueDownloadOptions & FederalRevenueSyncLockOptions & {
825
+ extractOutputPath?: string | undefined;
826
+ sanitizeOutputPath?: string | undefined;
827
+ sanitizeOptions?: Omit<SanitizeOptions, "outputPath" | "onProgress"> | undefined;
828
+ importOptions?: Omit<ImportOptions, "onProgress"> | undefined;
829
+ onExtractProgress?: ExtractionProgressListener | undefined;
830
+ onSanitizeProgress?: SanitizeOptions["onProgress"] | undefined;
831
+ onImportProgress?: ImportOptions["onProgress"] | undefined;
832
+ };
833
+ type FederalRevenueSyncSummary = {
834
+ reference: string;
835
+ download: FederalRevenueDownloadSummary;
836
+ extraction: ExtractionSummary;
837
+ validation: ValidationSummary;
838
+ sanitization: SanitizeSummary;
839
+ import: ImportSummary;
840
+ startedAt: string;
841
+ finishedAt: string;
842
+ warnings: string[];
843
+ };
844
+ type FederalRevenueLocalStatusEntry = {
845
+ fileName: string;
846
+ filePath: string;
847
+ partialFilePath: string;
848
+ status: FederalRevenueLocalFileStatus;
849
+ remoteSizeInBytes?: number | undefined;
850
+ localSizeInBytes?: number | undefined;
851
+ errorMessage?: string | undefined;
852
+ };
853
+ type FederalRevenueStatusOptions = FederalRevenueCheckOptions & {
854
+ outputPath?: string | undefined;
855
+ };
856
+ type FederalRevenueStatusSummary = {
857
+ reference: string;
858
+ selectionMode: FederalRevenueReferenceMode;
859
+ outputPath: string;
860
+ manifestPath: string;
861
+ manifestFound: boolean;
862
+ filesFound: number;
863
+ downloadedFiles: number;
864
+ failedFiles: number;
865
+ partialFiles: number;
866
+ missingFiles: number;
867
+ totalBytes: number;
868
+ localBytes: number;
869
+ isComplete: boolean;
870
+ entries: FederalRevenueLocalStatusEntry[];
871
+ warnings: string[];
872
+ updatedAt?: string | undefined;
873
+ lastCommand?: FederalRevenueManifestLastCommand | undefined;
874
+ lastStatus?: FederalRevenueManifestLastStatus | undefined;
875
+ };
876
+ type FederalRevenueRetryOptions = FederalRevenueDownloadOptions;
877
+ type FederalRevenueCleanMode = "partials" | "failed" | "all";
878
+ type FederalRevenueCleanOptions = FederalRevenueCheckOptions & {
879
+ outputPath?: string | undefined;
880
+ partials?: boolean | undefined;
881
+ failed?: boolean | undefined;
882
+ all?: boolean | undefined;
883
+ };
884
+ type FederalRevenueCleanSummary = {
885
+ reference: string;
886
+ selectionMode: FederalRevenueReferenceMode;
887
+ outputPath: string;
888
+ manifestPath: string;
889
+ mode: FederalRevenueCleanMode;
890
+ removedFiles: number;
891
+ removedBytes: number;
892
+ removedPaths: string[];
893
+ warnings: string[];
894
+ startedAt: string;
895
+ finishedAt: string;
896
+ };
897
+ type FederalRevenueLockFile = {
898
+ reference: string;
899
+ outputPath: string;
900
+ lockPath: string;
901
+ pid: number;
902
+ token: string;
903
+ startedAt: string;
904
+ };
905
+
906
+ declare const DEFAULT_FEDERAL_REVENUE_SHARE_TOKEN = "YggdBLfdninEJX9";
907
+ declare const DEFAULT_FEDERAL_REVENUE_WEBDAV_URL = "https://arquivos.receitafederal.gov.br/public.php/webdav";
908
+ declare const DEFAULT_FEDERAL_REVENUE_USER_AGENT = "cnpj-db-loader federal-revenue-client";
909
+ declare function validateFederalRevenueReference(reference: string): void;
910
+ declare function getCurrentFederalRevenueReference(date?: Date): string;
911
+ declare function listFederalRevenueReferences(options?: FederalRevenueClientOptions): Promise<{
912
+ references: FederalRevenueReference[];
913
+ remoteBaseUrl: string;
914
+ }>;
915
+ declare function resolveFederalRevenueReference(input?: {
916
+ reference?: string | undefined;
917
+ current?: boolean | undefined;
918
+ } & FederalRevenueClientOptions): Promise<FederalRevenueReferenceSelection>;
919
+ declare function listFederalRevenueFiles(reference: string, options?: FederalRevenueClientOptions): Promise<{
920
+ files: FederalRevenueFile[];
921
+ remoteBaseUrl: string;
922
+ }>;
923
+ declare function buildFederalRevenueDownloadHeaders(options?: FederalRevenueClientOptions): Record<string, string>;
924
+
925
+ declare function checkFederalRevenueDataset(options?: FederalRevenueCheckOptions): Promise<FederalRevenueCheckSummary>;
926
+ declare function downloadFederalRevenueDataset(options?: FederalRevenueDownloadOptions): Promise<FederalRevenueDownloadSummary>;
927
+ declare function retryFederalRevenueDataset(options?: FederalRevenueDownloadOptions): Promise<FederalRevenueDownloadSummary>;
928
+
929
+ declare function getFederalRevenueStatus(options?: FederalRevenueStatusOptions): Promise<FederalRevenueStatusSummary>;
930
+
931
+ declare function cleanFederalRevenueDataset(options?: FederalRevenueCleanOptions): Promise<FederalRevenueCleanSummary>;
932
+
933
+ declare function withFederalRevenueSyncLock<T>(input: {
934
+ reference: string;
935
+ outputPath: string;
936
+ options?: FederalRevenueSyncLockOptions | undefined;
937
+ }, callback: () => Promise<T>): Promise<T>;
938
+
939
+ declare const FEDERAL_REVENUE_MANIFEST_VERSION = 1;
940
+ declare const FEDERAL_REVENUE_CONTROL_DIR = ".cnpj-db-loader";
941
+ declare const FEDERAL_REVENUE_CONTROL_SCOPE = "federal-revenue";
942
+ declare const DEFAULT_FEDERAL_REVENUE_DOWNLOAD_ROOT: string;
943
+ declare function buildFederalRevenueReferenceOutputPath(reference: string, outputPath?: string): string;
944
+ declare function getFederalRevenueControlDirectory(outputPath: string): string;
945
+ declare function getFederalRevenueManifestPath(outputPath: string): string;
946
+ declare function getFederalRevenueSyncLockPath(outputPath: string): string;
947
+ declare function readFederalRevenueManifest(outputPath: string): Promise<FederalRevenueManifest | undefined>;
948
+ declare function writeFederalRevenueManifest(manifest: FederalRevenueManifest): Promise<void>;
949
+ declare function createFederalRevenueManifest(input: {
950
+ reference: string;
951
+ outputPath: string;
952
+ remoteBaseUrl: string;
953
+ files: FederalRevenueFile[];
954
+ lastCommand: FederalRevenueManifestLastCommand;
955
+ }): Promise<FederalRevenueManifest>;
956
+ declare function evaluateFederalRevenueManifestFile(entry: FederalRevenueManifestFile): Promise<FederalRevenueManifestFile>;
957
+ declare function evaluateFederalRevenueManifestFiles(entries: FederalRevenueManifestFile[]): Promise<FederalRevenueManifestFile[]>;
958
+ declare function updateFederalRevenueManifestFile(outputPath: string, input: {
959
+ fileName: string;
960
+ status: FederalRevenueLocalFileStatus;
961
+ localSizeInBytes?: number | undefined;
962
+ errorMessage?: string | undefined;
963
+ downloadedAt?: string | undefined;
964
+ }): Promise<void>;
965
+ declare function finalizeFederalRevenueManifest(outputPath: string, lastStatus: FederalRevenueManifest["lastStatus"]): Promise<void>;
966
+
967
+ declare function syncFederalRevenueDataset(options?: FederalRevenueSyncOptions): Promise<FederalRevenueSyncSummary>;
968
+
969
+ export { type AppConfig, type AppEnvironment, AppError, type CheckpointCleanupPhase, DEFAULT_FEDERAL_REVENUE_DOWNLOAD_ROOT, DEFAULT_FEDERAL_REVENUE_SHARE_TOKEN, DEFAULT_FEDERAL_REVENUE_USER_AGENT, DEFAULT_FEDERAL_REVENUE_WEBDAV_URL, type DatabaseCleanupSummary, type DatabaseConfig, type DatasetBlock, type DatasetType, type ExtractionEntry, type ExtractionProgressEvent, type ExtractionProgressListener, type ExtractionSummary, FEDERAL_REVENUE_CONTROL_DIR, FEDERAL_REVENUE_CONTROL_SCOPE, FEDERAL_REVENUE_MANIFEST_VERSION, type Failure, type FederalRevenueCheckOptions, type FederalRevenueCheckSummary, type FederalRevenueCleanMode, type FederalRevenueCleanOptions, type FederalRevenueCleanSummary, type FederalRevenueClientOptions, type FederalRevenueDownloadEntry, type FederalRevenueDownloadOptions, type FederalRevenueDownloadProgressEvent, type FederalRevenueDownloadProgressListener, type FederalRevenueDownloadStatus, type FederalRevenueDownloadSummary, type FederalRevenueFile, type FederalRevenueLocalFileStatus, type FederalRevenueLocalStatusEntry, type FederalRevenueLockFile, type FederalRevenueManifest, type FederalRevenueManifestFile, type FederalRevenueManifestLastCommand, type FederalRevenueManifestLastStatus, type FederalRevenueReference, type FederalRevenueReferenceMode, type FederalRevenueReferenceSelection, type FederalRevenueRetryOptions, type FederalRevenueStatusOptions, type FederalRevenueStatusSummary, type FederalRevenueSyncLockOptions, type FederalRevenueSyncOptions, type FederalRevenueSyncSummary, type FileInspection, type ImportCheckpointRecord, type ImportCheckpointStatus, type ImportDatasetPlan, type ImportDatasetType, type ImportFilePlan, type ImportOptions, type ImportPerformanceSummary, type ImportPhaseStatus, type ImportPlanRecord, type ImportProgressEvent, type ImportProgressListener, type ImportSchemaCapabilities, type ImportSummary, type InputDetectionMode, type InputMode, type InspectSummary, type LogLevel, type LogStatus, type QuarantineListFilters, type QuarantineListSummary, type QuarantineRecord, type QuarantineStatsFilters, type QuarantineStatsSummary, type Result, type SanitizeDatasetType, type SanitizeOptions, type SanitizePlan, type SanitizeProgressEvent, type SanitizeProgressListener, type SanitizeSummary, type SchemaGenerationOptions, type SchemaProfile, ServiceError, type StructuredLogEntry, type SupportedOs, ValidationError, type ValidationSummary, appendJsonLinesLog, assertPostgresUrl, buildFederalRevenueDownloadHeaders, buildFederalRevenueReferenceOutputPath, checkFederalRevenueDataset, cleanFederalRevenueDataset, cleanupDatabaseCheckpointsData, cleanupDatabaseMaterializedData, cleanupDatabasePlansData, cleanupDatabaseStagingData, createFederalRevenueManifest, createJsonLinesLog, defaultExtractedOutputPath, detectOs, downloadFederalRevenueDataset, ensureDirectory, evaluateFederalRevenueManifestFile, evaluateFederalRevenueManifestFiles, extractArchives, finalizeFederalRevenueManifest, generateSchemaSql, getAllLayouts, getCurrentFederalRevenueReference, getFederalRevenueControlDirectory, getFederalRevenueManifestPath, getFederalRevenueStatus, getFederalRevenueSyncLockPath, getLayoutSummary, getLogsDirectoryPath, getQuarantineStats, getUserAppDirectoryPath, importDataToDatabase, inspectFiles, listFederalRevenueFiles, listFederalRevenueReferences, listQuarantineRows, loadImportDataToStaging, materializeImportedData, prettyJson, readDatabaseConfig, readFederalRevenueManifest, resetDefaultDbUrl, resolveDatabaseUrl, resolveDbUrl, resolveFederalRevenueReference, resolveInputMode, resolveSchemaProfile, retryFederalRevenueDataset, runDoctor, safeReadText, safeWriteText, sanitizeInputDirectory, setDefaultDbUrl, showQuarantineRow, syncFederalRevenueDataset, testDatabaseConnection, toTitleCase, updateFederalRevenueManifestFile, validateFederalRevenueReference, validateInputDirectory, withFederalRevenueSyncLock, writeCommandFailureLog, writeCommandLog, writeDatabaseConfig, writeFederalRevenueManifest, writeSchemaFile };