mcard-js 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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -0
  3. package/dist/__mocks__/better-sqlite3.js +20 -0
  4. package/dist/__mocks__/better-sqlite3.js.map +1 -0
  5. package/dist/config/config_constants.js +188 -0
  6. package/dist/config/config_constants.js.map +1 -0
  7. package/dist/config/env_parameters.js +62 -0
  8. package/dist/config/env_parameters.js.map +1 -0
  9. package/dist/content/model/content_type_detector.js +89 -0
  10. package/dist/content/model/content_type_detector.js.map +1 -0
  11. package/dist/core/card-collection.js +279 -0
  12. package/dist/core/card-collection.js.map +1 -0
  13. package/dist/core/event-producer.js +132 -0
  14. package/dist/core/event-producer.js.map +1 -0
  15. package/dist/core/g_time.js +201 -0
  16. package/dist/core/g_time.js.map +1 -0
  17. package/dist/core/hash/enums.js +19 -0
  18. package/dist/core/hash/enums.js.map +1 -0
  19. package/dist/core/hash/validator.js +260 -0
  20. package/dist/core/hash/validator.js.map +1 -0
  21. package/dist/core/mcard.js +205 -0
  22. package/dist/core/mcard.js.map +1 -0
  23. package/dist/engine/sqlite_engine.js +723 -0
  24. package/dist/engine/sqlite_engine.js.map +1 -0
  25. package/dist/index.js +10 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/middleware/mcardPersistenceMiddleware.js +45 -0
  28. package/dist/middleware/mcardPersistenceMiddleware.js.map +1 -0
  29. package/dist/models/database_schemas.js +31 -0
  30. package/dist/models/database_schemas.js.map +1 -0
  31. package/dist/services/logger.js +80 -0
  32. package/dist/services/logger.js.map +1 -0
  33. package/dist/services/mcardStorageService.js +36 -0
  34. package/dist/services/mcardStorageService.js.map +1 -0
  35. package/dist/utils/actionHelpers.js +25 -0
  36. package/dist/utils/actionHelpers.js.map +1 -0
  37. package/dist/utils/bufferContentHelper.js +393 -0
  38. package/dist/utils/bufferContentHelper.js.map +1 -0
  39. package/dist/utils/bufferPolyfill.js +198 -0
  40. package/dist/utils/bufferPolyfill.js.map +1 -0
  41. package/dist/utils/content-detection.js +74 -0
  42. package/dist/utils/content-detection.js.map +1 -0
  43. package/dist/utils/content-utils.js +269 -0
  44. package/dist/utils/content-utils.js.map +1 -0
  45. package/dist/utils/content_type_detector copy.js +480 -0
  46. package/dist/utils/content_type_detector copy.js.map +1 -0
  47. package/dist/utils/content_type_detector.js +480 -0
  48. package/dist/utils/content_type_detector.js.map +1 -0
  49. package/dist/utils/cryptoPolyfill.js +166 -0
  50. package/dist/utils/cryptoPolyfill.js.map +1 -0
  51. package/dist/utils/dotenv-browser.js +35 -0
  52. package/dist/utils/dotenv-browser.js.map +1 -0
  53. package/dist/utils/environmentDetector.js +93 -0
  54. package/dist/utils/environmentDetector.js.map +1 -0
  55. package/dist/utils/logWriter.js +27 -0
  56. package/dist/utils/logWriter.js.map +1 -0
  57. package/dist/utils/serviceWorkerManager.js +118 -0
  58. package/dist/utils/serviceWorkerManager.js.map +1 -0
  59. package/dist/utils/test-content-detection.js +79 -0
  60. package/dist/utils/test-content-detection.js.map +1 -0
  61. package/dist/utils/test-detection-fix.js +121 -0
  62. package/dist/utils/test-detection-fix.js.map +1 -0
  63. package/dist/utils/test-format-conversion.js +170 -0
  64. package/dist/utils/test-format-conversion.js.map +1 -0
  65. package/dist/utils/test-mov-viewer.js +57 -0
  66. package/dist/utils/test-mov-viewer.js.map +1 -0
  67. package/dist/utils/testDetection.js +21 -0
  68. package/dist/utils/testDetection.js.map +1 -0
  69. package/dist/utils/textEncoderPolyfill.js +87 -0
  70. package/dist/utils/textEncoderPolyfill.js.map +1 -0
  71. package/package.json +74 -0
  72. package/src/__mocks__/better-sqlite3.js +14 -0
  73. package/src/config/config_constants.js +227 -0
  74. package/src/config/env_parameters.js +69 -0
  75. package/src/content/model/content_type_detector.js +87 -0
  76. package/src/core/card-collection.js +300 -0
  77. package/src/core/event-producer.js +160 -0
  78. package/src/core/g_time.js +215 -0
  79. package/src/core/hash/enums.js +13 -0
  80. package/src/core/hash/validator.js +271 -0
  81. package/src/core/mcard.js +203 -0
  82. package/src/engine/sqlite_engine.js +755 -0
  83. package/src/index.js +10 -0
  84. package/src/middleware/mcardPersistenceMiddleware.js +45 -0
  85. package/src/models/database_schemas.js +26 -0
  86. package/src/services/logger.js +74 -0
  87. package/src/services/mcardStorageService.js +34 -0
  88. package/src/utils/actionHelpers.js +13 -0
  89. package/src/utils/bufferContentHelper.js +436 -0
  90. package/src/utils/bufferPolyfill.js +202 -0
  91. package/src/utils/cn.ts +6 -0
  92. package/src/utils/content-detection.js +66 -0
  93. package/src/utils/content-utils.js +250 -0
  94. package/src/utils/content_type_detector copy.js +501 -0
  95. package/src/utils/content_type_detector.js +501 -0
  96. package/src/utils/cryptoPolyfill.js +180 -0
  97. package/src/utils/dateUtils.ts +18 -0
  98. package/src/utils/dbInitializer.ts +27 -0
  99. package/src/utils/dotenv-browser.js +29 -0
  100. package/src/utils/environmentDetector.js +92 -0
  101. package/src/utils/logWriter.js +20 -0
  102. package/src/utils/serviceWorkerManager.js +122 -0
  103. package/src/utils/stateWatcher.ts +78 -0
  104. package/src/utils/storeAdapter copy.ts +157 -0
  105. package/src/utils/storeAdapter.ts +157 -0
  106. package/src/utils/test-content-detection.js +71 -0
  107. package/src/utils/test-detection-fix.js +136 -0
  108. package/src/utils/test-format-conversion.js +165 -0
  109. package/src/utils/test-mov-viewer.js +59 -0
  110. package/src/utils/testDetection.js +16 -0
  111. package/src/utils/textEncoderPolyfill.js +88 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ben Koo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # MCard JS
2
+
3
+ A JavaScript implementation of MCard, a data model for persistently storing content with cryptographic hashing and timestamping.
4
+
5
+ ## Overview
6
+
7
+ MCard JS provides a cross-environment implementation that works in both Node.js and browser environments. The library offers functionality for:
8
+
9
+ - Creating and managing content cards with cryptographic hashing
10
+ - Storing structured data with timestamps
11
+ - Searching and retrieving cards by various criteria
12
+ - Synchronizing data with persistence providers
13
+ - Redux middleware for persisting application state
14
+
15
+ ## Key Components
16
+
17
+ ### Core
18
+
19
+ - **MCard**: Core data structure that wraps content with hash, timestamp, and metadata
20
+ - **CardCollection**: Manages multiple MCards, providing search and retrieval capabilities
21
+ - **GTime**: Handles global timestamping with region-aware formatting
22
+
23
+ ### Middleware
24
+
25
+ - **mcardPersistenceMiddleware**: Redux middleware for persisting actions and state snapshots
26
+
27
+ ### Utilities
28
+
29
+ - **SafeBuffer**: Cross-environment Buffer implementation for Node.js and browsers
30
+ - **Content Type Detection**: Automated detection and handling of various content types
31
+ - **Cryptographic Utilities**: Hash generation and validation
32
+
33
+ ## Cross-Environment Compatibility
34
+
35
+ MCard JS is designed to work in both Node.js and browser environments through:
36
+
37
+ - Buffer polyfills for browser compatibility
38
+ - Environment detection for optimal feature usage
39
+ - TextEncoder/TextDecoder polyfills
40
+
41
+ ## Recent Updates
42
+
43
+ ### Redux Middleware Improvements
44
+
45
+ - Enhanced middleware implementation following the Redux pattern (store => next => action)
46
+ - Support for both named and default exports for compatibility
47
+ - Graceful handling when storage service is unavailable
48
+ - Better test coverage (93.75% statements, 100% functions)
49
+
50
+ ### Buffer Compatibility Fixes
51
+
52
+ - Cross-environment support for Buffer/Uint8Array content handling
53
+ - Improved content access and conversion
54
+ - Robust test suite for both Node.js and browser environments
55
+
56
+ ## Getting Started
57
+
58
+ ### Installation
59
+
60
+ ```bash
61
+ npm install @benkoo/mcard
62
+ ```
63
+
64
+ ### Basic Usage
65
+
66
+ ```javascript
67
+ import { MCard, CardCollection } from '@benkoo/mcard';
68
+
69
+ // Create a card with content
70
+ const card = new MCard('Hello, World!');
71
+
72
+ // Create a collection and add the card
73
+ const collection = new CardCollection();
74
+ collection.add(card);
75
+
76
+ // Retrieve by hash
77
+ const retrievedCard = collection.get(card.hash);
78
+
79
+ // Search by content
80
+ const searchResults = collection.search_by_string('Hello');
81
+ ```
82
+
83
+ ### Redux Integration
84
+
85
+ ```javascript
86
+ import { createStore, applyMiddleware } from 'redux';
87
+ import { mcardPersistenceMiddleware } from '@benkoo/mcard';
88
+ import McardStorageService from './mcardStorageService';
89
+ import rootReducer from './reducers';
90
+
91
+ const store = createStore(
92
+ rootReducer,
93
+ applyMiddleware(
94
+ mcardPersistenceMiddleware(McardStorageService)
95
+ )
96
+ );
97
+ ```
98
+
99
+ ## Development
100
+
101
+ ### Testing
102
+
103
+ Run the test suite with:
104
+
105
+ ```bash
106
+ npm test
107
+ ```
108
+
109
+ ### Building
110
+
111
+ ```bash
112
+ npm run build
113
+ ```
114
+
115
+ ## License
116
+
117
+ MIT
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ // Mock for better-sqlite3
8
+ const mockSqlite = jest.fn(() => ({
9
+ prepare: jest.fn().mockReturnValue({
10
+ run: jest.fn(),
11
+ get: jest.fn(),
12
+ all: jest.fn(() => []),
13
+ finalize: jest.fn()
14
+ }),
15
+ exec: jest.fn(),
16
+ close: jest.fn(),
17
+ transaction: fn => fn
18
+ }));
19
+ var _default = exports.default = mockSqlite;
20
+ //# sourceMappingURL=better-sqlite3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-sqlite3.js","names":["mockSqlite","jest","fn","prepare","mockReturnValue","run","get","all","finalize","exec","close","transaction","_default","exports","default"],"sources":["../../src/__mocks__/better-sqlite3.js"],"sourcesContent":["// Mock for better-sqlite3\nconst mockSqlite = jest.fn(() => ({\n prepare: jest.fn().mockReturnValue({\n run: jest.fn(),\n get: jest.fn(),\n all: jest.fn(() => []),\n finalize: jest.fn()\n }),\n exec: jest.fn(),\n close: jest.fn(),\n transaction: fn => fn\n}));\n\nexport default mockSqlite;\n"],"mappings":";;;;;;AAAA;AACA,MAAMA,UAAU,GAAGC,IAAI,CAACC,EAAE,CAAC,OAAO;EAChCC,OAAO,EAAEF,IAAI,CAACC,EAAE,CAAC,CAAC,CAACE,eAAe,CAAC;IACjCC,GAAG,EAAEJ,IAAI,CAACC,EAAE,CAAC,CAAC;IACdI,GAAG,EAAEL,IAAI,CAACC,EAAE,CAAC,CAAC;IACdK,GAAG,EAAEN,IAAI,CAACC,EAAE,CAAC,MAAM,EAAE,CAAC;IACtBM,QAAQ,EAAEP,IAAI,CAACC,EAAE,CAAC;EACpB,CAAC,CAAC;EACFO,IAAI,EAAER,IAAI,CAACC,EAAE,CAAC,CAAC;EACfQ,KAAK,EAAET,IAAI,CAACC,EAAE,CAAC,CAAC;EAChBS,WAAW,EAAET,EAAE,IAAIA;AACrB,CAAC,CAAC,CAAC;AAAC,IAAAU,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEWd,UAAU","ignoreList":[]}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.projectRoot = exports.default = exports.configConstants = exports.VALID_HASH_FUNCTIONS = exports.TEST_DB_PATH = exports.LOG_LEVEL = exports.HashAlgorithmMetadata = exports.HashAlgorithm = exports.HASH_ALGORITHM_HIERARCHY = exports.DEFAULT_PAGE_SIZE = exports.DEFAULT_LOG_LEVEL = exports.DEFAULT_HASH_LENGTH = exports.DEFAULT_HASH_ALGORITHM = exports.CARDS_DB_PATH = void 0;
7
+ // Check if we're in a browser environment
8
+ const isBrowser = typeof window !== 'undefined';
9
+
10
+ // Default empty values that will be replaced in Node.js environment
11
+ let projectRoot = exports.projectRoot = '';
12
+ let dotenv = null;
13
+ let path = null;
14
+
15
+ // Only import Node.js modules when in Node.js environment
16
+ // Use try/catch to make this safe in any environment
17
+ if (!isBrowser) {
18
+ try {
19
+ // Use dynamic import with eval to prevent browser parsing errors
20
+ // This code won't execute in the browser because of the isBrowser check
21
+ if (typeof process !== 'undefined') {
22
+ exports.projectRoot = projectRoot = process.cwd();
23
+
24
+ // Only attempt to load Node.js modules in a Node.js environment
25
+ try {
26
+ // Use a function wrapper to avoid direct require syntax that browsers will parse
27
+ const dynamicRequire = new Function('module', 'return require(module)');
28
+ dotenv = dynamicRequire('dotenv');
29
+ path = dynamicRequire('path');
30
+
31
+ // Configure dotenv if available
32
+ if (dotenv && dotenv.config) {
33
+ dotenv.config();
34
+ }
35
+ } catch (e) {
36
+ console.warn('Node.js modules not available:', e.message);
37
+ }
38
+ }
39
+ } catch (e) {
40
+ console.warn('Unable to determine environment:', e.message);
41
+ }
42
+ }
43
+
44
+ // Safe path join function that works in any environment
45
+ const safePath = (base, ...parts) => {
46
+ if (path && path.join) {
47
+ return path.join(base, ...parts);
48
+ } else {
49
+ return [base, ...parts].filter(Boolean).join('/');
50
+ }
51
+ };
52
+
53
+ // Database Configuration
54
+ const DEFAULT_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = isBrowser ? 10 : process.env?.DEFAULT_PAGE_SIZE || 10;
55
+ const CARDS_DB_PATH = exports.CARDS_DB_PATH = isBrowser ? '/data/cards.db' : process.env?.MCARD_DB_PATH || safePath(projectRoot, 'public', 'data', 'cards.db');
56
+ const TEST_DB_PATH = exports.TEST_DB_PATH = isBrowser ? '/test/db/test.db' : process.env?.TEST_DB_PATH || safePath(projectRoot, 'src', 'test', 'db', 'test.db');
57
+
58
+ // Default Configuration Values
59
+ const DEFAULT_HASH_ALGORITHM = exports.DEFAULT_HASH_ALGORITHM = isBrowser ? 'sha256' : process.env?.MCARD_HASH_ALGORITHM || 'sha256';
60
+ const DEFAULT_HASH_LENGTH = exports.DEFAULT_HASH_LENGTH = isBrowser ? 64 : process.env?.DEFAULT_HASH_LENGTH || 64;
61
+
62
+ // Logging Configuration
63
+ const DEFAULT_LOG_LEVEL = exports.DEFAULT_LOG_LEVEL = 'info';
64
+ const LOG_LEVEL = exports.LOG_LEVEL = isBrowser ? DEFAULT_LOG_LEVEL : process.env?.LOG_LEVEL || DEFAULT_LOG_LEVEL;
65
+
66
+ // Hash Algorithm Configuration
67
+ const HashAlgorithm = input => {
68
+ // Return default value for null or undefined
69
+ if (input === null || input === undefined) {
70
+ return HashAlgorithm.DEFAULT;
71
+ }
72
+
73
+ // Normalize input to lowercase and trim
74
+ const normalizedInput = input.toString().toLowerCase().trim();
75
+
76
+ // Check if the input matches any of the predefined hash algorithms
77
+ return VALID_HASH_FUNCTIONS.includes(normalizedInput) ? normalizedInput : HashAlgorithm.DEFAULT;
78
+ };
79
+
80
+ // Add the existing constants as properties
81
+ exports.HashAlgorithm = HashAlgorithm;
82
+ HashAlgorithm.MD5 = 'md5';
83
+ HashAlgorithm.SHA1 = 'sha1';
84
+ HashAlgorithm.SHA224 = 'sha224';
85
+ HashAlgorithm.SHA256 = 'sha256';
86
+ HashAlgorithm.SHA384 = 'sha384';
87
+ HashAlgorithm.SHA512 = 'sha512';
88
+ HashAlgorithm.CUSTOM = 'custom';
89
+ HashAlgorithm.DEFAULT = 'sha256';
90
+
91
+ // Hash Algorithm Hierarchy
92
+ const HASH_ALGORITHM_HIERARCHY = exports.HASH_ALGORITHM_HIERARCHY = {
93
+ [HashAlgorithm.MD5]: HashAlgorithm.SHA1,
94
+ [HashAlgorithm.SHA1]: HashAlgorithm.SHA224,
95
+ [HashAlgorithm.SHA224]: HashAlgorithm.SHA256,
96
+ [HashAlgorithm.SHA256]: HashAlgorithm.SHA384,
97
+ [HashAlgorithm.SHA384]: HashAlgorithm.SHA512
98
+ };
99
+
100
+ // Hash Algorithm Metadata
101
+ const HashAlgorithmMetadata = exports.HashAlgorithmMetadata = {
102
+ [HashAlgorithm.MD5]: {
103
+ name: HashAlgorithm.MD5,
104
+ description: 'MD5 hash function',
105
+ outputLength: 32,
106
+ isDefault: false
107
+ },
108
+ [HashAlgorithm.SHA1]: {
109
+ name: HashAlgorithm.SHA1,
110
+ description: 'SHA-1 hash function',
111
+ outputLength: 40,
112
+ isDefault: false
113
+ },
114
+ [HashAlgorithm.SHA224]: {
115
+ name: HashAlgorithm.SHA224,
116
+ description: 'SHA-224 hash function',
117
+ outputLength: 56,
118
+ isDefault: false
119
+ },
120
+ [HashAlgorithm.SHA256]: {
121
+ name: HashAlgorithm.SHA256,
122
+ description: 'SHA-256 hash function',
123
+ outputLength: 64,
124
+ isDefault: true
125
+ },
126
+ [HashAlgorithm.SHA384]: {
127
+ name: HashAlgorithm.SHA384,
128
+ description: 'SHA-384 hash function',
129
+ outputLength: 96,
130
+ isDefault: false
131
+ },
132
+ [HashAlgorithm.SHA512]: {
133
+ name: HashAlgorithm.SHA512,
134
+ description: 'SHA-512 hash function',
135
+ outputLength: 128,
136
+ isDefault: false
137
+ }
138
+ };
139
+ const VALID_HASH_FUNCTIONS = exports.VALID_HASH_FUNCTIONS = [HashAlgorithm.MD5, HashAlgorithm.SHA1, HashAlgorithm.SHA224, HashAlgorithm.SHA256, HashAlgorithm.SHA384, HashAlgorithm.SHA512, HashAlgorithm.CUSTOM];
140
+
141
+ // Export Strategy Notes:
142
+ // 1. Default Export: Allows importing the entire configuration object
143
+ // Example: import configConstants from './config_constants.js'
144
+ // Usage: configConstants.LOG_LEVEL
145
+ //
146
+ // 2. Named Exports: Allows importing specific constants directly
147
+ // Example: import { LOG_LEVEL, HashAlgorithm } from './config_constants.js'
148
+ // Usage: Directly use LOG_LEVEL or HashAlgorithm
149
+ //
150
+ // This approach provides maximum flexibility for importing and using constants
151
+ var _default = exports.default = {
152
+ // Database Constants
153
+ DEFAULT_PAGE_SIZE,
154
+ CARDS_DB_PATH,
155
+ // Store Constants
156
+ DEFAULT_HASH_ALGORITHM,
157
+ DEFAULT_HASH_LENGTH,
158
+ // Logging Constants
159
+ DEFAULT_LOG_LEVEL,
160
+ LOG_LEVEL,
161
+ // Hash-related Exports
162
+ HashAlgorithm,
163
+ HASH_ALGORITHM_HIERARCHY,
164
+ HashAlgorithmMetadata,
165
+ VALID_HASH_FUNCTIONS,
166
+ // Project Root
167
+ projectRoot
168
+ };
169
+ const configConstants = exports.configConstants = {
170
+ // Database Constants
171
+ DEFAULT_PAGE_SIZE,
172
+ CARDS_DB_PATH,
173
+ TEST_DB_PATH,
174
+ // Store Constants
175
+ DEFAULT_HASH_ALGORITHM,
176
+ DEFAULT_HASH_LENGTH,
177
+ // Logging Constants
178
+ DEFAULT_LOG_LEVEL,
179
+ LOG_LEVEL,
180
+ // Hash-related Exports
181
+ HashAlgorithm,
182
+ HASH_ALGORITHM_HIERARCHY,
183
+ HashAlgorithmMetadata,
184
+ VALID_HASH_FUNCTIONS,
185
+ // Project Root
186
+ projectRoot
187
+ };
188
+ //# sourceMappingURL=config_constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_constants.js","names":["isBrowser","window","projectRoot","exports","dotenv","path","process","cwd","dynamicRequire","Function","config","e","console","warn","message","safePath","base","parts","join","filter","Boolean","DEFAULT_PAGE_SIZE","env","CARDS_DB_PATH","MCARD_DB_PATH","TEST_DB_PATH","DEFAULT_HASH_ALGORITHM","MCARD_HASH_ALGORITHM","DEFAULT_HASH_LENGTH","DEFAULT_LOG_LEVEL","LOG_LEVEL","HashAlgorithm","input","undefined","DEFAULT","normalizedInput","toString","toLowerCase","trim","VALID_HASH_FUNCTIONS","includes","MD5","SHA1","SHA224","SHA256","SHA384","SHA512","CUSTOM","HASH_ALGORITHM_HIERARCHY","HashAlgorithmMetadata","name","description","outputLength","isDefault","_default","default","configConstants"],"sources":["../../src/config/config_constants.js"],"sourcesContent":["// Check if we're in a browser environment\nconst isBrowser = typeof window !== 'undefined';\n\n// Default empty values that will be replaced in Node.js environment\nlet projectRoot = '';\nlet dotenv = null;\nlet path = null;\n\n// Only import Node.js modules when in Node.js environment\n// Use try/catch to make this safe in any environment\nif (!isBrowser) {\n try {\n // Use dynamic import with eval to prevent browser parsing errors\n // This code won't execute in the browser because of the isBrowser check\n if (typeof process !== 'undefined') {\n projectRoot = process.cwd();\n \n // Only attempt to load Node.js modules in a Node.js environment\n try {\n // Use a function wrapper to avoid direct require syntax that browsers will parse\n const dynamicRequire = new Function('module', 'return require(module)');\n dotenv = dynamicRequire('dotenv');\n path = dynamicRequire('path');\n \n // Configure dotenv if available\n if (dotenv && dotenv.config) {\n dotenv.config();\n }\n } catch (e) {\n console.warn('Node.js modules not available:', e.message);\n }\n }\n } catch (e) {\n console.warn('Unable to determine environment:', e.message);\n }\n}\n\n// Safe path join function that works in any environment\nconst safePath = (base, ...parts) => {\n if (path && path.join) {\n return path.join(base, ...parts);\n } else {\n return [base, ...parts].filter(Boolean).join('/');\n }\n};\n\n// Database Configuration\nconst DEFAULT_PAGE_SIZE = isBrowser ? 10 : (process.env?.DEFAULT_PAGE_SIZE || 10);\nconst CARDS_DB_PATH = isBrowser \n ? '/data/cards.db' \n : (process.env?.MCARD_DB_PATH || safePath(projectRoot, 'public', 'data', 'cards.db'));\nconst TEST_DB_PATH = isBrowser\n ? '/test/db/test.db'\n : (process.env?.TEST_DB_PATH || safePath(projectRoot, 'src', 'test', 'db', 'test.db'));\n\n// Default Configuration Values\nconst DEFAULT_HASH_ALGORITHM = isBrowser ? 'sha256' : (process.env?.MCARD_HASH_ALGORITHM || 'sha256');\nconst DEFAULT_HASH_LENGTH = isBrowser ? 64 : (process.env?.DEFAULT_HASH_LENGTH || 64);\n\n// Logging Configuration\nconst DEFAULT_LOG_LEVEL = 'info';\nconst LOG_LEVEL = isBrowser ? DEFAULT_LOG_LEVEL : (process.env?.LOG_LEVEL || DEFAULT_LOG_LEVEL);\n\n// Hash Algorithm Configuration\nconst HashAlgorithm = (input) => {\n // Return default value for null or undefined\n if (input === null || input === undefined) {\n return HashAlgorithm.DEFAULT;\n }\n\n // Normalize input to lowercase and trim\n const normalizedInput = input.toString().toLowerCase().trim();\n\n // Check if the input matches any of the predefined hash algorithms\n return VALID_HASH_FUNCTIONS.includes(normalizedInput) ? normalizedInput : HashAlgorithm.DEFAULT;\n};\n\n// Add the existing constants as properties\nHashAlgorithm.MD5 = 'md5';\nHashAlgorithm.SHA1 = 'sha1';\nHashAlgorithm.SHA224 = 'sha224';\nHashAlgorithm.SHA256 = 'sha256';\nHashAlgorithm.SHA384 = 'sha384';\nHashAlgorithm.SHA512 = 'sha512';\nHashAlgorithm.CUSTOM = 'custom';\nHashAlgorithm.DEFAULT = 'sha256';\n\n// Hash Algorithm Hierarchy\nconst HASH_ALGORITHM_HIERARCHY = {\n [HashAlgorithm.MD5]: HashAlgorithm.SHA1,\n [HashAlgorithm.SHA1]: HashAlgorithm.SHA224,\n [HashAlgorithm.SHA224]: HashAlgorithm.SHA256,\n [HashAlgorithm.SHA256]: HashAlgorithm.SHA384,\n [HashAlgorithm.SHA384]: HashAlgorithm.SHA512\n};\n\n// Hash Algorithm Metadata\nconst HashAlgorithmMetadata = {\n [HashAlgorithm.MD5]: {\n name: HashAlgorithm.MD5,\n description: 'MD5 hash function',\n outputLength: 32,\n isDefault: false\n },\n [HashAlgorithm.SHA1]: {\n name: HashAlgorithm.SHA1,\n description: 'SHA-1 hash function',\n outputLength: 40,\n isDefault: false\n },\n [HashAlgorithm.SHA224]: {\n name: HashAlgorithm.SHA224,\n description: 'SHA-224 hash function',\n outputLength: 56,\n isDefault: false\n },\n [HashAlgorithm.SHA256]: {\n name: HashAlgorithm.SHA256,\n description: 'SHA-256 hash function',\n outputLength: 64,\n isDefault: true\n },\n [HashAlgorithm.SHA384]: {\n name: HashAlgorithm.SHA384,\n description: 'SHA-384 hash function',\n outputLength: 96,\n isDefault: false\n },\n [HashAlgorithm.SHA512]: {\n name: HashAlgorithm.SHA512,\n description: 'SHA-512 hash function',\n outputLength: 128,\n isDefault: false\n }\n};\n\nconst VALID_HASH_FUNCTIONS = [\n HashAlgorithm.MD5,\n HashAlgorithm.SHA1,\n HashAlgorithm.SHA224,\n HashAlgorithm.SHA256,\n HashAlgorithm.SHA384,\n HashAlgorithm.SHA512,\n HashAlgorithm.CUSTOM\n];\n\n// Export Strategy Notes:\n// 1. Default Export: Allows importing the entire configuration object\n// Example: import configConstants from './config_constants.js'\n// Usage: configConstants.LOG_LEVEL\n//\n// 2. Named Exports: Allows importing specific constants directly\n// Example: import { LOG_LEVEL, HashAlgorithm } from './config_constants.js'\n// Usage: Directly use LOG_LEVEL or HashAlgorithm\n//\n// This approach provides maximum flexibility for importing and using constants\n\nexport default {\n // Database Constants\n DEFAULT_PAGE_SIZE,\n CARDS_DB_PATH,\n\n // Store Constants\n DEFAULT_HASH_ALGORITHM,\n DEFAULT_HASH_LENGTH,\n\n // Logging Constants\n DEFAULT_LOG_LEVEL,\n LOG_LEVEL,\n\n // Hash-related Exports\n HashAlgorithm,\n HASH_ALGORITHM_HIERARCHY,\n HashAlgorithmMetadata,\n VALID_HASH_FUNCTIONS,\n \n // Project Root\n projectRoot\n};\n\nexport const configConstants = {\n // Database Constants\n DEFAULT_PAGE_SIZE,\n CARDS_DB_PATH,\n TEST_DB_PATH,\n\n // Store Constants\n DEFAULT_HASH_ALGORITHM,\n DEFAULT_HASH_LENGTH,\n\n // Logging Constants\n DEFAULT_LOG_LEVEL,\n LOG_LEVEL,\n\n // Hash-related Exports\n HashAlgorithm,\n HASH_ALGORITHM_HIERARCHY,\n HashAlgorithmMetadata,\n VALID_HASH_FUNCTIONS,\n \n // Project Root\n projectRoot\n};\n\nexport {\n // Database Constants\n DEFAULT_PAGE_SIZE,\n CARDS_DB_PATH,\n TEST_DB_PATH,\n\n // Store Constants\n DEFAULT_HASH_ALGORITHM,\n DEFAULT_HASH_LENGTH,\n\n // Logging Constants\n DEFAULT_LOG_LEVEL,\n LOG_LEVEL,\n\n // Hash-related Exports\n HashAlgorithm,\n HASH_ALGORITHM_HIERARCHY,\n HashAlgorithmMetadata,\n VALID_HASH_FUNCTIONS,\n \n // Project Root\n projectRoot\n};\n"],"mappings":";;;;;;AAAA;AACA,MAAMA,SAAS,GAAG,OAAOC,MAAM,KAAK,WAAW;;AAE/C;AACA,IAAIC,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,EAAE;AACpB,IAAIE,MAAM,GAAG,IAAI;AACjB,IAAIC,IAAI,GAAG,IAAI;;AAEf;AACA;AACA,IAAI,CAACL,SAAS,EAAE;EACd,IAAI;IACF;IACA;IACA,IAAI,OAAOM,OAAO,KAAK,WAAW,EAAE;MAClCH,OAAA,CAAAD,WAAA,GAAAA,WAAW,GAAGI,OAAO,CAACC,GAAG,CAAC,CAAC;;MAE3B;MACA,IAAI;QACF;QACA,MAAMC,cAAc,GAAG,IAAIC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;QACvEL,MAAM,GAAGI,cAAc,CAAC,QAAQ,CAAC;QACjCH,IAAI,GAAGG,cAAc,CAAC,MAAM,CAAC;;QAE7B;QACA,IAAIJ,MAAM,IAAIA,MAAM,CAACM,MAAM,EAAE;UAC3BN,MAAM,CAACM,MAAM,CAAC,CAAC;QACjB;MACF,CAAC,CAAC,OAAOC,CAAC,EAAE;QACVC,OAAO,CAACC,IAAI,CAAC,gCAAgC,EAAEF,CAAC,CAACG,OAAO,CAAC;MAC3D;IACF;EACF,CAAC,CAAC,OAAOH,CAAC,EAAE;IACVC,OAAO,CAACC,IAAI,CAAC,kCAAkC,EAAEF,CAAC,CAACG,OAAO,CAAC;EAC7D;AACF;;AAEA;AACA,MAAMC,QAAQ,GAAGA,CAACC,IAAI,EAAE,GAAGC,KAAK,KAAK;EACnC,IAAIZ,IAAI,IAAIA,IAAI,CAACa,IAAI,EAAE;IACrB,OAAOb,IAAI,CAACa,IAAI,CAACF,IAAI,EAAE,GAAGC,KAAK,CAAC;EAClC,CAAC,MAAM;IACL,OAAO,CAACD,IAAI,EAAE,GAAGC,KAAK,CAAC,CAACE,MAAM,CAACC,OAAO,CAAC,CAACF,IAAI,CAAC,GAAG,CAAC;EACnD;AACF,CAAC;;AAED;AACA,MAAMG,iBAAiB,GAAAlB,OAAA,CAAAkB,iBAAA,GAAGrB,SAAS,GAAG,EAAE,GAAIM,OAAO,CAACgB,GAAG,EAAED,iBAAiB,IAAI,EAAG;AACjF,MAAME,aAAa,GAAApB,OAAA,CAAAoB,aAAA,GAAGvB,SAAS,GAC3B,gBAAgB,GACfM,OAAO,CAACgB,GAAG,EAAEE,aAAa,IAAIT,QAAQ,CAACb,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAE;AACvF,MAAMuB,YAAY,GAAAtB,OAAA,CAAAsB,YAAA,GAAGzB,SAAS,GAC1B,kBAAkB,GACjBM,OAAO,CAACgB,GAAG,EAAEG,YAAY,IAAIV,QAAQ,CAACb,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAE;;AAExF;AACA,MAAMwB,sBAAsB,GAAAvB,OAAA,CAAAuB,sBAAA,GAAG1B,SAAS,GAAG,QAAQ,GAAIM,OAAO,CAACgB,GAAG,EAAEK,oBAAoB,IAAI,QAAS;AACrG,MAAMC,mBAAmB,GAAAzB,OAAA,CAAAyB,mBAAA,GAAG5B,SAAS,GAAG,EAAE,GAAIM,OAAO,CAACgB,GAAG,EAAEM,mBAAmB,IAAI,EAAG;;AAErF;AACA,MAAMC,iBAAiB,GAAA1B,OAAA,CAAA0B,iBAAA,GAAG,MAAM;AAChC,MAAMC,SAAS,GAAA3B,OAAA,CAAA2B,SAAA,GAAG9B,SAAS,GAAG6B,iBAAiB,GAAIvB,OAAO,CAACgB,GAAG,EAAEQ,SAAS,IAAID,iBAAkB;;AAE/F;AACA,MAAME,aAAa,GAAIC,KAAK,IAAK;EAC/B;EACA,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,EAAE;IACzC,OAAOF,aAAa,CAACG,OAAO;EAC9B;;EAEA;EACA,MAAMC,eAAe,GAAGH,KAAK,CAACI,QAAQ,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC;;EAE7D;EACA,OAAOC,oBAAoB,CAACC,QAAQ,CAACL,eAAe,CAAC,GAAGA,eAAe,GAAGJ,aAAa,CAACG,OAAO;AACjG,CAAC;;AAED;AAAA/B,OAAA,CAAA4B,aAAA,GAAAA,aAAA;AACAA,aAAa,CAACU,GAAG,GAAG,KAAK;AACzBV,aAAa,CAACW,IAAI,GAAG,MAAM;AAC3BX,aAAa,CAACY,MAAM,GAAG,QAAQ;AAC/BZ,aAAa,CAACa,MAAM,GAAG,QAAQ;AAC/Bb,aAAa,CAACc,MAAM,GAAG,QAAQ;AAC/Bd,aAAa,CAACe,MAAM,GAAG,QAAQ;AAC/Bf,aAAa,CAACgB,MAAM,GAAG,QAAQ;AAC/BhB,aAAa,CAACG,OAAO,GAAG,QAAQ;;AAEhC;AACA,MAAMc,wBAAwB,GAAA7C,OAAA,CAAA6C,wBAAA,GAAG;EAC/B,CAACjB,aAAa,CAACU,GAAG,GAAGV,aAAa,CAACW,IAAI;EACvC,CAACX,aAAa,CAACW,IAAI,GAAGX,aAAa,CAACY,MAAM;EAC1C,CAACZ,aAAa,CAACY,MAAM,GAAGZ,aAAa,CAACa,MAAM;EAC5C,CAACb,aAAa,CAACa,MAAM,GAAGb,aAAa,CAACc,MAAM;EAC5C,CAACd,aAAa,CAACc,MAAM,GAAGd,aAAa,CAACe;AACxC,CAAC;;AAED;AACA,MAAMG,qBAAqB,GAAA9C,OAAA,CAAA8C,qBAAA,GAAG;EAC5B,CAAClB,aAAa,CAACU,GAAG,GAAG;IACnBS,IAAI,EAAEnB,aAAa,CAACU,GAAG;IACvBU,WAAW,EAAE,mBAAmB;IAChCC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE;EACb,CAAC;EACD,CAACtB,aAAa,CAACW,IAAI,GAAG;IACpBQ,IAAI,EAAEnB,aAAa,CAACW,IAAI;IACxBS,WAAW,EAAE,qBAAqB;IAClCC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE;EACb,CAAC;EACD,CAACtB,aAAa,CAACY,MAAM,GAAG;IACtBO,IAAI,EAAEnB,aAAa,CAACY,MAAM;IAC1BQ,WAAW,EAAE,uBAAuB;IACpCC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE;EACb,CAAC;EACD,CAACtB,aAAa,CAACa,MAAM,GAAG;IACtBM,IAAI,EAAEnB,aAAa,CAACa,MAAM;IAC1BO,WAAW,EAAE,uBAAuB;IACpCC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE;EACb,CAAC;EACD,CAACtB,aAAa,CAACc,MAAM,GAAG;IACtBK,IAAI,EAAEnB,aAAa,CAACc,MAAM;IAC1BM,WAAW,EAAE,uBAAuB;IACpCC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE;EACb,CAAC;EACD,CAACtB,aAAa,CAACe,MAAM,GAAG;IACtBI,IAAI,EAAEnB,aAAa,CAACe,MAAM;IAC1BK,WAAW,EAAE,uBAAuB;IACpCC,YAAY,EAAE,GAAG;IACjBC,SAAS,EAAE;EACb;AACF,CAAC;AAED,MAAMd,oBAAoB,GAAApC,OAAA,CAAAoC,oBAAA,GAAG,CAC3BR,aAAa,CAACU,GAAG,EACjBV,aAAa,CAACW,IAAI,EAClBX,aAAa,CAACY,MAAM,EACpBZ,aAAa,CAACa,MAAM,EACpBb,aAAa,CAACc,MAAM,EACpBd,aAAa,CAACe,MAAM,EACpBf,aAAa,CAACgB,MAAM,CACrB;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,IAAAO,QAAA,GAAAnD,OAAA,CAAAoD,OAAA,GAEe;EACb;EACAlC,iBAAiB;EACjBE,aAAa;EAEb;EACAG,sBAAsB;EACtBE,mBAAmB;EAEnB;EACAC,iBAAiB;EACjBC,SAAS;EAET;EACAC,aAAa;EACbiB,wBAAwB;EACxBC,qBAAqB;EACrBV,oBAAoB;EAEpB;EACArC;AACF,CAAC;AAEM,MAAMsD,eAAe,GAAArD,OAAA,CAAAqD,eAAA,GAAG;EAC7B;EACAnC,iBAAiB;EACjBE,aAAa;EACbE,YAAY;EAEZ;EACAC,sBAAsB;EACtBE,mBAAmB;EAEnB;EACAC,iBAAiB;EACjBC,SAAS;EAET;EACAC,aAAa;EACbiB,wBAAwB;EACxBC,qBAAqB;EACrBV,oBAAoB;EAEpB;EACArC;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = exports.EnvParameters = void 0;
8
+ var _dotenv = _interopRequireDefault(require("dotenv"));
9
+ var _path = _interopRequireDefault(require("path"));
10
+ var _config_constants = require("./config_constants.js");
11
+ class EnvParameters {
12
+ static #instance = null;
13
+ constructor() {
14
+ // Load environment variables
15
+ _dotenv.default.config();
16
+
17
+ // Set values from environment or use defaults from config_constants
18
+ this.MCARD_DB_PATH = process.env.MCARD_DB_PATH;
19
+ this.MCARD_HASH_ALGORITHM = process.env.MCARD_HASH_ALGORITHM;
20
+ this.MCARD_HASH_CUSTOM_MODULE = process.env.MCARD_HASH_CUSTOM_MODULE;
21
+ this.MCARD_HASH_CUSTOM_FUNCTION = process.env.MCARD_HASH_CUSTOM_FUNCTION;
22
+ this.MCARD_HASH_LENGTH = parseInt(process.env.MCARD_HASH_LENGTH || _config_constants.DEFAULT_HASH_LENGTH, 10);
23
+ this.MCARD_LOG_LEVEL = process.env.MCARD_LOG_LEVEL || _config_constants.DEFAULT_LOG_LEVEL;
24
+ }
25
+ static getInstance() {
26
+ if (!EnvParameters.#instance) {
27
+ EnvParameters.#instance = new EnvParameters();
28
+ }
29
+ return EnvParameters.#instance;
30
+ }
31
+ static reset() {
32
+ EnvParameters.#instance = null;
33
+ }
34
+ getLogLevel() {
35
+ return this.MCARD_LOG_LEVEL;
36
+ }
37
+ get_log_level() {
38
+ return this.getLogLevel();
39
+ }
40
+
41
+ // Getter methods matching Python implementation
42
+ get_db_path() {
43
+ return this.MCARD_DB_PATH;
44
+ }
45
+ get_hash_algorithm() {
46
+ return this.MCARD_HASH_ALGORITHM;
47
+ }
48
+ get_hash_custom_module() {
49
+ return this.MCARD_HASH_CUSTOM_MODULE;
50
+ }
51
+ get_hash_custom_function() {
52
+ return this.MCARD_HASH_CUSTOM_FUNCTION;
53
+ }
54
+ get_hash_custom_length() {
55
+ return this.MCARD_HASH_LENGTH;
56
+ }
57
+ get_default_db_path() {
58
+ return _path.default.resolve(process.cwd(), this.MCARD_DB_PATH);
59
+ }
60
+ }
61
+ exports.EnvParameters = exports.default = EnvParameters;
62
+ //# sourceMappingURL=env_parameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env_parameters.js","names":["_dotenv","_interopRequireDefault","require","_path","_config_constants","EnvParameters","instance","constructor","dotenv","config","MCARD_DB_PATH","process","env","MCARD_HASH_ALGORITHM","MCARD_HASH_CUSTOM_MODULE","MCARD_HASH_CUSTOM_FUNCTION","MCARD_HASH_LENGTH","parseInt","DEFAULT_HASH_LENGTH","MCARD_LOG_LEVEL","DEFAULT_LOG_LEVEL","getInstance","reset","getLogLevel","get_log_level","get_db_path","get_hash_algorithm","get_hash_custom_module","get_hash_custom_function","get_hash_custom_length","get_default_db_path","path","resolve","cwd","exports","default"],"sources":["../../src/config/env_parameters.js"],"sourcesContent":["import dotenv from 'dotenv';\nimport path from 'path';\nimport {\n DEFAULT_HASH_LENGTH,\n DEFAULT_LOG_LEVEL\n} from './config_constants.js';\n\nclass EnvParameters {\n static #instance = null;\n\n constructor() {\n // Load environment variables\n dotenv.config();\n\n // Set values from environment or use defaults from config_constants\n this.MCARD_DB_PATH = process.env.MCARD_DB_PATH;\n this.MCARD_HASH_ALGORITHM = process.env.MCARD_HASH_ALGORITHM;\n this.MCARD_HASH_CUSTOM_MODULE = process.env.MCARD_HASH_CUSTOM_MODULE;\n this.MCARD_HASH_CUSTOM_FUNCTION = process.env.MCARD_HASH_CUSTOM_FUNCTION;\n this.MCARD_HASH_LENGTH = parseInt(process.env.MCARD_HASH_LENGTH || DEFAULT_HASH_LENGTH, 10);\n this.MCARD_LOG_LEVEL = process.env.MCARD_LOG_LEVEL || DEFAULT_LOG_LEVEL;\n }\n\n static getInstance() {\n if (!EnvParameters.#instance) {\n EnvParameters.#instance = new EnvParameters();\n }\n return EnvParameters.#instance;\n }\n\n static reset() {\n EnvParameters.#instance = null;\n }\n\n getLogLevel() {\n return this.MCARD_LOG_LEVEL;\n }\n\n get_log_level() {\n return this.getLogLevel();\n }\n\n // Getter methods matching Python implementation\n get_db_path() {\n return this.MCARD_DB_PATH;\n }\n\n get_hash_algorithm() {\n return this.MCARD_HASH_ALGORITHM;\n }\n\n get_hash_custom_module() {\n return this.MCARD_HASH_CUSTOM_MODULE;\n }\n\n get_hash_custom_function() {\n return this.MCARD_HASH_CUSTOM_FUNCTION;\n }\n\n get_hash_custom_length() {\n return this.MCARD_HASH_LENGTH;\n }\n\n get_default_db_path() {\n return path.resolve(process.cwd(), this.MCARD_DB_PATH);\n }\n}\n\nexport { EnvParameters as default, EnvParameters };\n"],"mappings":";;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AAKA,MAAMG,aAAa,CAAC;EAClB,OAAO,CAACC,QAAQ,GAAG,IAAI;EAEvBC,WAAWA,CAAA,EAAG;IACZ;IACAC,eAAM,CAACC,MAAM,CAAC,CAAC;;IAEf;IACA,IAAI,CAACC,aAAa,GAAGC,OAAO,CAACC,GAAG,CAACF,aAAa;IAC9C,IAAI,CAACG,oBAAoB,GAAGF,OAAO,CAACC,GAAG,CAACC,oBAAoB;IAC5D,IAAI,CAACC,wBAAwB,GAAGH,OAAO,CAACC,GAAG,CAACE,wBAAwB;IACpE,IAAI,CAACC,0BAA0B,GAAGJ,OAAO,CAACC,GAAG,CAACG,0BAA0B;IACxE,IAAI,CAACC,iBAAiB,GAAGC,QAAQ,CAACN,OAAO,CAACC,GAAG,CAACI,iBAAiB,IAAIE,qCAAmB,EAAE,EAAE,CAAC;IAC3F,IAAI,CAACC,eAAe,GAAGR,OAAO,CAACC,GAAG,CAACO,eAAe,IAAIC,mCAAiB;EACzE;EAEA,OAAOC,WAAWA,CAAA,EAAG;IACnB,IAAI,CAAChB,aAAa,CAAC,CAACC,QAAQ,EAAE;MAC5BD,aAAa,CAAC,CAACC,QAAQ,GAAG,IAAID,aAAa,CAAC,CAAC;IAC/C;IACA,OAAOA,aAAa,CAAC,CAACC,QAAQ;EAChC;EAEA,OAAOgB,KAAKA,CAAA,EAAG;IACbjB,aAAa,CAAC,CAACC,QAAQ,GAAG,IAAI;EAChC;EAEAiB,WAAWA,CAAA,EAAG;IACZ,OAAO,IAAI,CAACJ,eAAe;EAC7B;EAEAK,aAAaA,CAAA,EAAG;IACd,OAAO,IAAI,CAACD,WAAW,CAAC,CAAC;EAC3B;;EAEA;EACAE,WAAWA,CAAA,EAAG;IACZ,OAAO,IAAI,CAACf,aAAa;EAC3B;EAEAgB,kBAAkBA,CAAA,EAAG;IACnB,OAAO,IAAI,CAACb,oBAAoB;EAClC;EAEAc,sBAAsBA,CAAA,EAAG;IACvB,OAAO,IAAI,CAACb,wBAAwB;EACtC;EAEAc,wBAAwBA,CAAA,EAAG;IACzB,OAAO,IAAI,CAACb,0BAA0B;EACxC;EAEAc,sBAAsBA,CAAA,EAAG;IACvB,OAAO,IAAI,CAACb,iBAAiB;EAC/B;EAEAc,mBAAmBA,CAAA,EAAG;IACpB,OAAOC,aAAI,CAACC,OAAO,CAACrB,OAAO,CAACsB,GAAG,CAAC,CAAC,EAAE,IAAI,CAACvB,aAAa,CAAC;EACxD;AACF;AAACwB,OAAA,CAAA7B,aAAA,GAAA6B,OAAA,CAAAC,OAAA,GAAA9B,aAAA","ignoreList":[]}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ // Simple content type detection utility
8
+
9
+ /**
10
+ * Basic content type detector for MCard system
11
+ */
12
+ class ContentTypeInterpreter {
13
+ /**
14
+ * Detect the content type of binary data
15
+ * @param {Buffer} data - Binary data to analyze
16
+ * @returns {string} Detected MIME type
17
+ */
18
+ static detectType(data) {
19
+ if (!data || !Buffer.isBuffer(data)) {
20
+ return 'text/plain';
21
+ }
22
+
23
+ // Simple detection based on magic numbers/signatures
24
+ if (data.length < 4) return 'application/octet-stream';
25
+
26
+ // Check for common file signatures
27
+ const signatures = {
28
+ // Images
29
+ 'image/jpeg': [[0xFF, 0xD8, 0xFF]],
30
+ 'image/png': [[0x89, 0x50, 0x4E, 0x47]],
31
+ 'image/gif': [[0x47, 0x49, 0x46, 0x38]],
32
+ 'image/webp': [[0x52, 0x49, 0x46, 0x46]],
33
+ 'image/bmp': [[0x42, 0x4D]],
34
+ // Documents
35
+ 'application/pdf': [[0x25, 0x50, 0x44, 0x46]],
36
+ // Audio
37
+ 'audio/mpeg': [[0x49, 0x44, 0x33], [0xFF, 0xFB]],
38
+ 'audio/wav': [[0x52, 0x49, 0x46, 0x46]],
39
+ // Video
40
+ 'video/mp4': [[0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]],
41
+ 'video/webm': [[0x1A, 0x45, 0xDF, 0xA3]],
42
+ // Archives
43
+ 'application/zip': [[0x50, 0x4B, 0x03, 0x04]],
44
+ 'application/gzip': [[0x1F, 0x8B]]
45
+ };
46
+ for (const [mimeType, signatureList] of Object.entries(signatures)) {
47
+ for (const signature of signatureList) {
48
+ if (signature.every((byte, i) => data[i] === byte)) {
49
+ console.log('Detected by signature:', mimeType);
50
+ return mimeType;
51
+ }
52
+ }
53
+ }
54
+
55
+ // Check for text content
56
+ const isText = ContentTypeInterpreter.isTextContent(data);
57
+ if (isText) return 'text/plain';
58
+
59
+ // Default fallback
60
+ return 'application/octet-stream';
61
+ }
62
+
63
+ /**
64
+ * Check if data is likely to be text content
65
+ * @param {Buffer} data - Binary data to analyze
66
+ * @returns {boolean} True if likely text content
67
+ */
68
+ static isTextContent(data) {
69
+ // Simple heuristic: check if most bytes are within ASCII printable range
70
+ // and no NUL bytes are present
71
+ if (!data || data.length === 0) return true;
72
+
73
+ // Check for NULL bytes which typically indicate binary data
74
+ if (data.includes(0)) return false;
75
+ const printableChars = data.filter(byte => byte >= 32 && byte <= 126 ||
76
+ // ASCII printable
77
+ byte === 9 ||
78
+ // Tab
79
+ byte === 10 ||
80
+ // LF
81
+ byte === 13 // CR
82
+ ).length;
83
+
84
+ // If over 90% of bytes are printable characters, likely text
85
+ return printableChars / data.length > 0.9;
86
+ }
87
+ }
88
+ var _default = exports.default = ContentTypeInterpreter;
89
+ //# sourceMappingURL=content_type_detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content_type_detector.js","names":["ContentTypeInterpreter","detectType","data","Buffer","isBuffer","length","signatures","mimeType","signatureList","Object","entries","signature","every","byte","i","console","log","isText","isTextContent","includes","printableChars","filter","_default","exports","default"],"sources":["../../../src/content/model/content_type_detector.js"],"sourcesContent":["// Simple content type detection utility\n\n/**\n * Basic content type detector for MCard system\n */\nclass ContentTypeInterpreter {\n /**\n * Detect the content type of binary data\n * @param {Buffer} data - Binary data to analyze\n * @returns {string} Detected MIME type\n */\n static detectType(data) {\n if (!data || !Buffer.isBuffer(data)) {\n return 'text/plain';\n }\n \n // Simple detection based on magic numbers/signatures\n if (data.length < 4) return 'application/octet-stream';\n \n // Check for common file signatures\n const signatures = {\n // Images\n 'image/jpeg': [[0xFF, 0xD8, 0xFF]],\n 'image/png': [[0x89, 0x50, 0x4E, 0x47]],\n 'image/gif': [[0x47, 0x49, 0x46, 0x38]],\n 'image/webp': [[0x52, 0x49, 0x46, 0x46]],\n 'image/bmp': [[0x42, 0x4D]],\n \n // Documents\n 'application/pdf': [[0x25, 0x50, 0x44, 0x46]],\n \n // Audio\n 'audio/mpeg': [[0x49, 0x44, 0x33], [0xFF, 0xFB]],\n 'audio/wav': [[0x52, 0x49, 0x46, 0x46]],\n \n // Video\n 'video/mp4': [[0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]],\n 'video/webm': [[0x1A, 0x45, 0xDF, 0xA3]],\n \n // Archives\n 'application/zip': [[0x50, 0x4B, 0x03, 0x04]],\n 'application/gzip': [[0x1F, 0x8B]],\n };\n \n for (const [mimeType, signatureList] of Object.entries(signatures)) {\n for (const signature of signatureList) {\n if (signature.every((byte, i) => data[i] === byte)) {\n console.log('Detected by signature:', mimeType);\n return mimeType;\n }\n }\n }\n \n // Check for text content\n const isText = ContentTypeInterpreter.isTextContent(data);\n if (isText) return 'text/plain';\n \n // Default fallback\n return 'application/octet-stream';\n }\n \n /**\n * Check if data is likely to be text content\n * @param {Buffer} data - Binary data to analyze\n * @returns {boolean} True if likely text content\n */\n static isTextContent(data) {\n // Simple heuristic: check if most bytes are within ASCII printable range\n // and no NUL bytes are present\n if (!data || data.length === 0) return true;\n \n // Check for NULL bytes which typically indicate binary data\n if (data.includes(0)) return false;\n \n const printableChars = data.filter(byte => \n (byte >= 32 && byte <= 126) || // ASCII printable\n byte === 9 || // Tab\n byte === 10 || // LF\n byte === 13 // CR\n ).length;\n \n // If over 90% of bytes are printable characters, likely text\n return (printableChars / data.length) > 0.9;\n }\n}\n\nexport default ContentTypeInterpreter;\n"],"mappings":"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","ignoreList":[]}