mcard-js 2.0.1 → 2.1.1

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 (120) hide show
  1. package/README.md +129 -3
  2. package/dist/index.d.ts +5 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/model/CardCollection.d.ts +10 -0
  7. package/dist/model/CardCollection.d.ts.map +1 -1
  8. package/dist/model/CardCollection.js +53 -0
  9. package/dist/model/CardCollection.js.map +1 -1
  10. package/dist/model/ContentTypeInterpreter.d.ts +23 -0
  11. package/dist/model/ContentTypeInterpreter.d.ts.map +1 -0
  12. package/dist/model/ContentTypeInterpreter.js +132 -0
  13. package/dist/model/ContentTypeInterpreter.js.map +1 -0
  14. package/dist/model/GTime.d.ts +15 -0
  15. package/dist/model/GTime.d.ts.map +1 -1
  16. package/dist/model/GTime.js +44 -2
  17. package/dist/model/GTime.js.map +1 -1
  18. package/dist/model/detectors/BaseDetector.d.ts +26 -0
  19. package/dist/model/detectors/BaseDetector.d.ts.map +1 -0
  20. package/dist/model/detectors/BaseDetector.js +5 -0
  21. package/dist/model/detectors/BaseDetector.js.map +1 -0
  22. package/dist/model/detectors/BinaryDetector.d.ts +12 -0
  23. package/dist/model/detectors/BinaryDetector.d.ts.map +1 -0
  24. package/dist/model/detectors/BinaryDetector.js +82 -0
  25. package/dist/model/detectors/BinaryDetector.js.map +1 -0
  26. package/dist/model/detectors/DataFormatDetectors.d.ts +29 -0
  27. package/dist/model/detectors/DataFormatDetectors.d.ts.map +1 -0
  28. package/dist/model/detectors/DataFormatDetectors.js +223 -0
  29. package/dist/model/detectors/DataFormatDetectors.js.map +1 -0
  30. package/dist/model/detectors/LanguageDetector.d.ts +11 -0
  31. package/dist/model/detectors/LanguageDetector.d.ts.map +1 -0
  32. package/dist/model/detectors/LanguageDetector.js +148 -0
  33. package/dist/model/detectors/LanguageDetector.js.map +1 -0
  34. package/dist/model/detectors/MarkupDetectors.d.ts +22 -0
  35. package/dist/model/detectors/MarkupDetectors.d.ts.map +1 -0
  36. package/dist/model/detectors/MarkupDetectors.js +132 -0
  37. package/dist/model/detectors/MarkupDetectors.js.map +1 -0
  38. package/dist/model/detectors/OBJDetector.d.ts +8 -0
  39. package/dist/model/detectors/OBJDetector.d.ts.map +1 -0
  40. package/dist/model/detectors/OBJDetector.js +48 -0
  41. package/dist/model/detectors/OBJDetector.js.map +1 -0
  42. package/dist/model/detectors/registry.d.ts +13 -0
  43. package/dist/model/detectors/registry.d.ts.map +1 -0
  44. package/dist/model/detectors/registry.js +67 -0
  45. package/dist/model/detectors/registry.js.map +1 -0
  46. package/dist/ptr/llm/LLMRuntime.d.ts +15 -0
  47. package/dist/ptr/llm/LLMRuntime.d.ts.map +1 -1
  48. package/dist/ptr/llm/LLMRuntime.js +62 -0
  49. package/dist/ptr/llm/LLMRuntime.js.map +1 -1
  50. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts +20 -0
  51. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts.map +1 -0
  52. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js +42 -0
  53. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js.map +1 -0
  54. package/dist/rag/GraphRAGEngine.d.ts +26 -0
  55. package/dist/rag/GraphRAGEngine.d.ts.map +1 -0
  56. package/dist/rag/GraphRAGEngine.js +166 -0
  57. package/dist/rag/GraphRAGEngine.js.map +1 -0
  58. package/dist/rag/HandleVectorStore.d.ts +201 -0
  59. package/dist/rag/HandleVectorStore.d.ts.map +1 -0
  60. package/dist/rag/HandleVectorStore.js +527 -0
  61. package/dist/rag/HandleVectorStore.js.map +1 -0
  62. package/dist/rag/PersistentIndexer.d.ts +144 -0
  63. package/dist/rag/PersistentIndexer.d.ts.map +1 -0
  64. package/dist/rag/PersistentIndexer.js +275 -0
  65. package/dist/rag/PersistentIndexer.js.map +1 -0
  66. package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts +87 -0
  67. package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts.map +1 -0
  68. package/dist/rag/embeddings/VisionEmbeddingProvider.js +164 -0
  69. package/dist/rag/embeddings/VisionEmbeddingProvider.js.map +1 -0
  70. package/dist/rag/graph/community.d.ts +56 -0
  71. package/dist/rag/graph/community.d.ts.map +1 -0
  72. package/dist/rag/graph/community.js +247 -0
  73. package/dist/rag/graph/community.js.map +1 -0
  74. package/dist/rag/graph/extractor.d.ts +99 -0
  75. package/dist/rag/graph/extractor.d.ts.map +1 -0
  76. package/dist/rag/graph/extractor.js +210 -0
  77. package/dist/rag/graph/extractor.js.map +1 -0
  78. package/dist/rag/graph/store.d.ts +176 -0
  79. package/dist/rag/graph/store.d.ts.map +1 -0
  80. package/dist/rag/graph/store.js +504 -0
  81. package/dist/rag/graph/store.js.map +1 -0
  82. package/dist/rag/index.d.ts +20 -0
  83. package/dist/rag/index.d.ts.map +1 -0
  84. package/dist/rag/index.js +26 -0
  85. package/dist/rag/index.js.map +1 -0
  86. package/dist/rag/semanticVersioning.d.ts +187 -0
  87. package/dist/rag/semanticVersioning.d.ts.map +1 -0
  88. package/dist/rag/semanticVersioning.js +253 -0
  89. package/dist/rag/semanticVersioning.js.map +1 -0
  90. package/dist/storage/IndexedDBEngine.d.ts +3 -0
  91. package/dist/storage/IndexedDBEngine.d.ts.map +1 -1
  92. package/dist/storage/IndexedDBEngine.js +55 -2
  93. package/dist/storage/IndexedDBEngine.js.map +1 -1
  94. package/dist/storage/SqliteNodeEngine.d.ts +3 -0
  95. package/dist/storage/SqliteNodeEngine.d.ts.map +1 -1
  96. package/dist/storage/SqliteNodeEngine.js +51 -4
  97. package/dist/storage/SqliteNodeEngine.js.map +1 -1
  98. package/dist/storage/SqliteWasmEngine.d.ts +3 -0
  99. package/dist/storage/SqliteWasmEngine.d.ts.map +1 -1
  100. package/dist/storage/SqliteWasmEngine.js +55 -1
  101. package/dist/storage/SqliteWasmEngine.js.map +1 -1
  102. package/dist/storage/StorageAdapter.d.ts +5 -0
  103. package/dist/storage/StorageAdapter.d.ts.map +1 -1
  104. package/dist/storage/VectorStore.d.ts +28 -5
  105. package/dist/storage/VectorStore.d.ts.map +1 -1
  106. package/dist/storage/VectorStore.js +110 -50
  107. package/dist/storage/VectorStore.js.map +1 -1
  108. package/dist/storage/schema.d.ts +123 -80
  109. package/dist/storage/schema.d.ts.map +1 -1
  110. package/dist/storage/schema.js +305 -217
  111. package/dist/storage/schema.js.map +1 -1
  112. package/dist/util/FileIO.d.ts +44 -0
  113. package/dist/util/FileIO.d.ts.map +1 -0
  114. package/dist/util/FileIO.js +203 -0
  115. package/dist/util/FileIO.js.map +1 -0
  116. package/dist/util/Loader.d.ts +24 -0
  117. package/dist/util/Loader.d.ts.map +1 -0
  118. package/dist/util/Loader.js +122 -0
  119. package/dist/util/Loader.js.map +1 -0
  120. package/package.json +2 -2
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Full-featured TypeScript implementation of MCard content-addressable storage, supporting both browser and Node.js environments.
4
4
 
5
- [![Tests](https://img.shields.io/badge/tests-117%20passed-brightgreen)](./tests)
5
+ [![Tests](https://img.shields.io/badge/tests-155%20passed-brightgreen)](./tests)
6
6
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org/)
7
7
  [![Node.js](https://img.shields.io/badge/Node.js-18%2B-green)](https://nodejs.org/)
8
8
 
@@ -303,6 +303,33 @@ npx tsx src/ptr/node/cli.ts status
303
303
  npx tsx src/ptr/node/cli.ts list
304
304
  ```
305
305
 
306
+ ## Content Detection
307
+
308
+ The `ContentTypeInterpreter` module provides intelligent content type detection with parity to the Python implementation.
309
+
310
+ ### Features
311
+ - **Binary Signature Detection**: Identifies images (PNG, JPEG, GIF, WEBP), ZIP archives, PDFs, etc.
312
+ - **Programming Language Detection**: Identifies Python, C/C++, JavaScript, TypeScript, etc.
313
+ - **Structured Data Detection**: Validates JSON, YAML, CSV, SQL, XML.
314
+ - **Parity with Python**: Validated against the same test dataset as the core Python library.
315
+
316
+ ### Usage
317
+
318
+ ```typescript
319
+ import { ContentTypeInterpreter } from './src/model/ContentTypeInterpreter';
320
+
321
+ // Detect from string
322
+ const pythonCode = "import os\nprint('Hello')";
323
+ const result = ContentTypeInterpreter.detectContentType(pythonCode);
324
+ console.log(result.mimeType); // 'text/x-python'
325
+ console.log(result.extension); // '.py'
326
+
327
+ // Detect from binary buffer
328
+ const pngBuffer = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
329
+ const binResult = ContentTypeInterpreter.detectContentType(pngBuffer);
330
+ console.log(binResult.mimeType); // 'image/png'
331
+ ```
332
+
306
333
  ## Vector Search (sqlite-vec)
307
334
 
308
335
  The `MCardVectorStore` provides semantic search using the sqlite-vec extension:
@@ -342,8 +369,107 @@ store.close();
342
369
  - **Hybrid search**: Combined vector + FTS5 full-text search
343
370
  - **Ollama integration**: Embedding generation via local LLM
344
371
 
345
- ## Recent Bug Fixes (December 2025)
372
+ ## RAG (Retrieval-Augmented Generation)
373
+
374
+ MCard includes a complete RAG pipeline compatible with the Python implementation, powered by Ollama.
375
+
376
+ ### Components
377
+
378
+ - **PersistentIndexer**: Automates indexing of MCards into the vector store.
379
+ - **GraphExtractor**: Extracts entities and relationships from text using LLMs (e.g., `gemma3`).
380
+ - **VisionEmbeddingProvider**: Generates embeddings for images by first describing them with a vision model (e.g., `moondream`).
381
+ - **CommunityDetection**: Detects communities within the knowledge graph using Label Propagation.
382
+
383
+ ### Example: Graph Extraction
384
+
385
+ ```typescript
386
+ import { GraphExtractor } from './rag/graph/extractor';
387
+
388
+ const extractor = new GraphExtractor({
389
+ model: 'gemma3:latest',
390
+ temperature: 0.0
391
+ });
392
+
393
+ const result = await extractor.extract("MCard uses content-addressable storage.");
394
+ console.log(result.entities);
395
+ // [{ name: "MCard", type: "TECHNOLOGY", ... }]
396
+ ```
397
+
398
+ ### Example: Vision Embedding
399
+
400
+ ```typescript
401
+ import { VisionEmbeddingProvider } from './rag/embeddings/VisionEmbeddingProvider';
402
+
403
+ const provider = new VisionEmbeddingProvider();
404
+ const embedding = await provider.embedImage(base64Image);
405
+ ```
406
+
407
+ ### Graph RAG Engine
408
+
409
+ Combines vector search with knowledge graphs and LLMs for enhanced retrieval:
410
+
411
+ ```typescript
412
+ import { GraphRAGEngine } from 'mcard-js/rag/GraphRAGEngine';
413
+
414
+ const engine = new GraphRAGEngine('./rag.db', null, 'gemma3:latest');
415
+
416
+ // Index with graph extraction
417
+ await engine.index(mcard);
418
+
419
+ // Query (Hybrid Search + Graph Context + LLM Synthesis)
420
+ const response = await engine.query("How does MCard relate to PTR?", 5, true);
421
+ console.log(response.answer);
422
+ console.log(response.graphContext);
423
+ ```
424
+
425
+ ## Bulk Loading
426
+
427
+ Efficiently load directories into CardCollection with safety checks (skips binary/large files):
428
+
429
+ ```typescript
430
+ import { Loader } from 'mcard-js';
431
+
432
+ // Load directory recursively
433
+ await Loader.loadFileToCollection('./docs', collection, {
434
+ recursive: true,
435
+ includeProblematic: false
436
+ });
437
+ ```
438
+
439
+ ## Integration Testing
440
+
441
+ ### Live Integration Tests
442
+
443
+ To run integration tests against a live Ollama instance:
444
+
445
+ 1. Ensure Ollama is running (`ollama serve`).
446
+ 2. Pull required models:
447
+ ```bash
448
+ ollama pull gemma3:latest
449
+ ollama pull nomic-embed-text
450
+ ollama pull moondream
451
+ ```
452
+ 3. Run the integration suite:
453
+ ```bash
454
+ npx vitest tests/rag/Integration.test.ts
455
+ ```
456
+
457
+ ## Version 2.1.0 Release Notes (December 2025)
458
+ > Python Parity Update
459
+
460
+ ### 🚀 New Features
461
+ * **GraphRAGEngine**: Full RAG orchestration in `src/rag/GraphRAGEngine.ts` matching Python's capabilities.
462
+ * **Bulk Loader**: New `Loader` module for robust file ingestion with safety checks.
463
+ * **LLM Monads**: `promptMonad` and `chatMonad` added to `LLMRuntime` for functional composition.
464
+ * **Collection Search**: Enhanced `CardCollection` with search capabilities (content, hash, string).
465
+
466
+ ### 🛠️ Polyglot Runtime Fixes
467
+ * **ESM Compatibility**: Fixed `ReferenceError: require is not defined` in `SqliteNodeEngine`.
468
+ * **Double-Encoding Fix**: Resolved input context double-JSON-encoding.
469
+ * **Loader Context Injection**: Fixed `CLMRunner` context passing.
470
+ * **CLM Example Iteration**: Updated `CLMLoader` for better example handling.
346
471
 
472
+ ### Previous Fixes (2.0.0)
347
473
  ### SQLite Foreign Key Constraint Fix
348
474
 
349
475
  **Problem**: `clearSync()` was deleting tables in wrong order, causing `SQLITE_CONSTRAINT_FOREIGNKEY` errors.
@@ -358,7 +484,7 @@ clearSync(): void {
358
484
  }
359
485
  ```
360
486
 
361
- **Impact**: All 117 tests pass ✅
487
+ **Impact**: All 155 tests pass ✅
362
488
 
363
489
  ### CLMRunner Recursive Runtime Fix
364
490
 
package/dist/index.d.ts CHANGED
@@ -18,4 +18,9 @@ export { State } from './monads/State';
18
18
  export { LensProtocol, JsonRpcRequest, JsonRpcResponse, ErrorCodes } from './ptr/LensProtocol';
19
19
  export { SandboxWorker } from './ptr/SandboxWorker';
20
20
  export * from './ptr/common_types';
21
+ import * as FileIO from './util/FileIO';
22
+ import * as Loader from './util/Loader';
23
+ export { FileIO, Loader };
24
+ export { LLMRuntime, promptMonad, chatMonad } from './ptr/llm/LLMRuntime';
25
+ export { LLMConfig } from './ptr/llm/Config';
21
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,cAAc,oBAAoB,CAAC;AAInC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -23,4 +23,12 @@ export { State } from './monads/State';
23
23
  export { LensProtocol, ErrorCodes } from './ptr/LensProtocol';
24
24
  export { SandboxWorker } from './ptr/SandboxWorker';
25
25
  export * from './ptr/common_types';
26
+ // Utils
27
+ // Note: Exporting as namespace to avoid naming collisions
28
+ import * as FileIO from './util/FileIO';
29
+ import * as Loader from './util/Loader';
30
+ export { FileIO, Loader };
31
+ // LLM
32
+ export { LLMRuntime, promptMonad, chatMonad } from './ptr/llm/LLMRuntime';
33
+ export { LLMConfig } from './ptr/llm/Config';
26
34
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,2CAA2C;AAE3C,aAAa;AACb,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIzE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO;AACP,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAmC,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,2CAA2C;AAE3C,aAAa;AACb,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIzE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO;AACP,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,SAAS;AACT,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAmC,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,cAAc,oBAAoB,CAAC;AAEnC,QAAQ;AACR,0DAA0D;AAC1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE1B,MAAM;AACN,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
@@ -68,5 +68,15 @@ export declare class CardCollection {
68
68
  * Resolve handle and get card in one monadic operation
69
69
  */
70
70
  resolveAndGetM(handle: string): Promise<Maybe<MCard>>;
71
+ clear(): Promise<void>;
72
+ searchByString(query: string, pageNumber?: number, pageSize?: number): Promise<Page<MCard>>;
73
+ searchByContent(query: string, pageNumber?: number, pageSize?: number): Promise<Page<MCard>>;
74
+ searchByHash(hashPrefix: string): Promise<MCard[]>;
75
+ getAllMCardsRaw(): Promise<MCard[]>;
76
+ getAllCards(pageSize?: number, processCallback?: (card: MCard) => any): Promise<{
77
+ cards: MCard[];
78
+ total: number;
79
+ }>;
80
+ printAllCards(): Promise<void>;
71
81
  }
72
82
  //# sourceMappingURL=CardCollection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CardCollection.d.ts","sourceRoot":"","sources":["../../src/model/CardCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAMjC;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IA4CvC,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI9C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC;;OAEG;IACG,OAAO,CAAC,UAAU,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAIlF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAM9B;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIxD;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI3D;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAM9F;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAK/C;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAKzD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAK5D;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;CAK9D"}
1
+ {"version":3,"file":"CardCollection.d.ts","sourceRoot":"","sources":["../../src/model/CardCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAMjC;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IA4CvC,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI9C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC;;OAEG;IACG,OAAO,CAAC,UAAU,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAIlF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAM9B;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIxD;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI3D;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAM9F;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAK/C;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAKzD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAK5D;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAQrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAIlG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAInG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAIlD,eAAe,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAInC,WAAW,CAAC,QAAQ,GAAE,MAAW,EAAE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,GAAG,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBtH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAevC"}
@@ -148,5 +148,58 @@ export class CardCollection {
148
148
  return Maybe.nothing();
149
149
  return this.getM(maybeHash.value);
150
150
  }
151
+ // =========== Search & Bulk Operations ===========
152
+ async clear() {
153
+ return this.engine.clear();
154
+ }
155
+ async searchByString(query, pageNumber = 1, pageSize = 10) {
156
+ return this.engine.search(query, pageNumber, pageSize);
157
+ }
158
+ async searchByContent(query, pageNumber = 1, pageSize = 10) {
159
+ return this.engine.search(query, pageNumber, pageSize);
160
+ }
161
+ async searchByHash(hashPrefix) {
162
+ return this.engine.searchByHash(hashPrefix);
163
+ }
164
+ async getAllMCardsRaw() {
165
+ return this.engine.getAll();
166
+ }
167
+ async getAllCards(pageSize = 10, processCallback) {
168
+ const cards = [];
169
+ let pageNumber = 1;
170
+ let total = 0;
171
+ while (true) {
172
+ const page = await this.getPage(pageNumber, pageSize);
173
+ if (!page.items || page.items.length === 0)
174
+ break;
175
+ for (const card of page.items) {
176
+ if (processCallback) {
177
+ processCallback(card);
178
+ }
179
+ cards.push(card);
180
+ }
181
+ total = page.totalItems;
182
+ if (!page.hasNext)
183
+ break;
184
+ pageNumber++;
185
+ }
186
+ return { cards, total };
187
+ }
188
+ async printAllCards() {
189
+ const cards = await this.getAllMCardsRaw();
190
+ cards.forEach(card => {
191
+ console.log(`Hash: ${card.hash}`);
192
+ // Try to print as text if possible
193
+ try {
194
+ const text = new TextDecoder().decode(card.content);
195
+ const preview = text.slice(0, 100).replace(/\n/g, ' ');
196
+ console.log(`Content: ${preview}${text.length > 100 ? '...' : ''}`);
197
+ }
198
+ catch {
199
+ console.log(`Content (binary): ${card.content.length} bytes`);
200
+ }
201
+ console.log('---');
202
+ });
203
+ }
151
204
  }
152
205
  //# sourceMappingURL=CardCollection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CardCollection.js","sourceRoot":"","sources":["../../src/model/CardCollection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CardCollection.js","sourceRoot":"","sources":["../../src/model/CardCollection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare class ContentTypeInterpreter {
2
+ private static readonly MIME_TO_EXT;
3
+ /**
4
+ * Detect content type and suggest extension.
5
+ *
6
+ * @param content Content string or binary buffer
7
+ * @param fileExtension Optional file extension hint
8
+ * @returns Object containing detected mimeType and suggested extension
9
+ */
10
+ static detectContentType(content: string | Uint8Array, fileExtension?: string): {
11
+ mimeType: string;
12
+ extension: string;
13
+ };
14
+ static getExtension(mimeType: string): string;
15
+ /**
16
+ * Check if content should be treated as binary.
17
+ */
18
+ static isBinaryContent(content: string | Uint8Array, mimeType?: string): boolean;
19
+ static isKnownLongLineExtension(extension?: string): boolean;
20
+ static isUnstructuredBinary(sample: Uint8Array): boolean;
21
+ static hasPathologicalLines(sample: Uint8Array, isKnownType: boolean): boolean;
22
+ }
23
+ //# sourceMappingURL=ContentTypeInterpreter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentTypeInterpreter.d.ts","sourceRoot":"","sources":["../../src/model/ContentTypeInterpreter.ts"],"names":[],"mappings":"AAEA,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CA8BjC;IAEF;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CACpB,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,aAAa,CAAC,EAAE,MAAM,GACvB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAyC1C,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAsBhF,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAM5D,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAexD,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO;CASjF"}
@@ -0,0 +1,132 @@
1
+ import { registry } from './detectors/registry';
2
+ export class ContentTypeInterpreter {
3
+ static MIME_TO_EXT = {
4
+ 'text/plain': '.txt',
5
+ 'application/json': '.json',
6
+ 'text/csv': '.csv',
7
+ 'text/x-python': '.py',
8
+ 'text/javascript': '.js',
9
+ 'text/jsx': '.jsx',
10
+ 'text/typescript': '.ts',
11
+ 'text/x-c': '.c',
12
+ 'text/x-c++': '.cpp',
13
+ 'application/xml': '.xml',
14
+ 'text/html': '.html',
15
+ 'application/x-yaml': '.yaml',
16
+ 'text/markdown': '.md',
17
+ 'text/x-sql': '.sql',
18
+ 'image/png': '.png',
19
+ 'image/jpeg': '.jpg',
20
+ 'image/gif': '.gif',
21
+ 'image/bmp': '.bmp',
22
+ 'image/x-icon': '.ico',
23
+ 'image/webp': '.webp',
24
+ 'image/svg+xml': '.svg',
25
+ 'application/pdf': '.pdf',
26
+ 'application/zip': '.zip',
27
+ 'application/gzip': '.gz',
28
+ 'application/x-rar-compressed': '.rar',
29
+ 'application/x-7z-compressed': '.7z',
30
+ 'application/x-sqlite3': '.db',
31
+ 'audio/wav': '.wav',
32
+ // Add more as needed
33
+ };
34
+ /**
35
+ * Detect content type and suggest extension.
36
+ *
37
+ * @param content Content string or binary buffer
38
+ * @param fileExtension Optional file extension hint
39
+ * @returns Object containing detected mimeType and suggested extension
40
+ */
41
+ static detectContentType(content, fileExtension) {
42
+ // Prepare sample lines for detectors
43
+ let lines = [];
44
+ let firstLine = '';
45
+ // Convert to string for line analysis (even if binary, we try loosely)
46
+ // Note: For large binary, this might be expensive/messy, but detectors handle it.
47
+ // Python implementation converts to string for lines.
48
+ let textSample = '';
49
+ if (typeof content === 'string') {
50
+ textSample = content.slice(0, 8192); // Limit sample size
51
+ }
52
+ else {
53
+ // Decode ignoring errors for text analysis on binary
54
+ textSample = new TextDecoder('utf-8', { fatal: false }).decode(content.slice(0, 8192));
55
+ }
56
+ lines = textSample.split('\n').slice(0, 20);
57
+ firstLine = lines[0] || '';
58
+ const mimeType = registry.detect(content, lines, firstLine, fileExtension);
59
+ let extension = this.getExtension(mimeType);
60
+ // If detected extension matches provided hint, prefer the hint (case insensitive)
61
+ if (fileExtension && extension) {
62
+ if (fileExtension.toLowerCase() === extension || fileExtension.toLowerCase() === `.${extension}`) {
63
+ extension = fileExtension;
64
+ }
65
+ }
66
+ if (!extension && fileExtension) {
67
+ extension = fileExtension;
68
+ }
69
+ if (!extension) {
70
+ extension = '.txt'; // Default
71
+ }
72
+ return { mimeType, extension };
73
+ }
74
+ static getExtension(mimeType) {
75
+ return this.MIME_TO_EXT[mimeType] || '';
76
+ }
77
+ /**
78
+ * Check if content should be treated as binary.
79
+ */
80
+ static isBinaryContent(content, mimeType) {
81
+ if (mimeType) {
82
+ if (mimeType.startsWith('text/') ||
83
+ mimeType.includes('json') ||
84
+ mimeType.includes('xml') ||
85
+ mimeType.includes('javascript') ||
86
+ mimeType.includes('ecmascript')) {
87
+ return false;
88
+ }
89
+ return true;
90
+ }
91
+ // If string, assume text
92
+ if (typeof content === 'string')
93
+ return false;
94
+ // Heuristic check
95
+ const detection = this.detectContentType(content);
96
+ return !detection.mimeType.startsWith('text/') &&
97
+ !detection.mimeType.includes('json') &&
98
+ !detection.mimeType.includes('xml');
99
+ }
100
+ static isKnownLongLineExtension(extension) {
101
+ if (!extension)
102
+ return false;
103
+ const ext = extension.toLowerCase();
104
+ return ['.min.js', '.min.css', '.map', '.svg', '.json', '.geojson'].some(e => ext.endsWith(e));
105
+ }
106
+ static isUnstructuredBinary(sample) {
107
+ // Check for null bytes or high ratio of non-printable characters
108
+ let nonPrintable = 0;
109
+ const len = Math.min(sample.length, 1024);
110
+ for (let i = 0; i < len; i++) {
111
+ const byte = sample[i];
112
+ if (byte === 0)
113
+ return true; // Null byte is strong indicator
114
+ if ((byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) || byte === 127) {
115
+ nonPrintable++;
116
+ }
117
+ }
118
+ // > 30% non-printable
119
+ return (nonPrintable / len) > 0.3;
120
+ }
121
+ static hasPathologicalLines(sample, isKnownType) {
122
+ if (isKnownType || sample.length < 32768)
123
+ return false;
124
+ // Check if there are no newlines in the first 32KB
125
+ for (let i = 0; i < sample.length; i++) {
126
+ if (sample[i] === 10 || sample[i] === 13)
127
+ return false;
128
+ }
129
+ return true;
130
+ }
131
+ }
132
+ //# sourceMappingURL=ContentTypeInterpreter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentTypeInterpreter.js","sourceRoot":"","sources":["../../src/model/ContentTypeInterpreter.ts"],"names":[],"mappings":"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"}
@@ -25,5 +25,20 @@ export declare class GTime {
25
25
  * Get the region code from a GTime string
26
26
  */
27
27
  static getRegionCode(gtime: string): string;
28
+ /**
29
+ * Check if the provided hash function is valid.
30
+ * Matches Python's GTime.is_valid_hash_function()
31
+ */
32
+ static isValidHashFunction(hashFunction: string): boolean;
33
+ /**
34
+ * Check if the provided region code is valid.
35
+ * Matches Python's GTime.is_valid_region_code()
36
+ */
37
+ static isValidRegionCode(regionCode: string): boolean;
38
+ /**
39
+ * Check if the provided timestamp is in ISO format.
40
+ * Matches Python's GTime.is_iso_format()
41
+ */
42
+ static isIsoFormat(timestamp: string): boolean;
28
43
  }
29
44
  //# sourceMappingURL=GTime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GTime.d.ts","sourceRoot":"","sources":["../../src/model/GTime.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAY;IAErD;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,aAAa,GAAE,MAA+B,GAAG,MAAM;IAQvE;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAcnF;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI9C;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIxC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAG9C"}
1
+ {"version":3,"file":"GTime.d.ts","sourceRoot":"","sources":["../../src/model/GTime.ts"],"names":[],"mappings":"AAKA,qBAAa,KAAK;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAY;IAErD;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,aAAa,GAAE,MAA+B,GAAG,MAAM;IAQvE;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAYnF;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI9C;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIxC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI3C;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAOzD;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIrD;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAkBjD"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Valid hash algorithms supported by the system
3
+ */
4
+ const VALID_HASH_ALGORITHMS = ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'];
1
5
  export class GTime {
2
6
  static DEFAULT_ALGORITHM = 'sha256';
3
7
  /**
@@ -17,8 +21,6 @@ export class GTime {
17
21
  static parse(gtime) {
18
22
  const parts = gtime.split('|');
19
23
  if (parts.length !== 3) {
20
- // Fallback for old format (underscore) for backward compatibility if needed?
21
- // Or strict? Python is strict about 3 parts.
22
24
  throw new Error(`Invalid GTime format: ${gtime}`);
23
25
  }
24
26
  return {
@@ -45,5 +47,45 @@ export class GTime {
45
47
  static getRegionCode(gtime) {
46
48
  return this.parse(gtime).region;
47
49
  }
50
+ /**
51
+ * Check if the provided hash function is valid.
52
+ * Matches Python's GTime.is_valid_hash_function()
53
+ */
54
+ static isValidHashFunction(hashFunction) {
55
+ if (!hashFunction || typeof hashFunction !== 'string') {
56
+ return false;
57
+ }
58
+ return VALID_HASH_ALGORITHMS.includes(hashFunction.toLowerCase());
59
+ }
60
+ /**
61
+ * Check if the provided region code is valid.
62
+ * Matches Python's GTime.is_valid_region_code()
63
+ */
64
+ static isValidRegionCode(regionCode) {
65
+ return Boolean(regionCode && regionCode === regionCode.toUpperCase());
66
+ }
67
+ /**
68
+ * Check if the provided timestamp is in ISO format.
69
+ * Matches Python's GTime.is_iso_format()
70
+ */
71
+ static isIsoFormat(timestamp) {
72
+ if (!timestamp || typeof timestamp !== 'string') {
73
+ return false;
74
+ }
75
+ try {
76
+ const date = new Date(timestamp);
77
+ // Check if it's a valid date and the string contains expected ISO patterns
78
+ if (isNaN(date.getTime())) {
79
+ return false;
80
+ }
81
+ // ISO format should have 'T' separator or be a valid date string
82
+ // Accept formats like: 2024-12-04T12:00:00.000Z or 2024-12-04T12:00:00
83
+ const isoPattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
84
+ return isoPattern.test(timestamp);
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
48
90
  }
49
91
  //# sourceMappingURL=GTime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GTime.js","sourceRoot":"","sources":["../../src/model/GTime.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,KAAK;IACN,MAAM,CAAU,iBAAiB,GAAG,QAAQ,CAAC;IAErD;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,gBAAwB,IAAI,CAAC,iBAAiB;QAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QACzC,qCAAqC;QACrC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,0CAA0C;QAChE,OAAO,GAAG,IAAI,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAa;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,6EAA6E;YAC7E,6CAA6C;YAC7C,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;YACH,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACnB,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;SACnB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACpC,CAAC"}
1
+ {"version":3,"file":"GTime.js","sourceRoot":"","sources":["../../src/model/GTime.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAEtF,MAAM,OAAO,KAAK;IACN,MAAM,CAAU,iBAAiB,GAAG,QAAQ,CAAC;IAErD;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,gBAAwB,IAAI,CAAC,iBAAiB;QAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QACzC,qCAAqC;QACrC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,0CAA0C;QAChE,OAAO,GAAG,IAAI,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAa;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;YACH,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACnB,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;SACnB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,YAAoB;QAC3C,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,UAAkB;QACvC,OAAO,OAAO,CAAC,UAAU,IAAI,UAAU,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,SAAiB;QAChC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,2EAA2E;YAC3E,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,iEAAiE;YACjE,uEAAuE;YACvE,MAAM,UAAU,GAAG,sCAAsC,CAAC;YAC1D,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Base interface for all content type detectors.
3
+ */
4
+ export interface BaseDetector {
5
+ /**
6
+ * Friendly name of the content type this detector handles.
7
+ */
8
+ readonly contentTypeName: string;
9
+ /**
10
+ * Detect confidence level for the given content content.
11
+ *
12
+ * @param contentSample First ~2KB of content
13
+ * @param lines First ~20 lines of content
14
+ * @param firstLine The first line of content
15
+ * @param fileExtension Optional file extension hint (e.g., ".json")
16
+ * @returns Confidence score between 0.0 and 1.0
17
+ */
18
+ detect(contentSample: string | Uint8Array, lines: string[], firstLine: string, fileExtension?: string): number;
19
+ /**
20
+ * Get the specific MIME type for the detected content.
21
+ *
22
+ * @returns MIME type string (e.g., "application/json") or null if not detected
23
+ */
24
+ getMimeType(contentSample: string | Uint8Array, lines: string[], firstLine: string, fileExtension?: string): string | null;
25
+ }
26
+ //# sourceMappingURL=BaseDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseDetector.d.ts","sourceRoot":"","sources":["../../../src/model/detectors/BaseDetector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IACzB;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC;;;;;;;;OAQG;IACH,MAAM,CACF,aAAa,EAAE,MAAM,GAAG,UAAU,EAClC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACvB,MAAM,CAAC;IAEV;;;;OAIG;IACH,WAAW,CACP,aAAa,EAAE,MAAM,GAAG,UAAU,EAClC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACvB,MAAM,GAAG,IAAI,CAAC;CACpB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Base interface for all content type detectors.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=BaseDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseDetector.js","sourceRoot":"","sources":["../../../src/model/detectors/BaseDetector.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,12 @@
1
+ import { BaseDetector } from './BaseDetector';
2
+ export declare class BinarySignatureDetector implements BaseDetector {
3
+ readonly contentTypeName = "binary";
4
+ private static readonly SIGNATURES;
5
+ detect(contentSample: string | Uint8Array, lines: string[], firstLine: string, fileExtension?: string): number;
6
+ getMimeType(contentSample: string | Uint8Array, lines: string[], firstLine: string, fileExtension?: string): string | null;
7
+ private toBytes;
8
+ private startsWith;
9
+ private detectRiffFormat;
10
+ private detectZipType;
11
+ }
12
+ //# sourceMappingURL=BinaryDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryDetector.d.ts","sourceRoot":"","sources":["../../../src/model/detectors/BinaryDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,qBAAa,uBAAwB,YAAW,YAAY;IACxD,QAAQ,CAAC,eAAe,YAAY;IAGpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAchC;IAEF,MAAM,CACF,aAAa,EAAE,MAAM,GAAG,UAAU,EAClC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACvB,MAAM;IAKT,WAAW,CACP,aAAa,EAAE,MAAM,GAAG,UAAU,EAClC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACvB,MAAM,GAAG,IAAI;IAsBhB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,aAAa;CAaxB"}