@sinoia/hubdoc-tools 1.3.3 → 1.3.5

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 (83) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/plugins/alfresco/index.d.ts +26 -0
  3. package/dist/plugins/alfresco/index.d.ts.map +1 -0
  4. package/dist/plugins/alfresco/index.js +405 -0
  5. package/dist/plugins/alfresco/index.js.map +1 -0
  6. package/dist/plugins/alfresco/plugin.json +12 -0
  7. package/dist/plugins/aws-s3/index.d.ts +23 -0
  8. package/dist/plugins/aws-s3/index.d.ts.map +1 -0
  9. package/dist/plugins/aws-s3/index.js +383 -0
  10. package/dist/plugins/aws-s3/index.js.map +1 -0
  11. package/dist/plugins/aws-s3/plugin.json +12 -0
  12. package/dist/plugins/azure-blob/index.d.ts +23 -0
  13. package/dist/plugins/azure-blob/index.d.ts.map +1 -0
  14. package/dist/plugins/azure-blob/index.js +340 -0
  15. package/dist/plugins/azure-blob/index.js.map +1 -0
  16. package/dist/plugins/azure-blob/plugin.json +12 -0
  17. package/dist/plugins/box/index.d.ts +26 -0
  18. package/dist/plugins/box/index.d.ts.map +1 -0
  19. package/dist/plugins/box/index.js +387 -0
  20. package/dist/plugins/box/index.js.map +1 -0
  21. package/dist/plugins/box/plugin.json +12 -0
  22. package/dist/plugins/core/index.d.ts +25 -0
  23. package/dist/plugins/core/index.d.ts.map +1 -0
  24. package/dist/plugins/core/index.js +400 -0
  25. package/dist/plugins/core/index.js.map +1 -0
  26. package/dist/plugins/core/plugin.json +26 -0
  27. package/dist/plugins/dropbox/index.d.ts +27 -0
  28. package/dist/plugins/dropbox/index.d.ts.map +1 -0
  29. package/dist/plugins/dropbox/index.js +375 -0
  30. package/dist/plugins/dropbox/index.js.map +1 -0
  31. package/dist/plugins/dropbox/plugin.json +12 -0
  32. package/dist/plugins/filesystem/index.d.ts +22 -0
  33. package/dist/plugins/filesystem/index.d.ts.map +1 -0
  34. package/dist/plugins/filesystem/index.js +306 -0
  35. package/dist/plugins/filesystem/index.js.map +1 -0
  36. package/dist/plugins/filesystem/plugin.json +12 -0
  37. package/dist/plugins/googledrive/index.d.ts +27 -0
  38. package/dist/plugins/googledrive/index.d.ts.map +1 -0
  39. package/dist/plugins/googledrive/index.js +383 -0
  40. package/dist/plugins/googledrive/index.js.map +1 -0
  41. package/dist/plugins/googledrive/plugin.json +12 -0
  42. package/dist/plugins/nuxeo/index.d.ts +24 -0
  43. package/dist/plugins/nuxeo/index.d.ts.map +1 -0
  44. package/dist/plugins/nuxeo/index.js +405 -0
  45. package/dist/plugins/nuxeo/index.js.map +1 -0
  46. package/dist/plugins/nuxeo/plugin.json +12 -0
  47. package/dist/plugins/onedrive/index.d.ts +25 -0
  48. package/dist/plugins/onedrive/index.d.ts.map +1 -0
  49. package/dist/plugins/onedrive/index.js +362 -0
  50. package/dist/plugins/onedrive/index.js.map +1 -0
  51. package/dist/plugins/onedrive/plugin.json +12 -0
  52. package/dist/plugins/opentext/index.d.ts +26 -0
  53. package/dist/plugins/opentext/index.d.ts.map +1 -0
  54. package/dist/plugins/opentext/index.js +440 -0
  55. package/dist/plugins/opentext/index.js.map +1 -0
  56. package/dist/plugins/opentext/plugin.json +12 -0
  57. package/dist/plugins/sharepoint/index.d.ts +27 -0
  58. package/dist/plugins/sharepoint/index.d.ts.map +1 -0
  59. package/dist/plugins/sharepoint/index.js +397 -0
  60. package/dist/plugins/sharepoint/index.js.map +1 -0
  61. package/dist/plugins/sharepoint/plugin.json +12 -0
  62. package/dist/services/hubdoc-api.d.ts +1 -1
  63. package/dist/services/hubdoc-api.js +1 -1
  64. package/dist/services/oauth-token-service.d.ts +1 -1
  65. package/dist/services/oauth-token-service.js +2 -2
  66. package/dist/services/permission-manager.d.ts +1 -1
  67. package/dist/services/permission-manager.js +1 -1
  68. package/dist/src/types/plugins.d.ts +111 -0
  69. package/dist/src/types/plugins.d.ts.map +1 -0
  70. package/dist/src/types/plugins.js +3 -0
  71. package/dist/src/types/plugins.js.map +1 -0
  72. package/dist/src/utils/concurrent-processor.d.ts +63 -0
  73. package/dist/src/utils/concurrent-processor.d.ts.map +1 -0
  74. package/dist/src/utils/concurrent-processor.js +240 -0
  75. package/dist/src/utils/concurrent-processor.js.map +1 -0
  76. package/dist/src/utils/xml-metadata.d.ts +47 -0
  77. package/dist/src/utils/xml-metadata.d.ts.map +1 -0
  78. package/dist/src/utils/xml-metadata.js +200 -0
  79. package/dist/src/utils/xml-metadata.js.map +1 -0
  80. package/dist/types/index.d.ts +1 -1
  81. package/package.json +10 -2
  82. package/plugins/aws-s3/index.ts +2 -2
  83. package/plugins/sharepoint/index.ts +1 -1
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const client_s3_1 = require("@aws-sdk/client-s3");
7
+ const lib_storage_1 = require("@aws-sdk/lib-storage");
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
10
+ class S3Plugin {
11
+ constructor() {
12
+ this.name = 's3';
13
+ this.version = '1.0.0';
14
+ this.description = 'AWS S3 document source';
15
+ this.supportedOperations = ['import', 'export', 'both'];
16
+ }
17
+ async testConnection(config) {
18
+ try {
19
+ const s3Config = config;
20
+ const client = this.createS3Client(s3Config);
21
+ await client.send(new client_s3_1.HeadBucketCommand({
22
+ Bucket: s3Config.bucketName
23
+ }));
24
+ return true;
25
+ }
26
+ catch (error) {
27
+ console.error(`S3 connection test failed: ${error.message}`);
28
+ return false;
29
+ }
30
+ }
31
+ async scan(config, options) {
32
+ this.config = config;
33
+ this.s3Client = this.createS3Client(this.config);
34
+ const sources = [];
35
+ const errors = [];
36
+ let totalSize = 0;
37
+ try {
38
+ const limit = this.config.limit || options?.limit;
39
+ console.log(`🔍 Scanning S3 bucket: ${this.config.bucketName}${limit ? ` (limit: ${limit})` : ''}...`);
40
+ const objects = await this.listAllObjects(this.config.prefix);
41
+ let processedCount = 0;
42
+ for (const obj of objects) {
43
+ const source = {
44
+ id: obj.key,
45
+ // Normalize filename to NFC to handle accented characters consistently across platforms
46
+ name: path_1.default.basename(obj.key).normalize('NFC'),
47
+ path: obj.key,
48
+ size: obj.size,
49
+ mimeType: this.getMimeType(obj.key),
50
+ lastModified: obj.lastModified,
51
+ metadata: {
52
+ s3Key: obj.key,
53
+ etag: obj.etag,
54
+ storageClass: obj.storageClass,
55
+ s3Metadata: obj.metadata
56
+ }
57
+ };
58
+ // Apply filters
59
+ if (this.shouldIncludeSource(source, options)) {
60
+ sources.push(source);
61
+ totalSize += source.size;
62
+ processedCount++;
63
+ // Check limit
64
+ if (limit && processedCount >= limit) {
65
+ console.log(`📏 Reached limit of ${limit} files`);
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ return {
71
+ sources,
72
+ totalCount: sources.length,
73
+ totalSize,
74
+ errors
75
+ };
76
+ }
77
+ catch (error) {
78
+ return {
79
+ sources: [],
80
+ totalCount: 0,
81
+ totalSize: 0,
82
+ errors: [`S3 scan failed: ${error.message}`]
83
+ };
84
+ }
85
+ }
86
+ async import(config, sources, targetDir, options) {
87
+ this.config = config;
88
+ this.s3Client = this.createS3Client(this.config);
89
+ const results = [];
90
+ const batchSize = options?.batchSize || 5;
91
+ // Process in batches to manage memory and connections
92
+ for (let i = 0; i < sources.length; i += batchSize) {
93
+ const batch = sources.slice(i, i + batchSize);
94
+ for (const source of batch) {
95
+ const result = await this.importSingle(source, targetDir);
96
+ results.push(result);
97
+ // Small delay to respect rate limits
98
+ await this.sleep(100);
99
+ }
100
+ }
101
+ return results;
102
+ }
103
+ async importSingle(source, targetDir) {
104
+ try {
105
+ if (!this.s3Client || !this.config)
106
+ throw new Error('S3 client not initialized');
107
+ const targetPath = path_1.default.join(targetDir, source.path);
108
+ const targetDirectory = path_1.default.dirname(targetPath);
109
+ await fs_extra_1.default.ensureDir(targetDirectory);
110
+ // Download file from S3
111
+ const command = new client_s3_1.GetObjectCommand({
112
+ Bucket: this.config.bucketName,
113
+ Key: source.id
114
+ });
115
+ const response = await this.s3Client.send(command);
116
+ if (!response.Body) {
117
+ throw new Error('Empty response body from S3');
118
+ }
119
+ // Stream to file
120
+ const writer = fs_extra_1.default.createWriteStream(targetPath);
121
+ // Handle different body types
122
+ if (response.Body instanceof ReadableStream) {
123
+ const reader = response.Body.getReader();
124
+ const pump = async () => {
125
+ const { done, value } = await reader.read();
126
+ if (done) {
127
+ writer.end();
128
+ return;
129
+ }
130
+ writer.write(Buffer.from(value));
131
+ return pump();
132
+ };
133
+ await pump();
134
+ }
135
+ else if (typeof response.Body.pipe === 'function') {
136
+ // Node.js stream
137
+ response.Body.pipe(writer);
138
+ }
139
+ else {
140
+ // Buffer or Uint8Array
141
+ writer.write(response.Body);
142
+ writer.end();
143
+ }
144
+ return new Promise((resolve) => {
145
+ writer.on('finish', () => {
146
+ resolve({
147
+ success: true,
148
+ source,
149
+ localPath: targetPath,
150
+ bytesTransferred: source.size
151
+ });
152
+ });
153
+ writer.on('error', (error) => {
154
+ resolve({
155
+ success: false,
156
+ source,
157
+ error: error.message
158
+ });
159
+ });
160
+ });
161
+ }
162
+ catch (error) {
163
+ return {
164
+ success: false,
165
+ source,
166
+ error: error.message
167
+ };
168
+ }
169
+ }
170
+ async export(config, localSources, options) {
171
+ this.config = config;
172
+ this.s3Client = this.createS3Client(this.config);
173
+ const results = [];
174
+ for (const source of localSources) {
175
+ try {
176
+ if (!this.s3Client || !this.config)
177
+ throw new Error('S3 client not initialized');
178
+ // Determine S3 key
179
+ let s3Key;
180
+ if (options?.preserveStructure) {
181
+ s3Key = this.config.prefix ? `${this.config.prefix}/${source.path}` : source.path;
182
+ }
183
+ else {
184
+ s3Key = this.config.prefix ? `${this.config.prefix}/${source.name}` : source.name;
185
+ }
186
+ // Read local file
187
+ const fileContent = await fs_extra_1.default.readFile(source.id);
188
+ // Upload to S3 using multipart upload for large files
189
+ const upload = new lib_storage_1.Upload({
190
+ client: this.s3Client,
191
+ params: {
192
+ Bucket: this.config.bucketName,
193
+ Key: s3Key,
194
+ Body: fileContent,
195
+ ContentType: source.mimeType,
196
+ Metadata: {
197
+ originalPath: source.path,
198
+ originalName: source.name,
199
+ uploadedBy: 'hubdoc-tools'
200
+ }
201
+ }
202
+ });
203
+ await upload.done();
204
+ const targetPath = options?.preserveStructure ? source.path : source.name;
205
+ results.push({
206
+ success: true,
207
+ targetPath,
208
+ source,
209
+ bytesTransferred: source.size
210
+ });
211
+ }
212
+ catch (error) {
213
+ results.push({
214
+ success: false,
215
+ targetPath: options?.targetPath || '',
216
+ source,
217
+ error: error.message
218
+ });
219
+ }
220
+ }
221
+ return results;
222
+ }
223
+ async listAllObjects(prefix) {
224
+ if (!this.s3Client || !this.config)
225
+ throw new Error('S3 client not initialized');
226
+ const allObjects = [];
227
+ let continuationToken;
228
+ try {
229
+ do {
230
+ const command = new client_s3_1.ListObjectsV2Command({
231
+ Bucket: this.config.bucketName,
232
+ Prefix: prefix,
233
+ ContinuationToken: continuationToken,
234
+ MaxKeys: 1000
235
+ });
236
+ const response = await this.s3Client.send(command);
237
+ const objects = response.Contents || [];
238
+ for (const obj of objects) {
239
+ if (obj.Key && obj.Size !== undefined && obj.LastModified) {
240
+ // Skip folders (keys ending with /)
241
+ if (!obj.Key.endsWith('/')) {
242
+ allObjects.push({
243
+ key: obj.Key,
244
+ size: obj.Size,
245
+ lastModified: obj.LastModified,
246
+ etag: obj.ETag || '',
247
+ storageClass: obj.StorageClass
248
+ });
249
+ }
250
+ }
251
+ }
252
+ continuationToken = response.NextContinuationToken;
253
+ } while (continuationToken);
254
+ return allObjects;
255
+ }
256
+ catch (error) {
257
+ throw new Error(`Failed to list S3 objects: ${error.message}`);
258
+ }
259
+ }
260
+ getConfigSchema() {
261
+ return {
262
+ type: 'object',
263
+ properties: {
264
+ accessKeyId: {
265
+ type: 'string',
266
+ description: 'AWS Access Key ID',
267
+ required: true
268
+ },
269
+ secretAccessKey: {
270
+ type: 'string',
271
+ description: 'AWS Secret Access Key',
272
+ required: true
273
+ },
274
+ region: {
275
+ type: 'string',
276
+ description: 'AWS Region (e.g., us-east-1)',
277
+ required: true
278
+ },
279
+ bucketName: {
280
+ type: 'string',
281
+ description: 'S3 Bucket name',
282
+ required: true
283
+ },
284
+ prefix: {
285
+ type: 'string',
286
+ description: 'S3 key prefix to filter objects (optional)',
287
+ required: false
288
+ },
289
+ endpoint: {
290
+ type: 'string',
291
+ description: 'Custom S3 endpoint for S3-compatible services (optional)',
292
+ required: false
293
+ },
294
+ limit: {
295
+ type: 'number',
296
+ description: 'Maximum number of documents to scan (useful for testing)',
297
+ required: false
298
+ }
299
+ },
300
+ required: ['accessKeyId', 'secretAccessKey', 'region', 'bucketName']
301
+ };
302
+ }
303
+ async initialize(config) {
304
+ this.config = config;
305
+ if (!this.config.accessKeyId || !this.config.secretAccessKey) {
306
+ throw new Error('AWS credentials are required');
307
+ }
308
+ if (!this.config.region) {
309
+ throw new Error('AWS region is required');
310
+ }
311
+ if (!this.config.bucketName) {
312
+ throw new Error('S3 bucket name is required');
313
+ }
314
+ this.s3Client = this.createS3Client(this.config);
315
+ }
316
+ async destroy() {
317
+ this.config = undefined;
318
+ this.s3Client = undefined;
319
+ }
320
+ createS3Client(config) {
321
+ const clientConfig = {
322
+ region: config.region,
323
+ credentials: {
324
+ accessKeyId: config.accessKeyId,
325
+ secretAccessKey: config.secretAccessKey
326
+ }
327
+ };
328
+ // Support for S3-compatible services
329
+ if (config.endpoint) {
330
+ clientConfig.endpoint = config.endpoint;
331
+ clientConfig.forcePathStyle = true; // Required for most S3-compatible services
332
+ }
333
+ return new client_s3_1.S3Client(clientConfig);
334
+ }
335
+ getMimeType(key) {
336
+ const ext = path_1.default.extname(key).toLowerCase();
337
+ const mimeTypes = {
338
+ '.pdf': 'application/pdf',
339
+ '.doc': 'application/msword',
340
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
341
+ '.xls': 'application/vnd.ms-excel',
342
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
343
+ '.ppt': 'application/vnd.ms-powerpoint',
344
+ '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
345
+ '.txt': 'text/plain',
346
+ '.csv': 'text/csv',
347
+ '.json': 'application/json',
348
+ '.xml': 'application/xml',
349
+ '.jpg': 'image/jpeg',
350
+ '.jpeg': 'image/jpeg',
351
+ '.png': 'image/png',
352
+ '.gif': 'image/gif',
353
+ '.zip': 'application/zip',
354
+ '.tar': 'application/x-tar',
355
+ '.gz': 'application/gzip'
356
+ };
357
+ return mimeTypes[ext] || 'application/octet-stream';
358
+ }
359
+ shouldIncludeSource(source, options) {
360
+ // Apply size filter
361
+ if (options?.filters?.maxSize && source.size > options.filters.maxSize) {
362
+ return false;
363
+ }
364
+ // Apply date range filter
365
+ if (options?.filters?.dateRange) {
366
+ const { from, to } = options.filters.dateRange;
367
+ if (from && source.lastModified < from)
368
+ return false;
369
+ if (to && source.lastModified > to)
370
+ return false;
371
+ }
372
+ // Apply MIME type filter
373
+ if (options?.filters?.mimeTypes && !options.filters.mimeTypes.includes(source.mimeType)) {
374
+ return false;
375
+ }
376
+ return true;
377
+ }
378
+ sleep(ms) {
379
+ return new Promise(resolve => setTimeout(resolve, ms));
380
+ }
381
+ }
382
+ exports.default = S3Plugin;
383
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../plugins/aws-s3/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "aws-s3",
3
+ "version": "1.0.0",
4
+ "description": "AWS S3 document source plugin",
5
+ "author": "HubDoc Tools",
6
+ "main": "index.ts",
7
+ "hubdocToolVersion": "^1.0.0",
8
+ "dependencies": {
9
+ "aws-sdk": "^2.1000.0",
10
+ "fs-extra": "^11.1.0"
11
+ }
12
+ }
@@ -0,0 +1,23 @@
1
+ import { DocumentSourcePlugin, DocumentSource, PluginConfig, ScanResult, PluginImportOptions, PluginExportOptions, ImportResult, ExportResult } from '../../src/types/plugins';
2
+ export default class AzureBlobPlugin implements DocumentSourcePlugin {
3
+ readonly name = "azure-blob";
4
+ readonly version = "1.0.0";
5
+ readonly description = "Azure Blob Storage document source";
6
+ readonly supportedOperations: readonly ["import", "export", "both"];
7
+ private config?;
8
+ private blobServiceClient?;
9
+ testConnection(config: PluginConfig): Promise<boolean>;
10
+ scan(config: PluginConfig, options?: PluginImportOptions): Promise<ScanResult>;
11
+ import(config: PluginConfig, sources: DocumentSource[], targetDir: string, options?: PluginImportOptions): Promise<ImportResult[]>;
12
+ private importSingle;
13
+ export?(config: PluginConfig, localSources: DocumentSource[], options?: PluginExportOptions): Promise<ExportResult[]>;
14
+ private listAllBlobs;
15
+ getConfigSchema(): Record<string, any>;
16
+ initialize(config: PluginConfig): Promise<void>;
17
+ destroy(): Promise<void>;
18
+ private createBlobServiceClient;
19
+ private getMimeType;
20
+ private shouldIncludeSource;
21
+ private sleep;
22
+ }
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../plugins/azure-blob/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,yBAAyB,CAAC;AAsBjC,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,oBAAoB;IAClE,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,WAAW,wCAAwC;IAC5D,QAAQ,CAAC,mBAAmB,wCAAyC;IAErE,OAAO,CAAC,MAAM,CAAC,CAAkB;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAExC,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAetD,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IA+D9E,MAAM,CACV,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,cAAc,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,YAAY,EAAE,CAAC;YAuBZ,YAAY;IA8BpB,MAAM,CAAC,CACX,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,cAAc,EAAE,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,YAAY,EAAE,CAAC;YAyDZ,YAAY;IAkC1B,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAiDhC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,KAAK;CAGd"}