@veritas-lex/contract-analysis-package 1.3.0 → 1.4.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,43 @@
1
+ /**
2
+ * File type detection utilities.
3
+ *
4
+ * Uses a hybrid approach:
5
+ * - **Fast synchronous detection** for unambiguous magic byte signatures
6
+ * (PDF, PNG, JPEG, TIFF, WebP, GIF, BMP, legacy DOC)
7
+ * - **Async `file-type` package** only for ZIP-based formats (PK header)
8
+ * where archive inspection is needed to distinguish DOCX from XLSX/PPTX
9
+ *
10
+ * This avoids unnecessary async overhead for the 90%+ of calls that are
11
+ * simple image/PDF detection (e.g., OCR page buffers).
12
+ */
13
+ import type { AllowedMimeType } from "./file-validation.constants";
14
+ /**
15
+ * Detect MIME type from the magic bytes of a file buffer.
16
+ * Returns only types from the {@link AllowedMimeType} union (for upload validation).
17
+ *
18
+ * **Fast path:** Synchronous check for PDF, PNG, JPEG, TIFF, legacy DOC.
19
+ * **Slow path:** Async `file-type` only for ZIP-based files (DOCX detection).
20
+ *
21
+ * @param buffer - File buffer (at least 4 KB recommended for ZIP-based detection)
22
+ * @returns The detected allowed MIME type, or `null` if unrecognised.
23
+ */
24
+ export declare function detectMimeFromMagicBytes(buffer: Buffer): Promise<AllowedMimeType | null>;
25
+ /**
26
+ * Detect MIME type from buffer magic bytes (general purpose).
27
+ * Supports all known formats including image types used by OCR (WebP, GIF, BMP).
28
+ * Falls back to `'application/pdf'` if detection fails.
29
+ *
30
+ * **Fast path:** Synchronous — covers PDF, PNG, JPEG, TIFF, WebP, GIF, BMP, legacy DOC.
31
+ * **Slow path:** Async `file-type` only for ambiguous ZIP-based formats.
32
+ *
33
+ * @param buffer - Raw file or page buffer
34
+ * @returns The detected MIME type string, never null.
35
+ */
36
+ export declare function detectMimeType(buffer: Buffer): Promise<string>;
37
+ /**
38
+ * Validate that a file's magic bytes are compatible with the declared MIME type.
39
+ *
40
+ * @returns `null` if valid, or a human-readable error string if mismatched.
41
+ */
42
+ export declare function validateMagicBytes(buffer: Buffer, declaredMimeType: string): Promise<string | null>;
43
+ //# sourceMappingURL=file-detection.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-detection.utils.d.ts","sourceRoot":"","sources":["../../src/constants/file-detection.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAgKnE;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAuBjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgCxB"}
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ /**
3
+ * File type detection utilities.
4
+ *
5
+ * Uses a hybrid approach:
6
+ * - **Fast synchronous detection** for unambiguous magic byte signatures
7
+ * (PDF, PNG, JPEG, TIFF, WebP, GIF, BMP, legacy DOC)
8
+ * - **Async `file-type` package** only for ZIP-based formats (PK header)
9
+ * where archive inspection is needed to distinguish DOCX from XLSX/PPTX
10
+ *
11
+ * This avoids unnecessary async overhead for the 90%+ of calls that are
12
+ * simple image/PDF detection (e.g., OCR page buffers).
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.detectMimeFromMagicBytes = detectMimeFromMagicBytes;
16
+ exports.detectMimeType = detectMimeType;
17
+ exports.validateMagicBytes = validateMagicBytes;
18
+ const load_esm_1 = require("load-esm");
19
+ // ── Lazy-loaded ESM module (file-type v21+ is ESM-only) ─────────────
20
+ /** Cached `fileTypeFromBuffer` function, loaded once via `load-esm`. */
21
+ let _fileTypeFromBuffer;
22
+ // ── Synchronous magic byte signatures ────────────────────────────────
23
+ /**
24
+ * Unambiguous magic byte signatures that can be checked synchronously.
25
+ * Each entry maps a byte-level predicate to its canonical MIME type.
26
+ */
27
+ const SYNC_SIGNATURES = [
28
+ // PDF: %PDF
29
+ {
30
+ check: (buf) => buf[0] === 0x25 && buf[1] === 0x50 && buf[2] === 0x44 && buf[3] === 0x46,
31
+ mime: "application/pdf",
32
+ },
33
+ // PNG: 0x89 P N G
34
+ {
35
+ check: (buf) => buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47,
36
+ mime: "image/png",
37
+ },
38
+ // JPEG: 0xFF 0xD8
39
+ {
40
+ check: (buf) => buf[0] === 0xff && buf[1] === 0xd8,
41
+ mime: "image/jpeg",
42
+ },
43
+ // TIFF: II (little-endian) or MM (big-endian)
44
+ {
45
+ check: (buf) => (buf[0] === 0x49 && buf[1] === 0x49 && buf[2] === 0x2a) ||
46
+ (buf[0] === 0x4d &&
47
+ buf[1] === 0x4d &&
48
+ buf[2] === 0x00 &&
49
+ buf[3] === 0x2a),
50
+ mime: "image/tiff",
51
+ },
52
+ // WebP: RIFF....WEBP
53
+ {
54
+ check: (buf) => buf.length > 11 &&
55
+ buf[0] === 0x52 &&
56
+ buf[1] === 0x49 &&
57
+ buf[2] === 0x46 &&
58
+ buf[3] === 0x46 &&
59
+ buf[8] === 0x57 &&
60
+ buf[9] === 0x45 &&
61
+ buf[10] === 0x42 &&
62
+ buf[11] === 0x50,
63
+ mime: "image/webp",
64
+ },
65
+ // GIF: GIF8
66
+ {
67
+ check: (buf) => buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x38,
68
+ mime: "image/gif",
69
+ },
70
+ // BMP: BM
71
+ {
72
+ check: (buf) => buf[0] === 0x42 && buf[1] === 0x4d,
73
+ mime: "image/bmp",
74
+ },
75
+ ];
76
+ // ── Mapping constants ────────────────────────────────────────────────
77
+ /**
78
+ * Map detected MIME strings to our {@link AllowedMimeType} union (upload validation).
79
+ */
80
+ const MIME_TO_ALLOWED = {
81
+ "application/pdf": "application/pdf",
82
+ "image/png": "image/png",
83
+ "image/jpeg": "image/jpeg",
84
+ "image/tiff": "image/tiff",
85
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
86
+ };
87
+ /**
88
+ * DOCX / DOC MIME types for upload-validation compatibility.
89
+ * A DOCX-detected file is compatible with both DOCX and DOC MIME declarations.
90
+ */
91
+ const PK_UPLOAD_COMPATIBLE_MIMES = [
92
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
93
+ "application/msword",
94
+ ];
95
+ // ── Helpers ──────────────────────────────────────────────────────────
96
+ /** Check for legacy MS Office compound binary header (D0 CF 11 E0). */
97
+ function isLegacyDoc(buffer) {
98
+ return (buffer.length >= 4 &&
99
+ buffer[0] === 0xd0 &&
100
+ buffer[1] === 0xcf &&
101
+ buffer[2] === 0x11 &&
102
+ buffer[3] === 0xe0);
103
+ }
104
+ /** Check for ZIP/PK header (0x50 0x4B). */
105
+ function isPkSignature(buffer) {
106
+ return buffer.length >= 2 && buffer[0] === 0x50 && buffer[1] === 0x4b;
107
+ }
108
+ /**
109
+ * Fast synchronous MIME detection for unambiguous signatures.
110
+ * Returns `null` for ZIP-based formats (need async `file-type`) and unknown formats.
111
+ */
112
+ function quickDetectMime(buffer) {
113
+ if (isLegacyDoc(buffer))
114
+ return "application/msword";
115
+ for (const sig of SYNC_SIGNATURES) {
116
+ if (sig.check(buffer))
117
+ return sig.mime;
118
+ }
119
+ return null;
120
+ }
121
+ /**
122
+ * Lazily load `fileTypeFromBuffer` from the ESM-only `file-type` package.
123
+ * Uses `load-esm` to bridge CJS → ESM without eval/Function hacks.
124
+ */
125
+ async function getFileTypeFromBuffer() {
126
+ if (!_fileTypeFromBuffer) {
127
+ const mod = await (0, load_esm_1.loadEsm)("file-type");
128
+ _fileTypeFromBuffer = mod.fileTypeFromBuffer;
129
+ }
130
+ return _fileTypeFromBuffer;
131
+ }
132
+ /**
133
+ * Use the `file-type` package for deep inspection (ZIP-based formats).
134
+ * Wrapped in try-catch to handle small/truncated buffers gracefully.
135
+ */
136
+ async function fileTypeDetect(buffer) {
137
+ try {
138
+ const fromBuffer = await getFileTypeFromBuffer();
139
+ return (await fromBuffer(buffer)) ?? null;
140
+ }
141
+ catch {
142
+ // file-type may throw on buffers that are too small or malformed
143
+ return null;
144
+ }
145
+ }
146
+ // ── Public API ───────────────────────────────────────────────────────
147
+ /**
148
+ * Detect MIME type from the magic bytes of a file buffer.
149
+ * Returns only types from the {@link AllowedMimeType} union (for upload validation).
150
+ *
151
+ * **Fast path:** Synchronous check for PDF, PNG, JPEG, TIFF, legacy DOC.
152
+ * **Slow path:** Async `file-type` only for ZIP-based files (DOCX detection).
153
+ *
154
+ * @param buffer - File buffer (at least 4 KB recommended for ZIP-based detection)
155
+ * @returns The detected allowed MIME type, or `null` if unrecognised.
156
+ */
157
+ async function detectMimeFromMagicBytes(buffer) {
158
+ if (!buffer || buffer.length < 2)
159
+ return null;
160
+ // Fast path: unambiguous signatures (sync)
161
+ const quick = quickDetectMime(buffer);
162
+ if (quick)
163
+ return MIME_TO_ALLOWED[quick] ?? null;
164
+ // ZIP/PK signature → use file-type for archive inspection (DOCX vs XLSX vs PPTX)
165
+ if (isPkSignature(buffer)) {
166
+ const result = await fileTypeDetect(buffer);
167
+ if (result) {
168
+ const mapped = MIME_TO_ALLOWED[result.mime];
169
+ if (mapped)
170
+ return mapped;
171
+ // file-type detected generic 'application/zip' — buffer too small to
172
+ // inspect archive contents and determine specific Office subtype.
173
+ // Fall through to DOCX fallback below.
174
+ }
175
+ // PK header but file-type couldn't determine specific subtype (truncated buffer).
176
+ // Fall back to DOCX since that's the only ZIP-based type we allow for uploads.
177
+ return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
178
+ }
179
+ return null;
180
+ }
181
+ /**
182
+ * Detect MIME type from buffer magic bytes (general purpose).
183
+ * Supports all known formats including image types used by OCR (WebP, GIF, BMP).
184
+ * Falls back to `'application/pdf'` if detection fails.
185
+ *
186
+ * **Fast path:** Synchronous — covers PDF, PNG, JPEG, TIFF, WebP, GIF, BMP, legacy DOC.
187
+ * **Slow path:** Async `file-type` only for ambiguous ZIP-based formats.
188
+ *
189
+ * @param buffer - Raw file or page buffer
190
+ * @returns The detected MIME type string, never null.
191
+ */
192
+ async function detectMimeType(buffer) {
193
+ if (!buffer || buffer.length < 2)
194
+ return "application/pdf";
195
+ // Fast path: unambiguous signatures (sync)
196
+ const quick = quickDetectMime(buffer);
197
+ if (quick)
198
+ return quick;
199
+ // ZIP/PK signature → use file-type for archive inspection
200
+ if (isPkSignature(buffer)) {
201
+ const result = await fileTypeDetect(buffer);
202
+ return result?.mime ?? "application/pdf";
203
+ }
204
+ return "application/pdf";
205
+ }
206
+ /**
207
+ * Validate that a file's magic bytes are compatible with the declared MIME type.
208
+ *
209
+ * @returns `null` if valid, or a human-readable error string if mismatched.
210
+ */
211
+ async function validateMagicBytes(buffer, declaredMimeType) {
212
+ const detectedMime = await detectMimeFromMagicBytes(buffer);
213
+ if (!detectedMime) {
214
+ return `Unable to determine file type from content. The uploaded file may be corrupted or unsupported.`;
215
+ }
216
+ // Determine which declared MIME types are compatible with the detected content
217
+ let compatibleMimes;
218
+ if (detectedMime ===
219
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document") {
220
+ // DOCX signature is compatible with both DOCX and DOC MIME declarations
221
+ compatibleMimes = PK_UPLOAD_COMPATIBLE_MIMES;
222
+ }
223
+ else if (detectedMime === "application/msword") {
224
+ // Legacy DOC is compatible with msword declaration
225
+ compatibleMimes = ["application/msword"];
226
+ }
227
+ else {
228
+ compatibleMimes = [detectedMime];
229
+ }
230
+ if (!compatibleMimes.includes(declaredMimeType)) {
231
+ return (`File content does not match declared type "${declaredMimeType}". ` +
232
+ `Detected content type: "${detectedMime}". ` +
233
+ `Please ensure you are uploading the correct file.`);
234
+ }
235
+ return null;
236
+ }
237
+ //# sourceMappingURL=file-detection.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-detection.utils.js","sourceRoot":"","sources":["../../src/constants/file-detection.utils.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@
4
4
  * Centralised allowlist of accepted MIME types, file extensions,
5
5
  * and the mapping between them. Used by both the DTO validation
6
6
  * layer and the service-level cross-check.
7
+ *
8
+ * For magic byte / content-type detection, see `file-detection.utils.ts`.
7
9
  */
8
10
  /** Maximum upload size in bytes (100 MB — matches Supabase bucket limit) */
9
11
  export declare const MAX_UPLOAD_SIZE_BYTES = 104857600;
@@ -25,27 +27,4 @@ export declare const MIME_TO_EXTENSIONS: Record<AllowedMimeType, string[]>;
25
27
  * @returns `null` if valid, or a human-readable error string if mismatched.
26
28
  */
27
29
  export declare function validateExtensionMimeMatch(filename: string, mimeType: string): string | null;
28
- /**
29
- * Detect MIME type from the magic bytes of a file buffer.
30
- * Returns only types from the {@link AllowedMimeType} union (for upload validation).
31
- *
32
- * @param buffer - First 4-16 bytes of the file (only the head is needed)
33
- * @returns The detected allowed MIME type, or `null` if unrecognised.
34
- */
35
- export declare function detectMimeFromMagicBytes(buffer: Buffer): AllowedMimeType | null;
36
- /**
37
- * Detect MIME type from buffer magic bytes (general purpose).
38
- * Supports all known formats including image types used by OCR (WebP, GIF, BMP).
39
- * Falls back to `'application/pdf'` if detection fails.
40
- *
41
- * @param buffer - Raw file or page buffer
42
- * @returns The detected MIME type string, never null.
43
- */
44
- export declare function detectMimeType(buffer: Buffer): string;
45
- /**
46
- * Validate that a file's magic bytes are compatible with the declared MIME type.
47
- *
48
- * @returns `null` if valid, or a human-readable error string if mismatched.
49
- */
50
- export declare function validateMagicBytes(buffer: Buffer, declaredMimeType: string): string | null;
51
30
  //# sourceMappingURL=file-validation.constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-validation.constants.d.ts","sourceRoot":"","sources":["../../src/constants/file-validation.constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,YAAc,CAAC;AAEjD,uDAAuD;AACvD,eAAO,MAAM,kBAAkB,wKAOrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAW/D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAa7D,CAAC;AAEL;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAmBf;AAsGD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,GACb,eAAe,GAAG,IAAI,CAUxB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUrD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,GACvB,MAAM,GAAG,IAAI,CAsBf"}
1
+ {"version":3,"file":"file-validation.constants.d.ts","sourceRoot":"","sources":["../../src/constants/file-validation.constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,YAAc,CAAC;AAEjD,uDAAuD;AACvD,eAAO,MAAM,kBAAkB,wKAOrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAW/D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,CAa7D,CAAC;AAEL;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAmBf"}
@@ -5,13 +5,12 @@
5
5
  * Centralised allowlist of accepted MIME types, file extensions,
6
6
  * and the mapping between them. Used by both the DTO validation
7
7
  * layer and the service-level cross-check.
8
+ *
9
+ * For magic byte / content-type detection, see `file-detection.utils.ts`.
8
10
  */
9
11
  Object.defineProperty(exports, "__esModule", { value: true });
10
12
  exports.MIME_TO_EXTENSIONS = exports.EXTENSION_TO_MIME = exports.ALLOWED_MIME_TYPES = exports.MAX_UPLOAD_SIZE_BYTES = void 0;
11
13
  exports.validateExtensionMimeMatch = validateExtensionMimeMatch;
12
- exports.detectMimeFromMagicBytes = detectMimeFromMagicBytes;
13
- exports.detectMimeType = detectMimeType;
14
- exports.validateMagicBytes = validateMagicBytes;
15
14
  /** Maximum upload size in bytes (100 MB — matches Supabase bucket limit) */
16
15
  exports.MAX_UPLOAD_SIZE_BYTES = 104_857_600;
17
16
  /** Allowed MIME types for contract document uploads */
@@ -81,127 +80,4 @@ function getFileExtension(filename) {
81
80
  const match = filename.match(/\.[a-zA-Z0-9]+$/);
82
81
  return match ? match[0].toLowerCase() : null;
83
82
  }
84
- const MAGIC_BYTE_SIGNATURES = [
85
- // PDF: %PDF
86
- {
87
- check: (buf) => buf[0] === 0x25 && buf[1] === 0x50 && buf[2] === 0x44 && buf[3] === 0x46,
88
- uploadMimes: ["application/pdf"],
89
- detectedMime: "application/pdf",
90
- },
91
- // PNG: 0x89 PNG
92
- {
93
- check: (buf) => buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47,
94
- uploadMimes: ["image/png"],
95
- detectedMime: "image/png",
96
- },
97
- // JPEG: 0xFF 0xD8
98
- {
99
- check: (buf) => buf[0] === 0xff && buf[1] === 0xd8,
100
- uploadMimes: ["image/jpeg"],
101
- detectedMime: "image/jpeg",
102
- },
103
- // TIFF: II (little-endian) or MM (big-endian)
104
- {
105
- check: (buf) => (buf[0] === 0x49 && buf[1] === 0x49) ||
106
- (buf[0] === 0x4d && buf[1] === 0x4d),
107
- uploadMimes: ["image/tiff"],
108
- detectedMime: "image/tiff",
109
- },
110
- // WebP: RIFF....WEBP
111
- {
112
- check: (buf) => buf.length > 11 &&
113
- buf[0] === 0x52 &&
114
- buf[1] === 0x49 &&
115
- buf[2] === 0x46 &&
116
- buf[3] === 0x46 &&
117
- buf[8] === 0x57 &&
118
- buf[9] === 0x45 &&
119
- buf[10] === 0x42 &&
120
- buf[11] === 0x50,
121
- uploadMimes: [],
122
- detectedMime: "image/webp",
123
- },
124
- // GIF: GIF8
125
- {
126
- check: (buf) => buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x38,
127
- uploadMimes: [],
128
- detectedMime: "image/gif",
129
- },
130
- // BMP: BM
131
- {
132
- check: (buf) => buf[0] === 0x42 && buf[1] === 0x4d,
133
- uploadMimes: [],
134
- detectedMime: "image/bmp",
135
- },
136
- // ZIP-based Office documents (DOCX, XLSX, PPTX): PK signature
137
- {
138
- check: (buf) => buf[0] === 0x50 && buf[1] === 0x4b,
139
- uploadMimes: [
140
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
141
- "application/msword",
142
- ],
143
- detectedMime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
144
- },
145
- // Legacy MS Office compound binary (DOC, XLS, PPT): D0 CF 11 E0
146
- {
147
- check: (buf) => buf[0] === 0xd0 && buf[1] === 0xcf && buf[2] === 0x11 && buf[3] === 0xe0,
148
- uploadMimes: ["application/msword"],
149
- detectedMime: "application/msword",
150
- },
151
- ];
152
- /**
153
- * Detect MIME type from the magic bytes of a file buffer.
154
- * Returns only types from the {@link AllowedMimeType} union (for upload validation).
155
- *
156
- * @param buffer - First 4-16 bytes of the file (only the head is needed)
157
- * @returns The detected allowed MIME type, or `null` if unrecognised.
158
- */
159
- function detectMimeFromMagicBytes(buffer) {
160
- if (!buffer || buffer.length < 2)
161
- return null;
162
- for (const sig of MAGIC_BYTE_SIGNATURES) {
163
- if (sig.check(buffer) && sig.uploadMimes.length > 0) {
164
- return sig.uploadMimes[0];
165
- }
166
- }
167
- return null;
168
- }
169
- /**
170
- * Detect MIME type from buffer magic bytes (general purpose).
171
- * Supports all known formats including image types used by OCR (WebP, GIF, BMP).
172
- * Falls back to `'application/pdf'` if detection fails.
173
- *
174
- * @param buffer - Raw file or page buffer
175
- * @returns The detected MIME type string, never null.
176
- */
177
- function detectMimeType(buffer) {
178
- if (!buffer || buffer.length < 2)
179
- return "application/pdf";
180
- for (const sig of MAGIC_BYTE_SIGNATURES) {
181
- if (sig.check(buffer)) {
182
- return sig.detectedMime;
183
- }
184
- }
185
- return "application/pdf";
186
- }
187
- /**
188
- * Validate that a file's magic bytes are compatible with the declared MIME type.
189
- *
190
- * @returns `null` if valid, or a human-readable error string if mismatched.
191
- */
192
- function validateMagicBytes(buffer, declaredMimeType) {
193
- const detectedMime = detectMimeFromMagicBytes(buffer);
194
- if (!detectedMime) {
195
- return `Unable to determine file type from content. The uploaded file may be corrupted or unsupported.`;
196
- }
197
- // Find all upload MIME types that share the same magic byte signature
198
- const matchedSignature = MAGIC_BYTE_SIGNATURES.find((sig) => sig.check(buffer));
199
- const compatibleMimes = matchedSignature?.uploadMimes ?? [detectedMime];
200
- if (!compatibleMimes.includes(declaredMimeType)) {
201
- return (`File content does not match declared type "${declaredMimeType}". ` +
202
- `Detected content type: "${detectedMime}". ` +
203
- `Please ensure you are uploading the correct file.`);
204
- }
205
- return null;
206
- }
207
83
  //# sourceMappingURL=file-validation.constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-validation.constants.js","sourceRoot":"","sources":["../../src/constants/file-validation.constants.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAyDH,gEAsBC;AA6GD,4DAYC;AAUD,wCAUC;AAOD,gDAyBC;AA1PD,4EAA4E;AAC/D,QAAA,qBAAqB,GAAG,WAAW,CAAC;AAEjD,uDAAuD;AAC1C,QAAA,kBAAkB,GAAG;IAChC,iBAAiB;IACjB,yEAAyE;IACzE,oBAAoB;IACpB,WAAW;IACX,YAAY;IACZ,YAAY;CACJ,CAAC;AAIX;;GAEG;AACU,QAAA,iBAAiB,GAAsC;IAClE,MAAM,EAAE,CAAC,iBAAiB,CAAC;IAC3B,OAAO,EAAE;QACP,yEAAyE;KAC1E;IACD,MAAM,EAAE,CAAC,oBAAoB,CAAC;IAC9B,MAAM,EAAE,CAAC,WAAW,CAAC;IACrB,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,OAAO,EAAE,CAAC,YAAY,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACU,QAAA,kBAAkB,GAAsC,CAAC,GAAG,EAAE;IACzE,MAAM,GAAG,GAA6B,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,0BAAkB,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,yBAAiB,CAAC,EAAE,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAwC,CAAC;AAClD,CAAC,CAAC,EAAE,CAAC;AAEL;;;;GAIG;AACH,SAAgB,0BAA0B,CACxC,QAAgB,EAChB,QAAgB;IAEhB,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,aAAa,QAAQ,sCAAsC,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG,yBAAiB,CAAC,GAAG,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,yBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,mBAAmB,GAAG,4CAA4C,aAAa,EAAE,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAA2B,CAAC,EAAE,CAAC;QACxD,OAAO,mBAAmB,GAAG,+BAA+B,QAAQ,iCAAiC,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1I,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sEAAsE;AACtE,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAoBD,MAAM,qBAAqB,GAAyB;IAClD,YAAY;IACZ;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QAC1E,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,YAAY,EAAE,iBAAiB;KAChC;IACD,gBAAgB;IAChB;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QAC1E,WAAW,EAAE,CAAC,WAAW,CAAC;QAC1B,YAAY,EAAE,WAAW;KAC1B;IACD,kBAAkB;IAClB;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QAClD,WAAW,EAAE,CAAC,YAAY,CAAC;QAC3B,YAAY,EAAE,YAAY;KAC3B;IACD,8CAA8C;IAC9C;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;YACpC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACtC,WAAW,EAAE,CAAC,YAAY,CAAC;QAC3B,YAAY,EAAE,YAAY;KAC3B;IACD,qBAAqB;IACrB;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,CAAC,MAAM,GAAG,EAAE;YACf,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YACf,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YACf,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YACf,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YACf,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YACf,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YACf,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI;YAChB,GAAG,CAAC,EAAE,CAAC,KAAK,IAAI;QAClB,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,YAAY;KAC3B;IACD,YAAY;IACZ;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QAC1E,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,WAAW;KAC1B;IACD,UAAU;IACV;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QAClD,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,WAAW;KAC1B;IACD,8DAA8D;IAC9D;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QAClD,WAAW,EAAE;YACX,yEAAyE;YACzE,oBAAoB;SACrB;QACD,YAAY,EACV,yEAAyE;KAC5E;IACD,gEAAgE;IAChE;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;QAC1E,WAAW,EAAE,CAAC,oBAAoB,CAAC;QACnC,YAAY,EAAE,oBAAoB;KACnC;CACF,CAAC;AAEF;;;;;;GAMG;AACH,SAAgB,wBAAwB,CACtC,MAAc;IAEd,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAAC,MAAc;IAC3C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,YAAY,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAChC,MAAc,EACd,gBAAwB;IAExB,MAAM,YAAY,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,gGAAgG,CAAC;IAC1G,CAAC;IAED,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC1D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAClB,CAAC;IACF,MAAM,eAAe,GAAG,gBAAgB,EAAE,WAAW,IAAI,CAAC,YAAY,CAAC,CAAC;IAExE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,gBAAmC,CAAC,EAAE,CAAC;QACnE,OAAO,CACL,8CAA8C,gBAAgB,KAAK;YACnE,2BAA2B,YAAY,KAAK;YAC5C,mDAAmD,CACpD,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"file-validation.constants.js","sourceRoot":"","sources":["../../src/constants/file-validation.constants.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAyDH,gEAsBC;AA7ED,4EAA4E;AAC/D,QAAA,qBAAqB,GAAG,WAAW,CAAC;AAEjD,uDAAuD;AAC1C,QAAA,kBAAkB,GAAG;IAChC,iBAAiB;IACjB,yEAAyE;IACzE,oBAAoB;IACpB,WAAW;IACX,YAAY;IACZ,YAAY;CACJ,CAAC;AAIX;;GAEG;AACU,QAAA,iBAAiB,GAAsC;IAClE,MAAM,EAAE,CAAC,iBAAiB,CAAC;IAC3B,OAAO,EAAE;QACP,yEAAyE;KAC1E;IACD,MAAM,EAAE,CAAC,oBAAoB,CAAC;IAC9B,MAAM,EAAE,CAAC,WAAW,CAAC;IACrB,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,OAAO,EAAE,CAAC,YAAY,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACU,QAAA,kBAAkB,GAAsC,CAAC,GAAG,EAAE;IACzE,MAAM,GAAG,GAA6B,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,0BAAkB,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,yBAAiB,CAAC,EAAE,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAwC,CAAC;AAClD,CAAC,CAAC,EAAE,CAAC;AAEL;;;;GAIG;AACH,SAAgB,0BAA0B,CACxC,QAAgB,EAChB,QAAgB;IAEhB,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,aAAa,QAAQ,sCAAsC,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG,yBAAiB,CAAC,GAAG,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,yBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,mBAAmB,GAAG,4CAA4C,aAAa,EAAE,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAA2B,CAAC,EAAE,CAAC;QACxD,OAAO,mBAAmB,GAAG,+BAA+B,QAAQ,iCAAiC,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1I,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sEAAsE;AACtE,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export { CRITICAL_PII_TYPES, HIGH_RISK_PII_TYPES, CONTEXTUAL_ENTITIES, STANDARD_PII_TYPES, ALL_MASKABLE_PII_TYPES, APPROVAL_REQUIRED_PII_TYPES, } from "./pii-classifications.constants";
2
2
  export type { PiiRiskLevel } from "./pii-classifications.constants";
3
- export { MAX_UPLOAD_SIZE_BYTES, ALLOWED_MIME_TYPES, EXTENSION_TO_MIME, MIME_TO_EXTENSIONS, validateExtensionMimeMatch, detectMimeFromMagicBytes, detectMimeType, validateMagicBytes, } from "./file-validation.constants";
3
+ export { MAX_UPLOAD_SIZE_BYTES, ALLOWED_MIME_TYPES, EXTENSION_TO_MIME, MIME_TO_EXTENSIONS, validateExtensionMimeMatch, } from "./file-validation.constants";
4
4
  export type { AllowedMimeType } from "./file-validation.constants";
5
+ export { detectMimeFromMagicBytes, detectMimeType, validateMagicBytes, } from "./file-detection.utils";
5
6
  export { ContractStatus, JobType, JobStatus, TaskStatus, TaskPriority, RiskLevel, RuleKind, RuleDirection, } from "./enums";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,cAAc,EACd,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EACL,cAAc,EACd,OAAO,EACP,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,cAAc,EACd,OAAO,EACP,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC"}
@@ -14,9 +14,10 @@ Object.defineProperty(exports, "ALLOWED_MIME_TYPES", { enumerable: true, get: fu
14
14
  Object.defineProperty(exports, "EXTENSION_TO_MIME", { enumerable: true, get: function () { return file_validation_constants_1.EXTENSION_TO_MIME; } });
15
15
  Object.defineProperty(exports, "MIME_TO_EXTENSIONS", { enumerable: true, get: function () { return file_validation_constants_1.MIME_TO_EXTENSIONS; } });
16
16
  Object.defineProperty(exports, "validateExtensionMimeMatch", { enumerable: true, get: function () { return file_validation_constants_1.validateExtensionMimeMatch; } });
17
- Object.defineProperty(exports, "detectMimeFromMagicBytes", { enumerable: true, get: function () { return file_validation_constants_1.detectMimeFromMagicBytes; } });
18
- Object.defineProperty(exports, "detectMimeType", { enumerable: true, get: function () { return file_validation_constants_1.detectMimeType; } });
19
- Object.defineProperty(exports, "validateMagicBytes", { enumerable: true, get: function () { return file_validation_constants_1.validateMagicBytes; } });
17
+ var file_detection_utils_1 = require("./file-detection.utils");
18
+ Object.defineProperty(exports, "detectMimeFromMagicBytes", { enumerable: true, get: function () { return file_detection_utils_1.detectMimeFromMagicBytes; } });
19
+ Object.defineProperty(exports, "detectMimeType", { enumerable: true, get: function () { return file_detection_utils_1.detectMimeType; } });
20
+ Object.defineProperty(exports, "validateMagicBytes", { enumerable: true, get: function () { return file_detection_utils_1.validateMagicBytes; } });
20
21
  var enums_1 = require("./enums");
21
22
  Object.defineProperty(exports, "ContractStatus", { enumerable: true, get: function () { return enums_1.ContractStatus; } });
22
23
  Object.defineProperty(exports, "JobType", { enumerable: true, get: function () { return enums_1.JobType; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":";;;AAAA,iFAOyC;AANvC,mIAAA,kBAAkB,OAAA;AAClB,oIAAA,mBAAmB,OAAA;AACnB,oIAAA,mBAAmB,OAAA;AACnB,mIAAA,kBAAkB,OAAA;AAClB,uIAAA,sBAAsB,OAAA;AACtB,4IAAA,2BAA2B,OAAA;AAI7B,yEASqC;AARnC,kIAAA,qBAAqB,OAAA;AACrB,+HAAA,kBAAkB,OAAA;AAClB,8HAAA,iBAAiB,OAAA;AACjB,+HAAA,kBAAkB,OAAA;AAClB,uIAAA,0BAA0B,OAAA;AAC1B,qIAAA,wBAAwB,OAAA;AACxB,2HAAA,cAAc,OAAA;AACd,+HAAA,kBAAkB,OAAA;AAIpB,iCASiB;AARf,uGAAA,cAAc,OAAA;AACd,gGAAA,OAAO,OAAA;AACP,kGAAA,SAAS,OAAA;AACT,mGAAA,UAAU,OAAA;AACV,qGAAA,YAAY,OAAA;AACZ,kGAAA,SAAS,OAAA;AACT,iGAAA,QAAQ,OAAA;AACR,sGAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":";;;AAAA,iFAOyC;AANvC,mIAAA,kBAAkB,OAAA;AAClB,oIAAA,mBAAmB,OAAA;AACnB,oIAAA,mBAAmB,OAAA;AACnB,mIAAA,kBAAkB,OAAA;AAClB,uIAAA,sBAAsB,OAAA;AACtB,4IAAA,2BAA2B,OAAA;AAI7B,yEAMqC;AALnC,kIAAA,qBAAqB,OAAA;AACrB,+HAAA,kBAAkB,OAAA;AAClB,8HAAA,iBAAiB,OAAA;AACjB,+HAAA,kBAAkB,OAAA;AAClB,uIAAA,0BAA0B,OAAA;AAI5B,+DAIgC;AAH9B,gIAAA,wBAAwB,OAAA;AACxB,sHAAA,cAAc,OAAA;AACd,0HAAA,kBAAkB,OAAA;AAGpB,iCASiB;AARf,uGAAA,cAAc,OAAA;AACd,gGAAA,OAAO,OAAA;AACP,kGAAA,SAAS,OAAA;AACT,mGAAA,UAAU,OAAA;AACV,qGAAA,YAAY,OAAA;AACZ,kGAAA,SAAS,OAAA;AACT,iGAAA,QAAQ,OAAA;AACR,sGAAA,aAAa,OAAA"}
@@ -1,2 +1,3 @@
1
1
  export { CryptoService } from "./crypto.service";
2
+ export { maskStorageKey } from "./log-utils";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CryptoService = void 0;
3
+ exports.maskStorageKey = exports.CryptoService = void 0;
4
4
  var crypto_service_1 = require("./crypto.service");
5
5
  Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return crypto_service_1.CryptoService; } });
6
+ var log_utils_1 = require("./log-utils");
7
+ Object.defineProperty(exports, "maskStorageKey", { enumerable: true, get: function () { return log_utils_1.maskStorageKey; } });
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAAxC,+GAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,yCAA6C;AAApC,2GAAA,cAAc,OAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Mask a storage key to prevent exposing full paths in logs.
3
+ *
4
+ * Preserves the directory structure but truncates the filename,
5
+ * showing only the first 8 and last 4 characters.
6
+ *
7
+ * Examples:
8
+ * - `contracts/original/a1b2c3d4-e5f6-7890-abcd-ef1234567890.pdf`
9
+ * → `contracts/original/a1b2c3d4...7890.pdf`
10
+ * - `short.pdf` → `short.pdf` (no masking for short names)
11
+ *
12
+ * @param storageKey - The full storage key / path
13
+ * @returns A masked version safe for logging
14
+ */
15
+ export declare function maskStorageKey(storageKey: string): string;
16
+ //# sourceMappingURL=log-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-utils.d.ts","sourceRoot":"","sources":["../../src/helpers/log-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAmBzD"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maskStorageKey = maskStorageKey;
4
+ /**
5
+ * Mask a storage key to prevent exposing full paths in logs.
6
+ *
7
+ * Preserves the directory structure but truncates the filename,
8
+ * showing only the first 8 and last 4 characters.
9
+ *
10
+ * Examples:
11
+ * - `contracts/original/a1b2c3d4-e5f6-7890-abcd-ef1234567890.pdf`
12
+ * → `contracts/original/a1b2c3d4...7890.pdf`
13
+ * - `short.pdf` → `short.pdf` (no masking for short names)
14
+ *
15
+ * @param storageKey - The full storage key / path
16
+ * @returns A masked version safe for logging
17
+ */
18
+ function maskStorageKey(storageKey) {
19
+ if (!storageKey)
20
+ return "<empty>";
21
+ const lastSlash = storageKey.lastIndexOf("/");
22
+ const dir = lastSlash >= 0 ? storageKey.substring(0, lastSlash + 1) : "";
23
+ const filename = lastSlash >= 0 ? storageKey.substring(lastSlash + 1) : storageKey;
24
+ // Find extension
25
+ const dotIndex = filename.lastIndexOf(".");
26
+ const name = dotIndex >= 0 ? filename.substring(0, dotIndex) : filename;
27
+ const ext = dotIndex >= 0 ? filename.substring(dotIndex) : "";
28
+ // Only mask if the name portion is long enough
29
+ if (name.length <= 12) {
30
+ return `${dir}${filename}`;
31
+ }
32
+ return `${dir}${name.substring(0, 8)}...${name.substring(name.length - 4)}${ext}`;
33
+ }
34
+ //# sourceMappingURL=log-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-utils.js","sourceRoot":"","sources":["../../src/helpers/log-utils.ts"],"names":[],"mappings":";;AAcA,wCAmBC;AAjCD;;;;;;;;;;;;;GAaG;AACH,SAAgB,cAAc,CAAC,UAAkB;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAElC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,MAAM,QAAQ,GACZ,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAEpE,iBAAiB;IACjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxE,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,+CAA+C;IAC/C,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACtB,OAAO,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;AACpF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ export type { ErrorResponse } from "./filters";
13
13
  export { SwaggerDocs } from "./swagger";
14
14
  export { configureApp } from "./bootstrap";
15
15
  export type { AppBootstrapOptions } from "./bootstrap";
16
- export { CryptoService } from "./helpers";
16
+ export { CryptoService, maskStorageKey } from "./helpers";
17
17
  export { BaseSupabaseStorageService } from "./storage";
18
18
  export type { DownloadUrlResult, StorageMetadata } from "./storage";
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EACb,MAAM,EACN,YAAY,EACZ,eAAe,EACf,cAAc,GACf,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,aAAa,EACb,yBAAyB,GAC1B,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,2BAA2B,EAC3B,cAAc,EACd,OAAO,EACP,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,cAAc,EACd,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EACL,UAAU,EACV,cAAc,EACd,WAAW,EACX,aAAa,EAEb,sBAAsB,EACtB,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EAEzB,mBAAmB,EACnB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,aAAa,EACb,MAAM,EACN,YAAY,EACZ,eAAe,EACf,cAAc,GACf,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,aAAa,EACb,yBAAyB,GAC1B,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,2BAA2B,EAC3B,cAAc,EACd,OAAO,EACP,SAAS,EACT,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,cAAc,EACd,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EACL,UAAU,EACV,cAAc,EACd,WAAW,EACX,aAAa,EAEb,sBAAsB,EACtB,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,gCAAgC,EAChC,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EAEzB,mBAAmB,EACnB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseContractPiiReplacementEntity = exports.BaseContractRedFlagEntity = exports.BaseContractChunkEntity = exports.BaseContractTextEntity = exports.BaseJobEntity = exports.BaseContractEntity = exports.BaseUsersProfileEntity = exports.RedisProvider = exports.RedisModule = exports.DatabaseModule = exports.BaseEntity = exports.UserTier = exports.validateMagicBytes = exports.detectMimeType = exports.detectMimeFromMagicBytes = exports.validateExtensionMimeMatch = exports.MIME_TO_EXTENSIONS = exports.EXTENSION_TO_MIME = exports.ALLOWED_MIME_TYPES = exports.MAX_UPLOAD_SIZE_BYTES = exports.RuleDirection = exports.RuleKind = exports.RiskLevel = exports.TaskPriority = exports.TaskStatus = exports.JobStatus = exports.JobType = exports.ContractStatus = exports.APPROVAL_REQUIRED_PII_TYPES = exports.ALL_MASKABLE_PII_TYPES = exports.STANDARD_PII_TYPES = exports.CONTEXTUAL_ENTITIES = exports.HIGH_RISK_PII_TYPES = exports.CRITICAL_PII_TYPES = exports.createBaseValidationRules = exports.StorageConfig = exports.RedisConfig = exports.buildPinoParams = exports.createSecurityConfig = exports.createLoggingConfig = exports.createJwtConfig = exports.createDocConfig = exports.createDatabaseConfig = exports.createAppConfig = exports.AuthCoreModule = exports.BaseJwtStrategy = exports.JwtAuthGuard = exports.Public = exports.IS_PUBLIC_KEY = exports.CurrentUser = void 0;
4
- exports.BaseSupabaseStorageService = exports.CryptoService = exports.configureApp = exports.SwaggerDocs = exports.AllExceptionsFilter = exports.ApiResponseDto = exports.QnaResponse = exports.QnaQuestionTemplate = exports.BaseScoringCriteriaEntity = exports.BaseQnaQuestionEntity = exports.BaseAuditLogEntity = exports.BaseContractEventEntity = exports.BaseContractKeyDateRuleEntity = exports.BaseContractTaskEntity = void 0;
4
+ exports.BaseSupabaseStorageService = exports.maskStorageKey = exports.CryptoService = exports.configureApp = exports.SwaggerDocs = exports.AllExceptionsFilter = exports.ApiResponseDto = exports.QnaResponse = exports.QnaQuestionTemplate = exports.BaseScoringCriteriaEntity = exports.BaseQnaQuestionEntity = exports.BaseAuditLogEntity = exports.BaseContractEventEntity = exports.BaseContractKeyDateRuleEntity = exports.BaseContractTaskEntity = void 0;
5
5
  // ── Auth ──────────────────────────────────────────────────────────────
6
6
  var auth_1 = require("./auth");
7
7
  Object.defineProperty(exports, "CurrentUser", { enumerable: true, get: function () { return auth_1.CurrentUser; } });
@@ -86,6 +86,7 @@ Object.defineProperty(exports, "configureApp", { enumerable: true, get: function
86
86
  // ── Helpers ───────────────────────────────────────────────────────────
87
87
  var helpers_1 = require("./helpers");
88
88
  Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return helpers_1.CryptoService; } });
89
+ Object.defineProperty(exports, "maskStorageKey", { enumerable: true, get: function () { return helpers_1.maskStorageKey; } });
89
90
  // ── Storage ───────────────────────────────────────────────────────────
90
91
  var storage_1 = require("./storage");
91
92
  Object.defineProperty(exports, "BaseSupabaseStorageService", { enumerable: true, get: function () { return storage_1.BaseSupabaseStorageService; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,yEAAyE;AACzE,+BAOgB;AANd,mGAAA,WAAW,OAAA;AACX,qGAAA,aAAa,OAAA;AACb,8FAAA,MAAM,OAAA;AACN,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,sGAAA,cAAc,OAAA;AAIhB,yEAAyE;AACzE,mCAWkB;AAVhB,yGAAA,eAAe,OAAA;AACf,8GAAA,oBAAoB,OAAA;AACpB,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AACnB,8GAAA,oBAAoB,OAAA;AACpB,yGAAA,eAAe,OAAA;AACf,qGAAA,WAAW,OAAA;AACX,uGAAA,aAAa,OAAA;AACb,mHAAA,yBAAyB,OAAA;AAY3B,yEAAyE;AACzE,yCAuBqB;AAtBnB,+GAAA,kBAAkB,OAAA;AAClB,gHAAA,mBAAmB,OAAA;AACnB,gHAAA,mBAAmB,OAAA;AACnB,+GAAA,kBAAkB,OAAA;AAClB,mHAAA,sBAAsB,OAAA;AACtB,wHAAA,2BAA2B,OAAA;AAC3B,2GAAA,cAAc,OAAA;AACd,oGAAA,OAAO,OAAA;AACP,sGAAA,SAAS,OAAA;AACT,uGAAA,UAAU,OAAA;AACV,yGAAA,YAAY,OAAA;AACZ,sGAAA,SAAS,OAAA;AACT,qGAAA,QAAQ,OAAA;AACR,0GAAA,aAAa,OAAA;AACb,kHAAA,qBAAqB,OAAA;AACrB,+GAAA,kBAAkB,OAAA;AAClB,8GAAA,iBAAiB,OAAA;AACjB,+GAAA,kBAAkB,OAAA;AAClB,uHAAA,0BAA0B,OAAA;AAC1B,qHAAA,wBAAwB,OAAA;AACxB,2GAAA,cAAc,OAAA;AACd,+GAAA,kBAAkB,OAAA;AAGpB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAEjB,yEAAyE;AACzE,uCAuBoB;AAtBlB,sGAAA,UAAU,OAAA;AACV,0GAAA,cAAc,OAAA;AACd,uGAAA,WAAW,OAAA;AACX,yGAAA,aAAa,OAAA;AACb,yBAAyB;AACzB,kHAAA,sBAAsB,OAAA;AACtB,8GAAA,kBAAkB,OAAA;AAElB,yGAAA,aAAa,OAAA;AACb,kHAAA,sBAAsB,OAAA;AACtB,mHAAA,uBAAuB,OAAA;AACvB,qHAAA,yBAAyB,OAAA;AACzB,4HAAA,gCAAgC,OAAA;AAChC,kHAAA,sBAAsB,OAAA;AACtB,yHAAA,6BAA6B,OAAA;AAC7B,mHAAA,uBAAuB,OAAA;AACvB,8GAAA,kBAAkB,OAAA;AAClB,iHAAA,qBAAqB,OAAA;AACrB,qHAAA,yBAAyB,OAAA;AACzB,2BAA2B;AAC3B,+GAAA,mBAAmB,OAAA;AACnB,uGAAA,WAAW,OAAA;AAIb,yEAAyE;AACzE,6BAAuC;AAA9B,qGAAA,cAAc,OAAA;AAEvB,yEAAyE;AACzE,qCAAgD;AAAvC,8GAAA,mBAAmB,OAAA;AAG5B,yEAAyE;AACzE,qCAAwC;AAA/B,sGAAA,WAAW,OAAA;AAEpB,yEAAyE;AACzE,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AAGrB,yEAAyE;AACzE,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AAEtB,yEAAyE;AACzE,qCAAuD;AAA9C,qHAAA,0BAA0B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,yEAAyE;AACzE,+BAOgB;AANd,mGAAA,WAAW,OAAA;AACX,qGAAA,aAAa,OAAA;AACb,8FAAA,MAAM,OAAA;AACN,oGAAA,YAAY,OAAA;AACZ,uGAAA,eAAe,OAAA;AACf,sGAAA,cAAc,OAAA;AAIhB,yEAAyE;AACzE,mCAWkB;AAVhB,yGAAA,eAAe,OAAA;AACf,8GAAA,oBAAoB,OAAA;AACpB,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AACnB,8GAAA,oBAAoB,OAAA;AACpB,yGAAA,eAAe,OAAA;AACf,qGAAA,WAAW,OAAA;AACX,uGAAA,aAAa,OAAA;AACb,mHAAA,yBAAyB,OAAA;AAY3B,yEAAyE;AACzE,yCAuBqB;AAtBnB,+GAAA,kBAAkB,OAAA;AAClB,gHAAA,mBAAmB,OAAA;AACnB,gHAAA,mBAAmB,OAAA;AACnB,+GAAA,kBAAkB,OAAA;AAClB,mHAAA,sBAAsB,OAAA;AACtB,wHAAA,2BAA2B,OAAA;AAC3B,2GAAA,cAAc,OAAA;AACd,oGAAA,OAAO,OAAA;AACP,sGAAA,SAAS,OAAA;AACT,uGAAA,UAAU,OAAA;AACV,yGAAA,YAAY,OAAA;AACZ,sGAAA,SAAS,OAAA;AACT,qGAAA,QAAQ,OAAA;AACR,0GAAA,aAAa,OAAA;AACb,kHAAA,qBAAqB,OAAA;AACrB,+GAAA,kBAAkB,OAAA;AAClB,8GAAA,iBAAiB,OAAA;AACjB,+GAAA,kBAAkB,OAAA;AAClB,uHAAA,0BAA0B,OAAA;AAC1B,qHAAA,wBAAwB,OAAA;AACxB,2GAAA,cAAc,OAAA;AACd,+GAAA,kBAAkB,OAAA;AAGpB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AAEjB,yEAAyE;AACzE,uCAuBoB;AAtBlB,sGAAA,UAAU,OAAA;AACV,0GAAA,cAAc,OAAA;AACd,uGAAA,WAAW,OAAA;AACX,yGAAA,aAAa,OAAA;AACb,yBAAyB;AACzB,kHAAA,sBAAsB,OAAA;AACtB,8GAAA,kBAAkB,OAAA;AAElB,yGAAA,aAAa,OAAA;AACb,kHAAA,sBAAsB,OAAA;AACtB,mHAAA,uBAAuB,OAAA;AACvB,qHAAA,yBAAyB,OAAA;AACzB,4HAAA,gCAAgC,OAAA;AAChC,kHAAA,sBAAsB,OAAA;AACtB,yHAAA,6BAA6B,OAAA;AAC7B,mHAAA,uBAAuB,OAAA;AACvB,8GAAA,kBAAkB,OAAA;AAClB,iHAAA,qBAAqB,OAAA;AACrB,qHAAA,yBAAyB,OAAA;AACzB,2BAA2B;AAC3B,+GAAA,mBAAmB,OAAA;AACnB,uGAAA,WAAW,OAAA;AAIb,yEAAyE;AACzE,6BAAuC;AAA9B,qGAAA,cAAc,OAAA;AAEvB,yEAAyE;AACzE,qCAAgD;AAAvC,8GAAA,mBAAmB,OAAA;AAG5B,yEAAyE;AACzE,qCAAwC;AAA/B,sGAAA,WAAW,OAAA;AAEpB,yEAAyE;AACzE,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AAGrB,yEAAyE;AACzE,qCAA0D;AAAjD,wGAAA,aAAa,OAAA;AAAE,yGAAA,cAAc,OAAA;AAEtC,yEAAyE;AACzE,qCAAuD;AAA9C,qHAAA,0BAA0B,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"base-storage.service.d.ts","sourceRoot":"","sources":["../../src/storage/base-storage.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,0BAA0B;IAMlC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAL3D,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAqC;IAC9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEd,aAAa,EAAE,aAAa;IAsB3D;;;;;OAKG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAiBlB;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQpE;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBvD;;;;;OAKG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBtD;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA2B1E;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBpD"}
1
+ {"version":3,"file":"base-storage.service.d.ts","sourceRoot":"","sources":["../../src/storage/base-storage.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGrE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,0BAA0B;IAMlC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAL3D,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAqC;IAC9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEd,aAAa,EAAE,aAAa;IAsB3D;;;;;OAKG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAiBlB;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQpE;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBvD;;;;;OAKG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBtD;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA2B1E;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBpD"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseSupabaseStorageService = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
5
  const supabase_js_1 = require("@supabase/supabase-js");
6
+ const log_utils_1 = require("../helpers/log-utils");
6
7
  /**
7
8
  * Abstract base class for Supabase Storage services.
8
9
  *
@@ -54,7 +55,7 @@ class BaseSupabaseStorageService {
54
55
  .from(this.bucketName)
55
56
  .createSignedUrl(storageKey, expiry);
56
57
  if (error || !data) {
57
- this.logger.error(`Failed to generate signed URL for ${storageKey}: ${error?.message}`);
58
+ this.logger.error(`Failed to generate signed URL for ${(0, log_utils_1.maskStorageKey)(storageKey)}: ${error?.message}`);
58
59
  throw new Error(`Failed to generate signed URL: ${error?.message}`);
59
60
  }
60
61
  return data.signedUrl;
@@ -72,7 +73,7 @@ class BaseSupabaseStorageService {
72
73
  * Download a file as a Buffer.
73
74
  */
74
75
  async downloadBlob(storageKey) {
75
- this.logger.log(`Downloading file: ${storageKey}`);
76
+ this.logger.log(`Downloading file: ${(0, log_utils_1.maskStorageKey)(storageKey)}`);
76
77
  const { data, error } = await this.supabase.storage
77
78
  .from(this.bucketName)
78
79
  .download(storageKey);
@@ -81,7 +82,7 @@ class BaseSupabaseStorageService {
81
82
  }
82
83
  const arrayBuffer = await data.arrayBuffer();
83
84
  const buffer = Buffer.from(arrayBuffer);
84
- this.logger.log(`Downloaded ${buffer.length} bytes from ${storageKey}`);
85
+ this.logger.log(`Downloaded ${buffer.length} bytes from ${(0, log_utils_1.maskStorageKey)(storageKey)}`);
85
86
  return buffer;
86
87
  }
87
88
  // ── Existence Check ─────────────────────────────────────────────────
@@ -145,10 +146,10 @@ class BaseSupabaseStorageService {
145
146
  .from(this.bucketName)
146
147
  .remove([storageKey]);
147
148
  if (error) {
148
- this.logger.warn(`Failed to delete file ${storageKey}: ${error.message}`);
149
+ this.logger.warn(`Failed to delete file ${(0, log_utils_1.maskStorageKey)(storageKey)}: ${error.message}`);
149
150
  }
150
151
  else {
151
- this.logger.log(`Deleted file: ${storageKey}`);
152
+ this.logger.log(`Deleted file: ${(0, log_utils_1.maskStorageKey)(storageKey)}`);
152
153
  }
153
154
  }
154
155
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"base-storage.service.js","sourceRoot":"","sources":["../../src/storage/base-storage.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-storage.service.js","sourceRoot":"","sources":["../../src/storage/base-storage.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veritas-lex/contract-analysis-package",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Shared NestJS infrastructure for Contract Analysis APIs",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -37,8 +37,12 @@
37
37
  "swagger-themes": "^1.4.3",
38
38
  "typeorm": "^0.3.28"
39
39
  },
40
+ "dependencies": {
41
+ "@supabase/supabase-js": "^2.49.0",
42
+ "file-type": "^21.3.0",
43
+ "load-esm": "^1.0.3"
44
+ },
40
45
  "devDependencies": {
41
- "@supabase/supabase-js": "^2.95.3",
42
46
  "@types/compression": "^1.8.1",
43
47
  "@types/express": "^5.0.6",
44
48
  "@types/joi": "^17.2.2",