doc-reader-sdk 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +220 -2
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +158 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/extractors/csv.d.ts +6 -0
  8. package/dist/extractors/csv.d.ts.map +1 -0
  9. package/dist/extractors/csv.js +62 -0
  10. package/dist/extractors/csv.js.map +1 -0
  11. package/dist/extractors/docx.d.ts +6 -0
  12. package/dist/extractors/docx.d.ts.map +1 -0
  13. package/dist/extractors/docx.js +58 -0
  14. package/dist/extractors/docx.js.map +1 -0
  15. package/dist/extractors/json.d.ts +10 -0
  16. package/dist/extractors/json.d.ts.map +1 -0
  17. package/dist/extractors/json.js +89 -0
  18. package/dist/extractors/json.js.map +1 -0
  19. package/dist/extractors/pdf.d.ts +6 -0
  20. package/dist/extractors/pdf.d.ts.map +1 -0
  21. package/dist/extractors/pdf.js +74 -0
  22. package/dist/extractors/pdf.js.map +1 -0
  23. package/dist/extractors/pptx.d.ts +6 -0
  24. package/dist/extractors/pptx.d.ts.map +1 -0
  25. package/dist/extractors/pptx.js +81 -0
  26. package/dist/extractors/pptx.js.map +1 -0
  27. package/dist/extractors/text.d.ts +6 -0
  28. package/dist/extractors/text.d.ts.map +1 -0
  29. package/dist/extractors/text.js +40 -0
  30. package/dist/extractors/text.js.map +1 -0
  31. package/dist/extractors/xlsx.d.ts +6 -0
  32. package/dist/extractors/xlsx.d.ts.map +1 -0
  33. package/dist/extractors/xlsx.js +59 -0
  34. package/dist/extractors/xlsx.js.map +1 -0
  35. package/dist/extractors/zip.d.ts +6 -0
  36. package/dist/extractors/zip.d.ts.map +1 -0
  37. package/dist/extractors/zip.js +25 -0
  38. package/dist/extractors/zip.js.map +1 -0
  39. package/dist/index.d.ts +14 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +181 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types/index.d.ts +38 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +3 -0
  46. package/dist/types/index.js.map +1 -0
  47. package/dist/utils/helpers.d.ts +13 -0
  48. package/dist/utils/helpers.d.ts.map +1 -0
  49. package/dist/utils/helpers.js +164 -0
  50. package/dist/utils/helpers.js.map +1 -0
  51. package/package.json +74 -4
package/dist/index.js ADDED
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DocReader = void 0;
37
+ exports.readDoc = readDoc;
38
+ const path = __importStar(require("path"));
39
+ const helpers_js_1 = require("./utils/helpers.js");
40
+ const pdf_js_1 = require("./extractors/pdf.js");
41
+ const docx_js_1 = require("./extractors/docx.js");
42
+ const xlsx_js_1 = require("./extractors/xlsx.js");
43
+ const pptx_js_1 = require("./extractors/pptx.js");
44
+ const csv_js_1 = require("./extractors/csv.js");
45
+ const json_js_1 = require("./extractors/json.js");
46
+ const text_js_1 = require("./extractors/text.js");
47
+ const zip_js_1 = require("./extractors/zip.js");
48
+ class DocReader {
49
+ constructor(defaultOptions = {}) {
50
+ this.defaultOptions = {
51
+ allSheets: true,
52
+ listOnly: true,
53
+ pageByPage: false,
54
+ chunkSize: 1024 * 1024, // 1 MB
55
+ ...defaultOptions,
56
+ };
57
+ }
58
+ /**
59
+ * Read any document file and return its full text content.
60
+ * Handles PDF, DOCX, XLSX, PPTX, CSV, JSON, JSONL, TXT, MD, HTML, XML, ZIP, and more.
61
+ */
62
+ async read(filePath, options = {}) {
63
+ const opts = { ...this.defaultOptions, ...options };
64
+ const absPath = path.resolve(filePath);
65
+ const docType = await (0, helpers_js_1.detectDocType)(absPath);
66
+ let chunks = [];
67
+ let warnings = [];
68
+ switch (docType) {
69
+ case 'pdf': {
70
+ const res = await (0, pdf_js_1.extractPdf)(absPath, opts);
71
+ chunks = res.chunks;
72
+ warnings = res.warnings;
73
+ break;
74
+ }
75
+ case 'docx':
76
+ case 'doc': {
77
+ const res = await (0, docx_js_1.extractDocx)(absPath);
78
+ chunks = res.chunks;
79
+ warnings = res.warnings;
80
+ if (docType === 'doc') {
81
+ warnings.unshift('Legacy .doc format — results may be incomplete. Convert to .docx for best results.');
82
+ }
83
+ break;
84
+ }
85
+ case 'xlsx':
86
+ case 'xls': {
87
+ const res = await (0, xlsx_js_1.extractXlsx)(absPath, opts);
88
+ chunks = res.chunks;
89
+ warnings = res.warnings;
90
+ break;
91
+ }
92
+ case 'pptx':
93
+ case 'ppt': {
94
+ const res = await (0, pptx_js_1.extractPptx)(absPath);
95
+ chunks = res.chunks;
96
+ warnings = res.warnings;
97
+ if (docType === 'ppt') {
98
+ warnings.unshift('Legacy .ppt format detected. Results may be incomplete.');
99
+ }
100
+ break;
101
+ }
102
+ case 'csv': {
103
+ const res = await (0, csv_js_1.extractCsv)(absPath, ',', opts);
104
+ chunks = res.chunks;
105
+ warnings = res.warnings;
106
+ break;
107
+ }
108
+ case 'tsv': {
109
+ const res = await (0, csv_js_1.extractCsv)(absPath, '\t', opts);
110
+ chunks = res.chunks;
111
+ warnings = res.warnings;
112
+ break;
113
+ }
114
+ case 'json': {
115
+ const res = await (0, json_js_1.extractJson)(absPath, opts);
116
+ chunks = res.chunks;
117
+ warnings = res.warnings;
118
+ break;
119
+ }
120
+ case 'jsonl': {
121
+ const res = await (0, json_js_1.extractJsonl)(absPath, opts);
122
+ chunks = res.chunks;
123
+ warnings = res.warnings;
124
+ break;
125
+ }
126
+ case 'zip': {
127
+ const res = await (0, zip_js_1.extractZip)(absPath, opts.listOnly !== false);
128
+ chunks = res.chunks;
129
+ warnings = res.warnings;
130
+ break;
131
+ }
132
+ case 'txt':
133
+ case 'md':
134
+ case 'html':
135
+ case 'xml':
136
+ case 'rtf':
137
+ case 'epub':
138
+ case 'log':
139
+ case 'unknown':
140
+ default: {
141
+ const res = await (0, text_js_1.extractText)(absPath, opts);
142
+ chunks = res.chunks;
143
+ warnings = res.warnings;
144
+ break;
145
+ }
146
+ }
147
+ // Apply maxChars truncation across chunks if set
148
+ let truncated = false;
149
+ if (opts.maxChars) {
150
+ let remaining = opts.maxChars;
151
+ for (const chunk of chunks) {
152
+ if (remaining <= 0) {
153
+ chunk.content = '';
154
+ }
155
+ else if (chunk.content.length > remaining) {
156
+ chunk.content = chunk.content.slice(0, remaining) + '\n\n[… truncated …]';
157
+ remaining = 0;
158
+ truncated = true;
159
+ }
160
+ else {
161
+ remaining -= chunk.content.length;
162
+ }
163
+ }
164
+ }
165
+ const fullContent = chunks.map(c => c.content).join('\n\n');
166
+ return {
167
+ type: docType,
168
+ content: fullContent,
169
+ chunks,
170
+ charCount: fullContent.length,
171
+ truncated,
172
+ warnings,
173
+ };
174
+ }
175
+ }
176
+ exports.DocReader = DocReader;
177
+ /** Convenience one-shot function */
178
+ async function readDoc(filePath, options) {
179
+ return new DocReader().read(filePath, options);
180
+ }
181
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export type DocType = 'pdf' | 'docx' | 'doc' | 'xlsx' | 'xls' | 'pptx' | 'ppt' | 'csv' | 'tsv' | 'json' | 'jsonl' | 'txt' | 'md' | 'html' | 'xml' | 'rtf' | 'epub' | 'zip' | 'log' | 'unknown';
2
+ export interface ExtractionOptions {
3
+ /** Max characters to return. Default: unlimited */
4
+ maxChars?: number;
5
+ /** For PDFs: extract page-by-page. Default: false */
6
+ pageByPage?: boolean;
7
+ /** For spreadsheets: include all sheets. Default: true */
8
+ allSheets?: boolean;
9
+ /** For ZIP: list files only, don't extract. Default: true */
10
+ listOnly?: boolean;
11
+ /** Encoding hint for text files. Default: auto-detect */
12
+ encoding?: BufferEncoding;
13
+ /** Stream large files in chunks instead of buffering. Default: true for >10MB */
14
+ streaming?: boolean;
15
+ /** Chunk size for streaming in bytes. Default: 1MB */
16
+ chunkSize?: number;
17
+ }
18
+ export interface DocChunk {
19
+ index: number;
20
+ content: string;
21
+ /** Source label: page number, sheet name, slide index, etc. */
22
+ source?: string;
23
+ }
24
+ export interface ExtractionResult {
25
+ /** Detected document type */
26
+ type: DocType;
27
+ /** Full concatenated content */
28
+ content: string;
29
+ /** Individual chunks (pages, sheets, slides…) */
30
+ chunks: DocChunk[];
31
+ /** Total character count */
32
+ charCount: number;
33
+ /** Whether content was truncated by maxChars */
34
+ truncated: boolean;
35
+ /** Warning messages (encoding fallback, partial extraction, etc.) */
36
+ warnings: string[];
37
+ }
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GACf,KAAK,GACL,MAAM,GACN,KAAK,GACL,MAAM,GACN,KAAK,GACL,MAAM,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,MAAM,GACN,OAAO,GACP,KAAK,GACL,IAAI,GACJ,MAAM,GACN,KAAK,GACL,KAAK,GACL,MAAM,GACN,KAAK,GACL,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { DocType } from '../types/index.js';
2
+ export declare function detectDocType(filePath: string): Promise<DocType>;
3
+ export declare function readTextFile(filePath: string, hint?: BufferEncoding): Promise<{
4
+ text: string;
5
+ encoding: string;
6
+ }>;
7
+ export declare function streamTextFile(filePath: string, chunkSize?: number): AsyncGenerator<string>;
8
+ export declare function truncate(text: string, maxChars?: number): {
9
+ text: string;
10
+ truncated: boolean;
11
+ };
12
+ export declare function fileSizeBytes(filePath: string): number;
13
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA6DjD,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBtE;AAID,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB7C;AAID,wBAAuB,cAAc,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,SAAc,GACtB,cAAc,CAAC,MAAM,CAAC,CAQxB;AAID,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAMtC;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.detectDocType = detectDocType;
40
+ exports.readTextFile = readTextFile;
41
+ exports.streamTextFile = streamTextFile;
42
+ exports.truncate = truncate;
43
+ exports.fileSizeBytes = fileSizeBytes;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const chardet_1 = __importDefault(require("chardet"));
47
+ const iconv_lite_1 = __importDefault(require("iconv-lite"));
48
+ // ─── Type Detection ────────────────────────────────────────────────────────────
49
+ const EXT_MAP = {
50
+ pdf: 'pdf',
51
+ docx: 'docx',
52
+ doc: 'doc',
53
+ xlsx: 'xlsx',
54
+ xls: 'xls',
55
+ pptx: 'pptx',
56
+ ppt: 'ppt',
57
+ csv: 'csv',
58
+ tsv: 'tsv',
59
+ json: 'json',
60
+ jsonl: 'jsonl',
61
+ txt: 'txt',
62
+ md: 'md',
63
+ markdown: 'md',
64
+ html: 'html',
65
+ htm: 'html',
66
+ xml: 'xml',
67
+ rtf: 'rtf',
68
+ epub: 'epub',
69
+ zip: 'zip',
70
+ log: 'log',
71
+ };
72
+ /** Magic-byte signatures for format sniffing (first 8 bytes) */
73
+ const MAGIC = [
74
+ { bytes: [0x25, 0x50, 0x44, 0x46], type: 'pdf' }, // %PDF
75
+ { bytes: [0x50, 0x4b, 0x03, 0x04], type: 'zip' }, // PK (zip, docx, xlsx, pptx, epub share this)
76
+ { bytes: [0x50, 0x4b, 0x05, 0x06], type: 'zip' },
77
+ { bytes: [0xd0, 0xcf, 0x11, 0xe0], type: 'doc' }, // OLE2 (doc, xls, ppt legacy)
78
+ { bytes: [0x7b, 0x5c, 0x72, 0x74, 0x66], type: 'rtf' }, // {\rtf
79
+ ];
80
+ function detectByMagic(buf) {
81
+ for (const sig of MAGIC) {
82
+ const match = sig.bytes.every((b, i) => buf[i] === b);
83
+ if (match)
84
+ return sig.type;
85
+ }
86
+ return null;
87
+ }
88
+ /** Refine a generic 'zip' magic hit using the internal paths */
89
+ async function refineZipType(filePath) {
90
+ try {
91
+ const AdmZip = (await Promise.resolve().then(() => __importStar(require('adm-zip')))).default;
92
+ const zip = new AdmZip(filePath);
93
+ const names = zip.getEntries().map((e) => e.entryName);
94
+ if (names.some((n) => n.startsWith('word/')))
95
+ return 'docx';
96
+ if (names.some((n) => n.startsWith('xl/')))
97
+ return 'xlsx';
98
+ if (names.some((n) => n.startsWith('ppt/')))
99
+ return 'pptx';
100
+ if (names.some((n) => n === 'mimetype' || n.startsWith('OEBPS/')))
101
+ return 'epub';
102
+ return 'zip';
103
+ }
104
+ catch {
105
+ return 'zip';
106
+ }
107
+ }
108
+ async function detectDocType(filePath) {
109
+ const ext = path.extname(filePath).replace('.', '').toLowerCase();
110
+ if (ext && EXT_MAP[ext] && EXT_MAP[ext] !== 'zip')
111
+ return EXT_MAP[ext];
112
+ // Read first 8 bytes for magic sniffing
113
+ const fd = fs.openSync(filePath, 'r');
114
+ const buf = Buffer.alloc(8);
115
+ fs.readSync(fd, buf, 0, 8, 0);
116
+ fs.closeSync(fd);
117
+ const magic = detectByMagic(buf);
118
+ if (magic === 'zip')
119
+ return refineZipType(filePath);
120
+ if (magic)
121
+ return magic;
122
+ if (ext && EXT_MAP[ext])
123
+ return EXT_MAP[ext];
124
+ return 'unknown';
125
+ }
126
+ // ─── Encoding ─────────────────────────────────────────────────────────────────
127
+ async function readTextFile(filePath, hint) {
128
+ const raw = fs.readFileSync(filePath);
129
+ if (hint) {
130
+ return { text: iconv_lite_1.default.decode(raw, hint), encoding: hint };
131
+ }
132
+ const detected = chardet_1.default.detect(raw);
133
+ const enc = detected ?? 'utf-8';
134
+ try {
135
+ const text = iconv_lite_1.default.decode(raw, enc);
136
+ return { text, encoding: enc };
137
+ }
138
+ catch {
139
+ return { text: raw.toString('utf-8'), encoding: 'utf-8 (fallback)' };
140
+ }
141
+ }
142
+ // ─── Streaming large text ─────────────────────────────────────────────────────
143
+ async function* streamTextFile(filePath, chunkSize = 1024 * 1024) {
144
+ const stream = fs.createReadStream(filePath, {
145
+ encoding: 'utf-8',
146
+ highWaterMark: chunkSize,
147
+ });
148
+ for await (const chunk of stream) {
149
+ yield chunk;
150
+ }
151
+ }
152
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
153
+ function truncate(text, maxChars) {
154
+ if (!maxChars || text.length <= maxChars)
155
+ return { text, truncated: false };
156
+ return {
157
+ text: text.slice(0, maxChars) + '\n\n[… content truncated …]',
158
+ truncated: true,
159
+ };
160
+ }
161
+ function fileSizeBytes(filePath) {
162
+ return fs.statSync(filePath).size;
163
+ }
164
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,76 @@
1
1
  {
2
2
  "name": "doc-reader-sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Universal document text extractor SDK for Node.js — PDF, DOCX, XLSX, PPTX, CSV, JSON, and more",
5
+ "type": "commonjs",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "bin": {
16
+ "doc-reader": "dist/cli.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "clean": "rm -rf dist",
26
+ "prebuild": "npm run clean",
27
+ "dev": "tsx src/cli.ts",
28
+ "read": "tsx src/cli.ts",
29
+ "start": "node dist/cli.js",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "test:smoke": "tsx src/test.ts",
33
+ "typecheck": "tsc --noEmit",
34
+ "prepublishOnly": "npm run typecheck && npm run test && npm run build"
35
+ },
36
+ "keywords": [
37
+ "pdf",
38
+ "docx",
39
+ "xlsx",
40
+ "pptx",
41
+ "csv",
42
+ "document",
43
+ "extractor",
44
+ "parser",
45
+ "text-extraction",
46
+ "sdk"
47
+ ],
48
+ "license": "MIT",
49
+ "author": "sashi-does (https://github.com/sashi-does)",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/sashi-does/doc-reader-sdk.git"
53
+ },
54
+ "homepage": "https://github.com/sashi-does/doc-reader-sdk#readme",
55
+ "bugs": {
56
+ "url": "https://github.com/sashi-does/doc-reader-sdk/issues"
57
+ },
58
+ "engines": {
59
+ "node": ">=18"
60
+ },
61
+ "devDependencies": {
62
+ "@types/node": "^22.15.3",
63
+ "@types/pdf-parse": "^1.1.5",
64
+ "tsx": "^4.23.15",
65
+ "typescript": "^5.8.3",
66
+ "vitest": "^5.0.5"
67
+ },
68
+ "dependencies": {
69
+ "adm-zip": "^0.6.1",
70
+ "chardet": "^2.0.0",
71
+ "iconv-lite": "^0.6.3",
72
+ "mammoth": "^1.13.0",
73
+ "pdf-parse": "^1.1.1",
74
+ "xlsx": "^0.18.5"
75
+ }
76
+ }