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.
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/__mocks__/better-sqlite3.js +20 -0
- package/dist/__mocks__/better-sqlite3.js.map +1 -0
- package/dist/config/config_constants.js +188 -0
- package/dist/config/config_constants.js.map +1 -0
- package/dist/config/env_parameters.js +62 -0
- package/dist/config/env_parameters.js.map +1 -0
- package/dist/content/model/content_type_detector.js +89 -0
- package/dist/content/model/content_type_detector.js.map +1 -0
- package/dist/core/card-collection.js +279 -0
- package/dist/core/card-collection.js.map +1 -0
- package/dist/core/event-producer.js +132 -0
- package/dist/core/event-producer.js.map +1 -0
- package/dist/core/g_time.js +201 -0
- package/dist/core/g_time.js.map +1 -0
- package/dist/core/hash/enums.js +19 -0
- package/dist/core/hash/enums.js.map +1 -0
- package/dist/core/hash/validator.js +260 -0
- package/dist/core/hash/validator.js.map +1 -0
- package/dist/core/mcard.js +205 -0
- package/dist/core/mcard.js.map +1 -0
- package/dist/engine/sqlite_engine.js +723 -0
- package/dist/engine/sqlite_engine.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/mcardPersistenceMiddleware.js +45 -0
- package/dist/middleware/mcardPersistenceMiddleware.js.map +1 -0
- package/dist/models/database_schemas.js +31 -0
- package/dist/models/database_schemas.js.map +1 -0
- package/dist/services/logger.js +80 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/mcardStorageService.js +36 -0
- package/dist/services/mcardStorageService.js.map +1 -0
- package/dist/utils/actionHelpers.js +25 -0
- package/dist/utils/actionHelpers.js.map +1 -0
- package/dist/utils/bufferContentHelper.js +393 -0
- package/dist/utils/bufferContentHelper.js.map +1 -0
- package/dist/utils/bufferPolyfill.js +198 -0
- package/dist/utils/bufferPolyfill.js.map +1 -0
- package/dist/utils/content-detection.js +74 -0
- package/dist/utils/content-detection.js.map +1 -0
- package/dist/utils/content-utils.js +269 -0
- package/dist/utils/content-utils.js.map +1 -0
- package/dist/utils/content_type_detector copy.js +480 -0
- package/dist/utils/content_type_detector copy.js.map +1 -0
- package/dist/utils/content_type_detector.js +480 -0
- package/dist/utils/content_type_detector.js.map +1 -0
- package/dist/utils/cryptoPolyfill.js +166 -0
- package/dist/utils/cryptoPolyfill.js.map +1 -0
- package/dist/utils/dotenv-browser.js +35 -0
- package/dist/utils/dotenv-browser.js.map +1 -0
- package/dist/utils/environmentDetector.js +93 -0
- package/dist/utils/environmentDetector.js.map +1 -0
- package/dist/utils/logWriter.js +27 -0
- package/dist/utils/logWriter.js.map +1 -0
- package/dist/utils/serviceWorkerManager.js +118 -0
- package/dist/utils/serviceWorkerManager.js.map +1 -0
- package/dist/utils/test-content-detection.js +79 -0
- package/dist/utils/test-content-detection.js.map +1 -0
- package/dist/utils/test-detection-fix.js +121 -0
- package/dist/utils/test-detection-fix.js.map +1 -0
- package/dist/utils/test-format-conversion.js +170 -0
- package/dist/utils/test-format-conversion.js.map +1 -0
- package/dist/utils/test-mov-viewer.js +57 -0
- package/dist/utils/test-mov-viewer.js.map +1 -0
- package/dist/utils/testDetection.js +21 -0
- package/dist/utils/testDetection.js.map +1 -0
- package/dist/utils/textEncoderPolyfill.js +87 -0
- package/dist/utils/textEncoderPolyfill.js.map +1 -0
- package/package.json +74 -0
- package/src/__mocks__/better-sqlite3.js +14 -0
- package/src/config/config_constants.js +227 -0
- package/src/config/env_parameters.js +69 -0
- package/src/content/model/content_type_detector.js +87 -0
- package/src/core/card-collection.js +300 -0
- package/src/core/event-producer.js +160 -0
- package/src/core/g_time.js +215 -0
- package/src/core/hash/enums.js +13 -0
- package/src/core/hash/validator.js +271 -0
- package/src/core/mcard.js +203 -0
- package/src/engine/sqlite_engine.js +755 -0
- package/src/index.js +10 -0
- package/src/middleware/mcardPersistenceMiddleware.js +45 -0
- package/src/models/database_schemas.js +26 -0
- package/src/services/logger.js +74 -0
- package/src/services/mcardStorageService.js +34 -0
- package/src/utils/actionHelpers.js +13 -0
- package/src/utils/bufferContentHelper.js +436 -0
- package/src/utils/bufferPolyfill.js +202 -0
- package/src/utils/cn.ts +6 -0
- package/src/utils/content-detection.js +66 -0
- package/src/utils/content-utils.js +250 -0
- package/src/utils/content_type_detector copy.js +501 -0
- package/src/utils/content_type_detector.js +501 -0
- package/src/utils/cryptoPolyfill.js +180 -0
- package/src/utils/dateUtils.ts +18 -0
- package/src/utils/dbInitializer.ts +27 -0
- package/src/utils/dotenv-browser.js +29 -0
- package/src/utils/environmentDetector.js +92 -0
- package/src/utils/logWriter.js +20 -0
- package/src/utils/serviceWorkerManager.js +122 -0
- package/src/utils/stateWatcher.ts +78 -0
- package/src/utils/storeAdapter copy.ts +157 -0
- package/src/utils/storeAdapter.ts +157 -0
- package/src/utils/test-content-detection.js +71 -0
- package/src/utils/test-detection-fix.js +136 -0
- package/src/utils/test-format-conversion.js +165 -0
- package/src/utils/test-mov-viewer.js +59 -0
- package/src/utils/testDetection.js +16 -0
- package/src/utils/textEncoderPolyfill.js +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite_engine.js","names":["_mcard","require","_cardCollection","_config_constants","_database_schemas","_content_type_detector","_interopRequireDefault","_bufferPolyfill","_path","_betterSqlite","_fs","SQLiteConnection","_instance","getInstance","dbPath","constructor","process","env","MCARD_DB_PATH","CARDS_DB_PATH","path","resolve","conn","connect","dir","dirname","fs","existsSync","mkdirSync","recursive","Database","mode","OPEN_READWRITE","OPEN_CREATE","verbose","error","console","message","setup_database","tableExists","prepare","get","log","exec","MCARD_TABLE_SCHEMA","TRIGGERS","forEach","trigger","triggerError","warn","disconnect","close","commit","run","rollback","executeQuery","query","params","stmt","all","exports","SQLiteEngine","connection","clearStmt","destructor","Symbol","dispose","add","card","hash","existingCard","finalContent","SafeBuffer","isBuffer","content","JSON","stringify","String","g_time","sqlError","row","content_type","length","slice","toString","substring","isBlob","contentForDetection","contentType","ContentTypeInterpreter","detectContentType","mimeType","startsWith","str","parse","e","parsed","delete","hashValue","result","changes","get_page","page_number","page_size","DEFAULT_PAGE_SIZE","Error","offset","countStmt","total","rows","items","parsedContent","MCardFromData","push","total_pages","Math","ceil","Page","total_items","has_next","has_previous","search_by_string","searchString","pageNumber","pageSize","cursor","search_by_content","begin","clear","count","update","newContent","get_all"],"sources":["../../src/engine/sqlite_engine.js"],"sourcesContent":["import { MCardFromData } from '../core/mcard.js';\nimport { Page } from '../core/card-collection.js';\nimport { DEFAULT_PAGE_SIZE, CARDS_DB_PATH } from '../config/config_constants.js';\nimport { MCARD_TABLE_SCHEMA, TRIGGERS } from '../models/database_schemas.js';\nimport ContentTypeInterpreter from '../content/model/content_type_detector.js';\nimport { SafeBuffer } from '../utils/bufferPolyfill.js';\nimport path from 'path';\nimport Database from 'better-sqlite3';\nimport fs from 'fs';\n\nclass SQLiteConnection {\n /**\n * Singleton instance management\n */\n static _instance = null;\n\n /**\n * Get singleton instance of SQLiteConnection\n * @param {string} [dbPath] - Optional path to the SQLite database file\n * @returns {SQLiteConnection} Singleton instance\n */\n static getInstance(dbPath = null) {\n if (!this._instance) {\n this._instance = new SQLiteConnection(dbPath);\n }\n return this._instance;\n }\n\n /**\n * Create a new SQLite database connection\n * @param {string} [dbPath] - Optional path to the SQLite database file\n * Prioritizes the provided path, then environment variable, then default config\n */\n constructor(dbPath = null) {\n // Determine the database path in order of priority:\n // 1. Explicitly provided path\n // 2. Environment variable\n // 3. Default configuration path\n this.dbPath = dbPath || \n process.env.MCARD_DB_PATH || \n CARDS_DB_PATH;\n \n // Ensure the path is an absolute path\n this.dbPath = path.resolve(this.dbPath);\n \n this.conn = null;\n }\n\n /**\n * Establish a database connection\n */\n connect() {\n try {\n // Ensure the directory exists\n const dir = path.dirname(this.dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Open the database connection with appropriate flags\n // Don't remove the existing database file to prevent data loss\n this.conn = new Database(this.dbPath, {\n // Open in read-write mode, create if not exists\n mode: Database.OPEN_READWRITE | Database.OPEN_CREATE,\n // Disable verbose mode to reduce unnecessary logging\n verbose: null\n });\n\n return this;\n } catch (error) {\n console.error(`Database connection error: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Set up the database, creating the file and table if they don't exist\n */\n setup_database() {\n try {\n // Ensure the connection is open\n if (!this.conn) {\n this.connect();\n }\n\n // Check if the tables already exist\n const tableExists = this.conn.prepare(`\n SELECT name FROM sqlite_master \n WHERE type='table' AND name='card'\n `).get();\n\n // Only create tables if they don't exist\n if (!tableExists) {\n console.log('Creating new database tables...');\n \n // Create the table using the schema\n this.conn.exec(MCARD_TABLE_SCHEMA);\n \n // Add triggers\n TRIGGERS.forEach(trigger => {\n try {\n this.conn.exec(trigger);\n } catch (triggerError) {\n console.warn(`Warning during trigger creation: ${triggerError.message}`);\n }\n });\n\n console.log('Database tables created successfully');\n } else {\n console.log('Database tables already exist, skipping creation');\n }\n } catch (error) {\n console.error('Database setup failed:', error);\n throw error;\n }\n }\n\n /**\n * Close the database connection\n */\n disconnect() {\n try {\n if (this.conn) {\n this.conn.close();\n this.conn = null;\n }\n } catch (error) {\n console.warn(`Error during database disconnect: ${error.message}`);\n }\n }\n\n /**\n * Commit the current transaction\n */\n commit() {\n if (this.conn) {\n this.conn.prepare('COMMIT').run();\n }\n }\n\n /**\n * Rollback the current transaction\n */\n rollback() {\n if (this.conn) {\n this.conn.prepare('ROLLBACK').run();\n }\n }\n\n /**\n * Add a method to execute raw queries\n * @param {string} query - Raw query to execute\n * @param {array} params - Parameters for the query\n * @returns {array} Results of the query\n */\n executeQuery(query, params = []) {\n if (!this.conn) {\n this.connect();\n }\n const stmt = this.conn.prepare(query);\n return stmt.all(...params);\n }\n}\n\nclass SQLiteEngine {\n /**\n * Create a new SQLite storage engine\n * @param {SQLiteConnection} connection - Database connection\n */\n constructor(connection = null) {\n this.connection = connection || SQLiteConnection.getInstance();\n this.connection.connect();\n this.connection.setup_database();\n this.clearStmt = this.connection.conn.prepare('DELETE FROM card');\n }\n\n /**\n * Destructor to ensure database connection is closed\n */\n destructor() {\n this.connection.disconnect();\n }\n\n /**\n * Symbol.dispose method for resource cleanup\n */\n [Symbol.dispose]() {\n this.destructor();\n }\n\n /**\n * Add a card to the database\n * @param {MCard} card - Card to add\n * @returns {string} Hash of the added card\n */\n add(card) {\n try {\n console.log('SQLiteEngine.add called with card hash:', card.hash);\n \n // Check if the card already exists\n const existingCard = this.get(card.hash);\n if (existingCard) {\n console.log('Card already exists with hash:', card.hash);\n return card.hash;\n }\n\n // Ensure content is properly serialized for SQLite storage\n let finalContent;\n // Always store as string (JSON) or Buffer\n if (SafeBuffer.isBuffer(card.content)) {\n // Buffers can be stored directly\n finalContent = card.content;\n console.log('Using Buffer content directly');\n } else if (typeof card.content === 'object' && card.content !== null) {\n // Explicitly serialize objects\n finalContent = JSON.stringify(card.content);\n console.log('Serialized object content to JSON string');\n } else if (typeof card.content === 'string') {\n // Strings can be stored directly\n finalContent = card.content;\n console.log('Using string content directly');\n } else {\n // Convert other types to string\n finalContent = String(card.content);\n console.log('Converted content to string');\n }\n\n // Insert the card into the database\n try {\n const stmt = this.connection.conn.prepare(\n 'INSERT INTO card (hash, content, g_time) VALUES (?, ?, ?)'\n );\n \n stmt.run(card.hash, finalContent, card.g_time);\n \n console.log('Card inserted successfully with hash:', card.hash);\n return card.hash;\n } catch (sqlError) {\n console.error('SQL error inserting card:', sqlError);\n throw sqlError;\n }\n } catch (error) {\n console.error('Error in SQLiteEngine.add:', error);\n throw error;\n }\n }\n\n /**\n * Retrieve a card by its hash\n * @param {string} hashValue - Hash of the card to retrieve\n * @returns {MCard|null} Retrieved card or null\n */\n get(hash) {\n try {\n console.log('SQLiteEngine.get called with hash:', hash);\n \n // Query the database for the card\n const stmt = this.connection.conn.prepare(\n 'SELECT hash, content, g_time, typeof(content) as content_type FROM card WHERE hash = ?'\n );\n \n const row = stmt.get(String(hash));\n \n if (!row) {\n console.log('No card found with hash:', hash);\n return null;\n }\n \n console.log(`SQLiteEngine.get - Raw content typeof:`, row.content_type);\n console.log(`SQLiteEngine.get - JS typeof:`, typeof row.content);\n console.log(`SQLiteEngine.get - Is Buffer:`, SafeBuffer.isBuffer(row.content));\n console.log(`SQLiteEngine.get - Content length:`, row.content ? row.content.length : 0);\n \n if (SafeBuffer.isBuffer(row.content)) {\n console.log(`SQLiteEngine.get - Buffer content first 20 bytes:`, row.content.slice(0, 20).toString('hex'));\n } else if (typeof row.content === 'string') {\n console.log(`SQLiteEngine.get - String content first 50 chars:`, row.content.substring(0, 50));\n }\n \n // Detect content type BEFORE any transformations\n const isBlob = SafeBuffer.isBuffer(row.content);\n const contentForDetection = row.content;\n \n // Detect content type from the raw content\n const contentType = ContentTypeInterpreter.detectContentType(contentForDetection);\n \n console.log(`SQLiteEngine.get - Detected contentType:`, contentType);\n \n // Add isBlob flag to contentType object\n contentType.isBlob = isBlob;\n \n // Parse content if it's a JSON string - but only if not detected as another type\n let content = row.content;\n // If stored as Buffer (Node.js), convert to Uint8Array for cross-env compatibility\n if (SafeBuffer.isBuffer(content)) {\n // Optionally decode to string if contentType is text or JSON\n if (contentType.mimeType === 'application/json' || contentType.mimeType.startsWith('text/')) {\n try {\n const str = SafeBuffer.toString(content);\n if (contentType.mimeType === 'application/json' && (str.startsWith('{') || str.startsWith('['))) {\n content = JSON.parse(str);\n console.log('Parsed JSON content successfully from Buffer');\n } else {\n content = str;\n console.log('Converted Buffer to string');\n }\n } catch (e) {\n console.warn('Failed to decode Buffer content:', e);\n }\n }\n // else: leave as Uint8Array/Buffer for binary data\n } else if (typeof content === 'string' && contentType.mimeType === 'application/json') {\n try {\n // Check if the string is a JSON object\n if (content.startsWith('{') || content.startsWith('[')) {\n const parsed = JSON.parse(content);\n content = parsed;\n console.log('Parsed JSON content successfully');\n }\n } catch (e) {\n // If parsing fails, keep the original string\n console.log('Content is not a valid JSON string, keeping as-is');\n }\n }\n \n console.log('Card retrieved successfully with hash:', hash);\n \n return {\n hash: row.hash,\n content: content,\n g_time: row.g_time,\n contentType: contentType // Add content type information to the response\n };\n } catch (error) {\n console.error('Error retrieving card:', error);\n return null;\n }\n }\n\n /**\n * Delete a card by its hash\n * @param {string} hashValue - Hash of the card to delete\n * @returns {boolean} Whether deletion was successful\n */\n delete(hashValue) {\n try {\n const stmt = this.connection.conn.prepare(\n 'DELETE FROM card WHERE hash = ?'\n );\n \n const result = stmt.run(String(hashValue));\n return result.changes > 0;\n } catch (error) {\n console.error(`Error deleting card: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Get a page of cards\n * @param {number} page_number - Page number to retrieve\n * @param {number} page_size - Number of items per page\n * @returns {Page} Page of cards\n */\n get_page(page_number = 1, page_size = DEFAULT_PAGE_SIZE) {\n if (page_number < 1 || page_size < 1) {\n throw new Error('Page number and size must be >= 1');\n }\n\n const offset = (page_number - 1) * page_size;\n\n // Get total count of items\n const countStmt = this.connection.conn.prepare(\n 'SELECT COUNT(*) as total FROM card'\n );\n const { total } = countStmt.get();\n\n // Get page of items\n const stmt = this.connection.conn.prepare(`\n SELECT content, g_time, hash \n FROM card \n ORDER BY g_time DESC \n LIMIT ? OFFSET ?\n `);\n \n const rows = stmt.all(page_size, offset);\n\n // Convert rows to cards\n const items = [];\n for (const row of rows) {\n const [content, g_time, hash] = [row.content, row.g_time, row.hash];\n \n // Parse content if it's a JSON string\n let parsedContent = content;\n if (typeof content === 'string' && (content.startsWith('{') || content.startsWith('['))) {\n try {\n parsedContent = JSON.parse(content);\n } catch (e) {\n console.warn('Failed to parse JSON content for hash:', hash);\n }\n }\n \n // Create card with properly parsed content\n const card = new MCardFromData(parsedContent, hash, g_time);\n items.push(card);\n }\n\n // Calculate total pages\n const total_pages = Math.ceil(total / page_size);\n\n return new Page({\n items,\n total_items: total,\n page_number,\n page_size,\n has_next: offset + page_size < total,\n has_previous: page_number > 1,\n total_pages\n });\n }\n\n /**\n * Search cards by string\n * @param {string} search_string - String to search for\n * @param {number} page_number - Page number to retrieve\n * @param {number} page_size - Number of items per page\n * @returns {Page} Page of matching cards\n */\n search_by_string(searchString, pageNumber = 1, pageSize = DEFAULT_PAGE_SIZE) {\n try {\n if (pageNumber < 1) {\n throw new Error('Page number must be >= 1');\n }\n if (pageSize < 1) {\n throw new Error('Page size must be >= 1');\n }\n\n const offset = (pageNumber - 1) * pageSize;\n const cursor = this.connection.conn;\n\n // First, get total count of matching items\n const countStmt = cursor.prepare(`\n SELECT COUNT(*) as total FROM card \n WHERE \n CAST(content AS TEXT) LIKE ? OR \n hash LIKE ? OR \n g_time LIKE ?\n `);\n const { total } = countStmt.get(\n `%${searchString}%`, \n `%${searchString}%`, \n `%${searchString}%`\n );\n\n // Then, get the actual items for the current page\n const stmt = cursor.prepare(`\n SELECT content, g_time, hash FROM card \n WHERE \n CAST(content AS TEXT) LIKE ? OR \n hash LIKE ? OR \n g_time LIKE ?\n ORDER BY g_time DESC LIMIT ? OFFSET ?\n `);\n \n const rows = stmt.all(\n `%${searchString}%`, \n `%${searchString}%`, \n `%${searchString}%`,\n pageSize, \n offset\n );\n\n // Convert rows to cards\n const items = [];\n for (const row of rows) {\n const { content, g_time, hash } = row;\n \n // Parse content if it's a JSON string\n let parsedContent = content;\n if (typeof content === 'string' && (content.startsWith('{') || content.startsWith('['))) {\n try {\n parsedContent = JSON.parse(content);\n } catch (e) {\n console.warn('Failed to parse JSON content for hash:', hash);\n }\n }\n \n // Create card with properly parsed content\n const card = new MCardFromData(parsedContent, hash, g_time);\n items.push(card);\n }\n\n // Calculate pagination flags\n const has_next = total > (pageNumber * pageSize);\n const has_previous = pageNumber > 1;\n\n return new Page({\n items,\n total_items: total,\n page_number: pageNumber,\n page_size: pageSize,\n has_next,\n has_previous,\n total_pages: Math.ceil(total / pageSize)\n });\n } catch (error) {\n console.error(`Error searching cards: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Search for cards by content, hash, or g_time\n * @param {string} searchString - String to search for\n * @param {number} pageNumber - Page number for pagination\n * @param {number} pageSize - Number of items per page\n * @returns {Page} Paginated search results\n */\n search_by_content(searchString, pageNumber = 1, pageSize = DEFAULT_PAGE_SIZE) {\n try {\n if (pageNumber < 1) {\n throw new Error('Page number must be >= 1');\n }\n if (pageSize < 1) {\n throw new Error('Page size must be >= 1');\n }\n\n const offset = (pageNumber - 1) * pageSize;\n const cursor = this.connection.conn;\n\n // First, get total count of matching items\n const countStmt = cursor.prepare(\n 'SELECT COUNT(*) as total FROM card WHERE CAST(content AS TEXT) LIKE ?'\n );\n const { total } = countStmt.get(`%${searchString}%`);\n\n // Then, get the actual items for the current page\n const stmt = cursor.prepare(`\n SELECT content, g_time, hash FROM card \n WHERE CAST(content AS TEXT) LIKE ?\n ORDER BY g_time DESC LIMIT ? OFFSET ?\n `);\n \n const rows = stmt.all(\n `%${searchString}%`,\n pageSize, \n offset\n );\n\n // Convert rows to cards\n const items = [];\n for (const row of rows) {\n const { content, g_time, hash } = row;\n \n // Parse content if it's a JSON string\n let parsedContent = content;\n if (typeof content === 'string' && (content.startsWith('{') || content.startsWith('['))) {\n try {\n parsedContent = JSON.parse(content);\n } catch (e) {\n console.warn('Failed to parse JSON content for hash:', hash);\n }\n }\n \n // Create card with properly parsed content\n const card = new MCardFromData(parsedContent, hash, g_time);\n items.push(card);\n }\n\n // Calculate pagination flags\n const has_next = total > (pageNumber * pageSize);\n const has_previous = pageNumber > 1;\n\n return new Page({\n items,\n total_items: total,\n page_number: pageNumber,\n page_size: pageSize,\n has_next,\n has_previous,\n total_pages: Math.ceil(total / pageSize)\n });\n } catch (error) {\n console.error(`Error searching cards: ${error.message}`);\n throw error;\n }\n }\n\n begin() {\n if (this.connection.conn) {\n this.connection.conn.prepare('BEGIN TRANSACTION').run();\n }\n }\n\n commit() {\n if (this.connection.conn) {\n this.connection.conn.prepare('COMMIT').run();\n }\n }\n\n rollback() {\n if (this.connection.conn) {\n this.connection.conn.prepare('ROLLBACK').run();\n }\n }\n\n clear() {\n try {\n this.begin();\n this.clearStmt.run();\n this.commit();\n } catch (error) {\n this.rollback();\n throw error;\n }\n }\n\n /**\n * Count the total number of cards\n * @returns {number} Total number of cards\n */\n count() {\n const stmt = this.connection.conn.prepare('SELECT COUNT(*) as total FROM card');\n const { total } = stmt.get();\n return total;\n }\n\n /**\n * Update a card's content by hash\n * @param {string} hash - Hash of the card to update\n * @param {any} newContent - New content for the card\n * @returns {boolean} Whether the update was successful\n */\n update(hash, newContent) {\n try {\n console.log('SQLiteEngine.update called with hash:', hash);\n \n // First verify the card exists\n const existingCard = this.get(hash);\n if (!existingCard) {\n console.log('No card found with hash:', hash);\n return false;\n }\n \n // Prepare content for storage\n let finalContent;\n \n if (typeof newContent === 'object' && newContent !== null && !SafeBuffer.isBuffer(newContent)) {\n // For objects, stringify to ensure proper SQLite storage\n finalContent = JSON.stringify(newContent);\n console.log('Serialized object content to JSON string for update');\n } else if (typeof newContent === 'string') {\n // Strings can be stored directly\n finalContent = newContent;\n console.log('Using string content directly for update');\n } else if (SafeBuffer.isBuffer(newContent)) {\n // Buffers can be stored directly\n finalContent = newContent;\n console.log('Using Buffer content directly for update');\n } else {\n // Convert other types to string\n finalContent = String(newContent);\n console.log('Converted content to string for update');\n }\n \n // Update the card in the database\n const stmt = this.connection.conn.prepare(\n 'UPDATE card SET content = ? WHERE hash = ?'\n );\n \n const result = stmt.run(finalContent, String(hash));\n \n if (result.changes > 0) {\n console.log('Card updated successfully with hash:', hash);\n return true;\n } else {\n console.log('Card update had no effect for hash:', hash);\n return false;\n }\n } catch (error) {\n console.error('Error updating card:', error);\n return false;\n }\n }\n\n /**\n * Get all cards\n * @param {number} page_number - Page number to retrieve\n * @param {number} page_size - Number of items per page\n * @returns {Page} Page of all cards\n */\n get_all(page_number = 1, page_size = DEFAULT_PAGE_SIZE) {\n if (page_number < 1) {\n throw new Error(\"Page number must be >= 1\");\n }\n if (page_size < 1) {\n throw new Error(\"Page size must be >= 1\");\n }\n \n const offset = (page_number - 1) * page_size;\n \n // Get total count of items\n const countStmt = this.connection.conn.prepare(\n 'SELECT COUNT(*) as total FROM card'\n );\n const { total } = countStmt.get();\n console.log('Total cards:', total);\n\n // Get page of items\n const stmt = this.connection.conn.prepare(`\n SELECT content, g_time, hash \n FROM card \n ORDER BY g_time DESC \n LIMIT ? OFFSET ?\n `);\n \n const rows = stmt.all(page_size, offset);\n console.log('Rows found:', rows.length);\n\n // Convert rows to cards\n const items = [];\n for (const row of rows) {\n const { content, g_time, hash } = row;\n \n // Parse content if it's a JSON string\n let parsedContent = content;\n if (typeof content === 'string' && (content.startsWith('{') || content.startsWith('['))) {\n try {\n parsedContent = JSON.parse(content);\n } catch (e) {\n console.warn('Failed to parse JSON content for hash:', hash);\n }\n }\n \n // Create card with properly parsed content\n const card = new MCardFromData(parsedContent, hash, g_time);\n items.push(card);\n }\n\n // Calculate total pages\n const total_pages = Math.ceil(total / page_size);\n\n return new Page({\n items,\n total_items: total,\n page_number,\n page_size,\n has_next: offset + page_size < total,\n has_previous: page_number > 1,\n total_pages\n });\n }\n}\n\nexport { SQLiteEngine, SQLiteConnection };"],"mappings":"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","ignoreList":[]}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["exampleFunction","console","log","module","exports"],"sources":["../src/index.js"],"sourcesContent":["// mcard - Monadic Card Library\n\n// Placeholder for your library's main functionality\nfunction exampleFunction() {\n console.log('mcard library is ready!');\n}\n\nmodule.exports = {\n exampleFunction\n};"],"mappings":"AAAA;;AAEA;AACA,SAASA,eAAeA,CAAA,EAAG;EACzBC,OAAO,CAACC,GAAG,CAAC,yBAAyB,CAAC;AACxC;AAEAC,MAAM,CAACC,OAAO,GAAG;EACfJ;AACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.mcardPersistenceMiddleware = exports.default = void 0;
|
|
7
|
+
// Middleware for Redux persistence of MCard data
|
|
8
|
+
const createMcardPersistenceMiddleware = storageService => store => next => async action => {
|
|
9
|
+
// Call the next middleware in the chain first
|
|
10
|
+
const result = next(action);
|
|
11
|
+
try {
|
|
12
|
+
// Handle persistence based on action type
|
|
13
|
+
if (action && action.type) {
|
|
14
|
+
// Check if this is a persistable action (e.g., todo actions)
|
|
15
|
+
const isPersistable = ['todo/addTask', 'ADD_CARD', 'test/action' // For testing purposes
|
|
16
|
+
].some(type => action.type === type);
|
|
17
|
+
if (isPersistable && storageService) {
|
|
18
|
+
// Get the current state from the store
|
|
19
|
+
const state = typeof store.getState === 'function' ? store.getState() : store.state || {};
|
|
20
|
+
|
|
21
|
+
// Create a copy of the action with the current state snapshot
|
|
22
|
+
const actionWithState = {
|
|
23
|
+
...action,
|
|
24
|
+
meta: {
|
|
25
|
+
...(action.meta || {}),
|
|
26
|
+
stateSnapshot: state
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Persist the action using the storage service
|
|
31
|
+
await storageService.createAndStoreMCard(actionWithState);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.error('Error in mcardPersistenceMiddleware:', error);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// Create a named export for backward compatibility
|
|
41
|
+
const mcardPersistenceMiddleware = exports.mcardPersistenceMiddleware = createMcardPersistenceMiddleware;
|
|
42
|
+
|
|
43
|
+
// Export both the named and default exports for flexibility
|
|
44
|
+
var _default = exports.default = createMcardPersistenceMiddleware;
|
|
45
|
+
//# sourceMappingURL=mcardPersistenceMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcardPersistenceMiddleware.js","names":["createMcardPersistenceMiddleware","storageService","store","next","action","result","type","isPersistable","some","state","getState","actionWithState","meta","stateSnapshot","createAndStoreMCard","error","console","mcardPersistenceMiddleware","exports","_default","default"],"sources":["../../src/middleware/mcardPersistenceMiddleware.js"],"sourcesContent":["// Middleware for Redux persistence of MCard data\nconst createMcardPersistenceMiddleware = (storageService) => (store) => (next) => async (action) => {\n // Call the next middleware in the chain first\n const result = next(action);\n \n try {\n // Handle persistence based on action type\n if (action && action.type) {\n // Check if this is a persistable action (e.g., todo actions)\n const isPersistable = [\n 'todo/addTask',\n 'ADD_CARD',\n 'test/action' // For testing purposes\n ].some(type => action.type === type);\n \n if (isPersistable && storageService) {\n // Get the current state from the store\n const state = typeof store.getState === 'function' ? store.getState() : store.state || {};\n \n // Create a copy of the action with the current state snapshot\n const actionWithState = {\n ...action,\n meta: {\n ...(action.meta || {}),\n stateSnapshot: state\n }\n };\n \n // Persist the action using the storage service\n await storageService.createAndStoreMCard(actionWithState);\n }\n }\n } catch (error) {\n console.error('Error in mcardPersistenceMiddleware:', error);\n }\n \n return result;\n};\n\n// Create a named export for backward compatibility\nconst mcardPersistenceMiddleware = createMcardPersistenceMiddleware;\n\n// Export both the named and default exports for flexibility\nexport { mcardPersistenceMiddleware };\nexport default createMcardPersistenceMiddleware;\n"],"mappings":";;;;;;AAAA;AACA,MAAMA,gCAAgC,GAAIC,cAAc,IAAMC,KAAK,IAAMC,IAAI,IAAK,MAAOC,MAAM,IAAK;EAClG;EACA,MAAMC,MAAM,GAAGF,IAAI,CAACC,MAAM,CAAC;EAE3B,IAAI;IACF;IACA,IAAIA,MAAM,IAAIA,MAAM,CAACE,IAAI,EAAE;MACzB;MACA,MAAMC,aAAa,GAAG,CACpB,cAAc,EACd,UAAU,EACV,aAAa,CAAC;MAAA,CACf,CAACC,IAAI,CAACF,IAAI,IAAIF,MAAM,CAACE,IAAI,KAAKA,IAAI,CAAC;MAEpC,IAAIC,aAAa,IAAIN,cAAc,EAAE;QACnC;QACA,MAAMQ,KAAK,GAAG,OAAOP,KAAK,CAACQ,QAAQ,KAAK,UAAU,GAAGR,KAAK,CAACQ,QAAQ,CAAC,CAAC,GAAGR,KAAK,CAACO,KAAK,IAAI,CAAC,CAAC;;QAEzF;QACA,MAAME,eAAe,GAAG;UACtB,GAAGP,MAAM;UACTQ,IAAI,EAAE;YACJ,IAAIR,MAAM,CAACQ,IAAI,IAAI,CAAC,CAAC,CAAC;YACtBC,aAAa,EAAEJ;UACjB;QACF,CAAC;;QAED;QACA,MAAMR,cAAc,CAACa,mBAAmB,CAACH,eAAe,CAAC;MAC3D;IACF;EACF,CAAC,CAAC,OAAOI,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,sCAAsC,EAAEA,KAAK,CAAC;EAC9D;EAEA,OAAOV,MAAM;AACf,CAAC;;AAED;AACA,MAAMY,0BAA0B,GAAAC,OAAA,CAAAD,0BAAA,GAAGjB,gCAAgC;;AAEnE;AAAA,IAAAmB,QAAA,GAAAD,OAAA,CAAAE,OAAA,GAEepB,gCAAgC","ignoreList":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.TRIGGERS = exports.MCARD_TABLE_SCHEMA = void 0;
|
|
7
|
+
// SQLite database schema definitions for mcards
|
|
8
|
+
|
|
9
|
+
const MCARD_TABLE_SCHEMA = exports.MCARD_TABLE_SCHEMA = `
|
|
10
|
+
CREATE TABLE IF NOT EXISTS card (
|
|
11
|
+
hash TEXT PRIMARY KEY,
|
|
12
|
+
g_time TEXT NOT NULL,
|
|
13
|
+
content BLOB NOT NULL
|
|
14
|
+
)
|
|
15
|
+
`;
|
|
16
|
+
const TRIGGERS = exports.TRIGGERS = {
|
|
17
|
+
ensureUnique: `
|
|
18
|
+
CREATE TRIGGER IF NOT EXISTS ensure_unique_hash
|
|
19
|
+
BEFORE INSERT ON card
|
|
20
|
+
FOR EACH ROW
|
|
21
|
+
BEGIN
|
|
22
|
+
SELECT RAISE(ABORT, 'Card with this hash already exists')
|
|
23
|
+
WHERE EXISTS (SELECT 1 FROM card WHERE hash = NEW.hash);
|
|
24
|
+
END
|
|
25
|
+
`
|
|
26
|
+
};
|
|
27
|
+
var _default = exports.default = {
|
|
28
|
+
MCARD_TABLE_SCHEMA,
|
|
29
|
+
TRIGGERS
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=database_schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database_schemas.js","names":["MCARD_TABLE_SCHEMA","exports","TRIGGERS","ensureUnique","_default","default"],"sources":["../../src/models/database_schemas.js"],"sourcesContent":["// SQLite database schema definitions for mcards\n\nexport const MCARD_TABLE_SCHEMA = `\nCREATE TABLE IF NOT EXISTS card (\n hash TEXT PRIMARY KEY,\n g_time TEXT NOT NULL,\n content BLOB NOT NULL\n)\n`;\n\nexport const TRIGGERS = {\n ensureUnique: `\n CREATE TRIGGER IF NOT EXISTS ensure_unique_hash\n BEFORE INSERT ON card\n FOR EACH ROW\n BEGIN\n SELECT RAISE(ABORT, 'Card with this hash already exists')\n WHERE EXISTS (SELECT 1 FROM card WHERE hash = NEW.hash);\n END\n `\n};\n\nexport default {\n MCARD_TABLE_SCHEMA,\n TRIGGERS\n};\n"],"mappings":";;;;;;AAAA;;AAEO,MAAMA,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG;AAClC;AACA;AACA;AACA;AACA;AACA,CAAC;AAEM,MAAME,QAAQ,GAAAD,OAAA,CAAAC,QAAA,GAAG;EACtBC,YAAY,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAAC,IAAAC,QAAA,GAAAH,OAAA,CAAAI,OAAA,GAEa;EACbL,kBAAkB;EAClBE;AACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.Logger = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Simple logging service with configurable log levels
|
|
9
|
+
*/
|
|
10
|
+
class Logger {
|
|
11
|
+
/**
|
|
12
|
+
* Create a new logger instance
|
|
13
|
+
* @param {string} [level='info'] - Logging level
|
|
14
|
+
*/
|
|
15
|
+
constructor(level = 'info') {
|
|
16
|
+
this.level = level.toLowerCase();
|
|
17
|
+
this.levels = ['error', 'warn', 'info', 'debug'];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check if a log level is enabled
|
|
22
|
+
* @param {string} level - Log level to check
|
|
23
|
+
* @returns {boolean} Whether the log level is enabled
|
|
24
|
+
*/
|
|
25
|
+
isLevelEnabled(level) {
|
|
26
|
+
const currentLevelIndex = this.levels.indexOf(this.level);
|
|
27
|
+
const checkLevelIndex = this.levels.indexOf(level);
|
|
28
|
+
return checkLevelIndex <= currentLevelIndex;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Log an error message
|
|
33
|
+
* @param {string} message - Message to log
|
|
34
|
+
* @param {Object} [metadata] - Optional metadata
|
|
35
|
+
*/
|
|
36
|
+
error(message, metadata = {}) {
|
|
37
|
+
if (this.isLevelEnabled('error')) {
|
|
38
|
+
console.error(`[ERROR] ${message}`, metadata);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Log a warning message
|
|
44
|
+
* @param {string} message - Message to log
|
|
45
|
+
* @param {Object} [metadata] - Optional metadata
|
|
46
|
+
*/
|
|
47
|
+
warn(message, metadata = {}) {
|
|
48
|
+
if (this.isLevelEnabled('warn')) {
|
|
49
|
+
console.warn(`[WARN] ${message}`, metadata);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Log an info message
|
|
55
|
+
* @param {string} message - Message to log
|
|
56
|
+
* @param {Object} [metadata] - Optional metadata
|
|
57
|
+
*/
|
|
58
|
+
info(message, metadata = {}) {
|
|
59
|
+
if (this.isLevelEnabled('info')) {
|
|
60
|
+
console.log(`[INFO] ${message}`, metadata);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Log a debug message
|
|
66
|
+
* @param {string} message - Message to log
|
|
67
|
+
* @param {Object} [metadata] - Optional metadata
|
|
68
|
+
*/
|
|
69
|
+
debug(message, metadata = {}) {
|
|
70
|
+
if (this.isLevelEnabled('debug')) {
|
|
71
|
+
console.debug(`[DEBUG] ${message}`, metadata);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Create a default logger instance using environment variable
|
|
77
|
+
exports.Logger = Logger;
|
|
78
|
+
const logger = new Logger(process.env.LOG_LEVEL || 'info');
|
|
79
|
+
var _default = exports.default = logger;
|
|
80
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","names":["Logger","constructor","level","toLowerCase","levels","isLevelEnabled","currentLevelIndex","indexOf","checkLevelIndex","error","message","metadata","console","warn","info","log","debug","exports","logger","process","env","LOG_LEVEL","_default","default"],"sources":["../../src/services/logger.js"],"sourcesContent":["/**\n * Simple logging service with configurable log levels\n */\nclass Logger {\n /**\n * Create a new logger instance\n * @param {string} [level='info'] - Logging level\n */\n constructor(level = 'info') {\n this.level = level.toLowerCase();\n this.levels = ['error', 'warn', 'info', 'debug'];\n }\n\n /**\n * Check if a log level is enabled\n * @param {string} level - Log level to check\n * @returns {boolean} Whether the log level is enabled\n */\n isLevelEnabled(level) {\n const currentLevelIndex = this.levels.indexOf(this.level);\n const checkLevelIndex = this.levels.indexOf(level);\n return checkLevelIndex <= currentLevelIndex;\n }\n\n /**\n * Log an error message\n * @param {string} message - Message to log\n * @param {Object} [metadata] - Optional metadata\n */\n error(message, metadata = {}) {\n if (this.isLevelEnabled('error')) {\n console.error(`[ERROR] ${message}`, metadata);\n }\n }\n\n /**\n * Log a warning message\n * @param {string} message - Message to log\n * @param {Object} [metadata] - Optional metadata\n */\n warn(message, metadata = {}) {\n if (this.isLevelEnabled('warn')) {\n console.warn(`[WARN] ${message}`, metadata);\n }\n }\n\n /**\n * Log an info message\n * @param {string} message - Message to log\n * @param {Object} [metadata] - Optional metadata\n */\n info(message, metadata = {}) {\n if (this.isLevelEnabled('info')) {\n console.log(`[INFO] ${message}`, metadata);\n }\n }\n\n /**\n * Log a debug message\n * @param {string} message - Message to log\n * @param {Object} [metadata] - Optional metadata\n */\n debug(message, metadata = {}) {\n if (this.isLevelEnabled('debug')) {\n console.debug(`[DEBUG] ${message}`, metadata);\n }\n }\n}\n\n// Create a default logger instance using environment variable\nconst logger = new Logger(process.env.LOG_LEVEL || 'info');\n\nexport default logger;\nexport { Logger };\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA,MAAMA,MAAM,CAAC;EACX;AACF;AACA;AACA;EACEC,WAAWA,CAACC,KAAK,GAAG,MAAM,EAAE;IAC1B,IAAI,CAACA,KAAK,GAAGA,KAAK,CAACC,WAAW,CAAC,CAAC;IAChC,IAAI,CAACC,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;EAClD;;EAEA;AACF;AACA;AACA;AACA;EACEC,cAAcA,CAACH,KAAK,EAAE;IACpB,MAAMI,iBAAiB,GAAG,IAAI,CAACF,MAAM,CAACG,OAAO,CAAC,IAAI,CAACL,KAAK,CAAC;IACzD,MAAMM,eAAe,GAAG,IAAI,CAACJ,MAAM,CAACG,OAAO,CAACL,KAAK,CAAC;IAClD,OAAOM,eAAe,IAAIF,iBAAiB;EAC7C;;EAEA;AACF;AACA;AACA;AACA;EACEG,KAAKA,CAACC,OAAO,EAAEC,QAAQ,GAAG,CAAC,CAAC,EAAE;IAC5B,IAAI,IAAI,CAACN,cAAc,CAAC,OAAO,CAAC,EAAE;MAChCO,OAAO,CAACH,KAAK,CAAC,WAAWC,OAAO,EAAE,EAAEC,QAAQ,CAAC;IAC/C;EACF;;EAEA;AACF;AACA;AACA;AACA;EACEE,IAAIA,CAACH,OAAO,EAAEC,QAAQ,GAAG,CAAC,CAAC,EAAE;IAC3B,IAAI,IAAI,CAACN,cAAc,CAAC,MAAM,CAAC,EAAE;MAC/BO,OAAO,CAACC,IAAI,CAAC,UAAUH,OAAO,EAAE,EAAEC,QAAQ,CAAC;IAC7C;EACF;;EAEA;AACF;AACA;AACA;AACA;EACEG,IAAIA,CAACJ,OAAO,EAAEC,QAAQ,GAAG,CAAC,CAAC,EAAE;IAC3B,IAAI,IAAI,CAACN,cAAc,CAAC,MAAM,CAAC,EAAE;MAC/BO,OAAO,CAACG,GAAG,CAAC,UAAUL,OAAO,EAAE,EAAEC,QAAQ,CAAC;IAC5C;EACF;;EAEA;AACF;AACA;AACA;AACA;EACEK,KAAKA,CAACN,OAAO,EAAEC,QAAQ,GAAG,CAAC,CAAC,EAAE;IAC5B,IAAI,IAAI,CAACN,cAAc,CAAC,OAAO,CAAC,EAAE;MAChCO,OAAO,CAACI,KAAK,CAAC,WAAWN,OAAO,EAAE,EAAEC,QAAQ,CAAC;IAC/C;EACF;AACF;;AAEA;AAAAM,OAAA,CAAAjB,MAAA,GAAAA,MAAA;AACA,MAAMkB,MAAM,GAAG,IAAIlB,MAAM,CAACmB,OAAO,CAACC,GAAG,CAACC,SAAS,IAAI,MAAM,CAAC;AAAC,IAAAC,QAAA,GAAAL,OAAA,CAAAM,OAAA,GAE5CL,MAAM","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
// Service for MCard storage operations
|
|
8
|
+
class McardStorageService {
|
|
9
|
+
constructor(engine) {
|
|
10
|
+
this.engine = engine;
|
|
11
|
+
}
|
|
12
|
+
async saveMcards(mcards) {
|
|
13
|
+
if (!this.engine) {
|
|
14
|
+
throw new Error('Storage engine not initialized');
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
return await this.engine.saveMcards(mcards);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.error('Error saving mcards:', error);
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async loadMcards() {
|
|
24
|
+
if (!this.engine) {
|
|
25
|
+
throw new Error('Storage engine not initialized');
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return await this.engine.loadMcards();
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error('Error loading mcards:', error);
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
var _default = exports.default = McardStorageService;
|
|
36
|
+
//# sourceMappingURL=mcardStorageService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcardStorageService.js","names":["McardStorageService","constructor","engine","saveMcards","mcards","Error","error","console","loadMcards","_default","exports","default"],"sources":["../../src/services/mcardStorageService.js"],"sourcesContent":["// Service for MCard storage operations\nclass McardStorageService {\n constructor(engine) {\n this.engine = engine;\n }\n \n async saveMcards(mcards) {\n if (!this.engine) {\n throw new Error('Storage engine not initialized');\n }\n \n try {\n return await this.engine.saveMcards(mcards);\n } catch (error) {\n console.error('Error saving mcards:', error);\n throw error;\n }\n }\n \n async loadMcards() {\n if (!this.engine) {\n throw new Error('Storage engine not initialized');\n }\n \n try {\n return await this.engine.loadMcards();\n } catch (error) {\n console.error('Error loading mcards:', error);\n throw error;\n }\n }\n}\n\nexport default McardStorageService;\n"],"mappings":";;;;;;AAAA;AACA,MAAMA,mBAAmB,CAAC;EACxBC,WAAWA,CAACC,MAAM,EAAE;IAClB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACtB;EAEA,MAAMC,UAAUA,CAACC,MAAM,EAAE;IACvB,IAAI,CAAC,IAAI,CAACF,MAAM,EAAE;MAChB,MAAM,IAAIG,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEA,IAAI;MACF,OAAO,MAAM,IAAI,CAACH,MAAM,CAACC,UAAU,CAACC,MAAM,CAAC;IAC7C,CAAC,CAAC,OAAOE,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,sBAAsB,EAAEA,KAAK,CAAC;MAC5C,MAAMA,KAAK;IACb;EACF;EAEA,MAAME,UAAUA,CAAA,EAAG;IACjB,IAAI,CAAC,IAAI,CAACN,MAAM,EAAE;MAChB,MAAM,IAAIG,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEA,IAAI;MACF,OAAO,MAAM,IAAI,CAACH,MAAM,CAACM,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,OAAOF,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,uBAAuB,EAAEA,KAAK,CAAC;MAC7C,MAAMA,KAAK;IACb;EACF;AACF;AAAC,IAAAG,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEcX,mBAAmB","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getActionText = exports.formatTimestamp = void 0;
|
|
7
|
+
const formatTimestamp = timestamp => {
|
|
8
|
+
const date = new Date(timestamp);
|
|
9
|
+
return date.toLocaleTimeString();
|
|
10
|
+
};
|
|
11
|
+
exports.formatTimestamp = formatTimestamp;
|
|
12
|
+
const getActionText = action => {
|
|
13
|
+
switch (action.type) {
|
|
14
|
+
case 'ADD':
|
|
15
|
+
return `Added item: "${action.content}"`;
|
|
16
|
+
case 'REMOVE':
|
|
17
|
+
return `Removed item: "${action.content}"`;
|
|
18
|
+
case 'SELECT':
|
|
19
|
+
return `Selected item: "${action.content}"`;
|
|
20
|
+
default:
|
|
21
|
+
return `Unknown action on: "${action.content}"`;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
exports.getActionText = getActionText;
|
|
25
|
+
//# sourceMappingURL=actionHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionHelpers.js","names":["formatTimestamp","timestamp","date","Date","toLocaleTimeString","exports","getActionText","action","type","content"],"sources":["../../src/utils/actionHelpers.js"],"sourcesContent":["export const formatTimestamp = (timestamp) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString();\n};\n\nexport const getActionText = (action) => {\n switch (action.type) {\n case 'ADD': return `Added item: \"${action.content}\"`;\n case 'REMOVE': return `Removed item: \"${action.content}\"`;\n case 'SELECT': return `Selected item: \"${action.content}\"`;\n default: return `Unknown action on: \"${action.content}\"`;\n }\n};\n"],"mappings":";;;;;;AAAO,MAAMA,eAAe,GAAIC,SAAS,IAAK;EAC5C,MAAMC,IAAI,GAAG,IAAIC,IAAI,CAACF,SAAS,CAAC;EAChC,OAAOC,IAAI,CAACE,kBAAkB,CAAC,CAAC;AAClC,CAAC;AAACC,OAAA,CAAAL,eAAA,GAAAA,eAAA;AAEK,MAAMM,aAAa,GAAIC,MAAM,IAAK;EACvC,QAAQA,MAAM,CAACC,IAAI;IACjB,KAAK,KAAK;MAAE,OAAO,gBAAgBD,MAAM,CAACE,OAAO,GAAG;IACpD,KAAK,QAAQ;MAAE,OAAO,kBAAkBF,MAAM,CAACE,OAAO,GAAG;IACzD,KAAK,QAAQ;MAAE,OAAO,mBAAmBF,MAAM,CAACE,OAAO,GAAG;IAC1D;MAAS,OAAO,uBAAuBF,MAAM,CAACE,OAAO,GAAG;EAC1D;AACF,CAAC;AAACJ,OAAA,CAAAC,aAAA,GAAAA,aAAA","ignoreList":[]}
|