diff --git a/docs/__tests__/critical-features.test.js b/docs/__tests__/critical-features.test.js index da24e77..ffa18c3 100644 --- a/docs/__tests__/critical-features.test.js +++ b/docs/__tests__/critical-features.test.js @@ -75,7 +75,12 @@ const Analytics = { const ErrorHandler = { handle(error, context = 'Unknown') { console.error(`[${context}]`, error); - Analytics.track('Error', context, error.message); + try { + Analytics.track('Error', context, error.message); + } catch (trackingError) { + // Ignore tracking errors to prevent infinite loops + console.warn('Failed to track error in analytics:', trackingError.message); + } return null; }, @@ -338,11 +343,23 @@ describe('Input Validation & Sanitization', () => { }); describe('Error Handling', () => { + let originalSetItem; + + beforeEach(() => { + // Save the original implementation before each test + originalSetItem = global.localStorage.setItem; + }); + + afterEach(() => { + // Restore after each test + if (originalSetItem) { + global.localStorage.setItem = originalSetItem; + } + }); test('should handle database errors gracefully', () => { // Simulate localStorage failure - const originalSetItem = Storage.prototype.setItem; - Storage.prototype.setItem = () => { + global.localStorage.setItem = () => { throw new Error('QuotaExceededError'); }; @@ -351,9 +368,6 @@ describe('Error Handling', () => { localStorage.setItem('test', 'data'); }, 'Database')(); }).not.toThrow(); - - // Restore - Storage.prototype.setItem = originalSetItem; }); test('should track errors in analytics', () => { diff --git a/medication-tracker.js b/medication-tracker.js index 3c24967..28b5d38 100644 --- a/medication-tracker.js +++ b/medication-tracker.js @@ -8,10 +8,28 @@ const EnhancedMedicationManager = require('./enhanced-medication-manager'); const MedicationValidator = require('./medication-validator'); // Pregnancy Safety Integration - Import as modules, not classes -const PregnancySafetyEngine = require('bumpie-meds/src/services/pregnancy-safety-engine'); -const PregnancyInteractionChecker = require('bumpie-meds/src/services/pregnancy-interaction-checker'); -const PregnancyRiskCalculator = require('bumpie-meds/src/services/pregnancy-risk-calculator'); -const PregnancyAuditLogger = require('bumpie-meds/src/services/pregnancy-audit-logger'); +// These modules are optional dependencies +let PregnancySafetyEngine = null; +let PregnancyInteractionChecker = null; +let PregnancyRiskCalculator = null; +let PregnancyAuditLogger = null; + +try { + PregnancySafetyEngine = require('bumpie-meds/src/services/pregnancy-safety-engine'); + PregnancyInteractionChecker = require('bumpie-meds/src/services/pregnancy-interaction-checker'); + PregnancyRiskCalculator = require('bumpie-meds/src/services/pregnancy-risk-calculator'); + PregnancyAuditLogger = require('bumpie-meds/src/services/pregnancy-audit-logger'); +} catch (error) { + // Only suppress MODULE_NOT_FOUND errors; re-throw other errors like syntax errors + if (error.code === 'MODULE_NOT_FOUND') { + console.warn('⚠️ Warning: bumpie-meds pregnancy safety modules not available.'); + console.warn(' Pregnancy safety features will be disabled.'); + console.warn(' To enable these features, install the bumpie-meds package.'); + } else { + // Re-throw non-module-not-found errors (e.g., syntax errors in the module) + throw error; + } +} class MedicationTracker { constructor(dataFile = 'medications.json') { @@ -732,13 +750,24 @@ class MedicationTracker { */ async checkPregnancySafety(medicationName, weekOfPregnancy, options = {}) { try { + // Check if pregnancy safety modules are available + if (!this.pregnancySafety) { + console.warn('⚠️ Pregnancy safety check unavailable - modules not loaded'); + return { + safe: false, + error: 'Pregnancy safety modules not available', + recommendation: 'Unable to assess safety - consult healthcare provider immediately', + warning: 'The bumpie-meds package is required for pregnancy safety checks' + }; + } + const safetyResult = await this.pregnancySafety.checkMedicationSafety( medicationName, weekOfPregnancy ); // Check for pregnancy-specific interactions if taking other medications - if (this.data.medications && this.data.medications.length > 0) { + if (this.pregnancyInteractions && this.data.medications && this.data.medications.length > 0) { const currentMeds = this.data.medications .filter(m => m.active) .map(m => m.name); @@ -756,7 +785,7 @@ class MedicationTracker { } // Log to audit trail - if (options.patientId) { + if (this.pregnancyAudit && options.patientId) { await this.pregnancyAudit.logSafetyCheck({ patientId: options.patientId, medicationName, diff --git a/package-lock.json b/package-lock.json index 741815e..e3837a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1781,7 +1780,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754",