{"_id":"@dynamic-mock-server/alerts","name":"@dynamic-mock-server/alerts","dist-tags":{"latest":"0.1.0-beta"},"versions":{"0.1.0-beta":{"name":"@dynamic-mock-server/alerts","version":"0.1.0-beta","license":"Apache-2.0","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"devDependencies":{"@dynamic-mock-server/eslint-config":"0.1.0-beta","@dynamic-mock-server/typescript-config":"0.1.0-beta"},"dependencies":{"types-guards":"0.1.0","@dynamic-mock-server/mocks-manager":"0.1.0-beta"},"description":"Alerts system for Dynamic Mock Server — manage and serve alert mocks with namespaced collections","keywords":["mock","server","development","testing","api","http","alerts","notifications"],"author":{"name":"migudevelop"},"repository":{"type":"git","url":"git+https://github.com/migudevelop/dynamic-mock-server.git","directory":"packages/alerts"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup","dev":"tsup --watch","lint":"eslint src --ext .ts","check-types":"tsc --noEmit"},"_id":"@dynamic-mock-server/alerts@0.1.0-beta","bugs":{"url":"https://github.com/migudevelop/dynamic-mock-server/issues"},"homepage":"https://github.com/migudevelop/dynamic-mock-server#readme","_integrity":"sha512-3iJJvNjCQ/XaHHq0TmYIC+yPrwVWHRyDl/T71LkTvHabKcGKRFlGK2QMhcbOw7cksT8T6hYNzUs0/mbqa+XiGw==","_resolved":"C:\\Users\\Miguel\\AppData\\Local\\Temp\\6aef0a1bb20dd8f7337b0e26c07c8cd1\\dynamic-mock-server-alerts-0.1.0-beta.tgz","_from":"file:dynamic-mock-server-alerts-0.1.0-beta.tgz","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-3iJJvNjCQ/XaHHq0TmYIC+yPrwVWHRyDl/T71LkTvHabKcGKRFlGK2QMhcbOw7cksT8T6hYNzUs0/mbqa+XiGw==","shasum":"c8675c6160e5e908e156a40bfaea4738daecddab","tarball":"https://registry.npmjs.org/@dynamic-mock-server/alerts/-/alerts-0.1.0-beta.tgz","fileCount":9,"unpackedSize":35573,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFySltjeLTqxfs6FB90scAb72kfeACHDb/XWTzRC5mMhAiEAlo1eGqcVQ5RRlWdU3p87YPquAW0pYPt/I9jK8dZGD2U="}]},"_npmUser":{"name":"migudevelop","email":"migusarta@gmail.com"},"directories":{},"maintainers":[{"name":"migudevelop","email":"migusarta@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/alerts_0.1.0-beta_1779029413667_0.6695630267000392"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T14:50:13.456Z","0.1.0-beta":"2026-05-17T14:50:13.818Z","modified":"2026-05-17T14:50:14.068Z"},"maintainers":[{"name":"migudevelop","email":"migusarta@gmail.com"}],"description":"Alerts system for Dynamic Mock Server — manage and serve alert mocks with namespaced collections","homepage":"https://github.com/migudevelop/dynamic-mock-server#readme","keywords":["mock","server","development","testing","api","http","alerts","notifications"],"repository":{"type":"git","url":"git+https://github.com/migudevelop/dynamic-mock-server.git","directory":"packages/alerts"},"author":{"name":"migudevelop"},"bugs":{"url":"https://github.com/migudevelop/dynamic-mock-server/issues"},"license":"Apache-2.0","readme":"# @dynamic-mock-server/alerts\r\n\r\n> Structured alert management system with namespace support\r\n\r\nHierarchical alert system for organizing warnings, errors, and notifications. Built on NestedRoutesSuites from mocks-manager, providing powerful namespace organization and change notifications.\r\n\r\n## Features\r\n\r\n- 🗂️ **Hierarchical Organization**: Namespace alerts by module or context\r\n- 🔔 **Change Notifications**: Subscribe to alert updates with event listeners\r\n- 📝 **Structured Details**: Capture error stack traces and metadata\r\n- 🔍 **Flat Access**: Query all alerts across all namespaces\r\n- ⚡ **Fast Lookups**: Efficient get/set/has/remove operations\r\n- 🧹 **Easy Cleanup**: Remove individual alerts or clear entire collections\r\n\r\n## Installation\r\n\r\n```bash\r\npnpm add @dynamic-mock-server/alerts\r\n```\r\n\r\n## Quick Start\r\n\r\n### Basic Usage\r\n\r\n```typescript\r\nimport { Alerts } from \"@dynamic-mock-server/alerts\";\r\n\r\nconst alerts = new Alerts();\r\n\r\n// Set a simple alert\r\nalerts.set(\"config-warning\", \"Configuration file not found\");\r\n\r\n// Get an alert\r\nconst alert = alerts.get(\"config-warning\");\r\nconsole.log(alert); // { id: \"config-warning\", message: \"...\", error?: {...} }\r\n\r\n// Check if alert exists\r\nif (alerts.has(\"config-warning\")) {\r\n  console.log(\"Warning active\");\r\n}\r\n\r\n// Remove an alert\r\nalerts.remove(\"config-warning\");\r\n```\r\n\r\n### Alerts with Errors\r\n\r\n```typescript\r\nimport { Alerts } from \"@dynamic-mock-server/alerts\";\r\n\r\nconst alerts = new Alerts();\r\n\r\ntry {\r\n  throw new Error(\"Connection timeout\");\r\n} catch (error) {\r\n  alerts.set(\"db-error\", \"Failed to connect to database\", error);\r\n}\r\n\r\nconst alert = alerts.get(\"db-error\");\r\nconsole.log(alert);\r\n// {\r\n//   id: \"db-error\",\r\n//   message: \"Failed to connect to database\",\r\n//   error: {\r\n//     name: \"Error\",\r\n//     message: \"Connection timeout\",\r\n//     stack: \"Error: Connection timeout\\n  at ...\"\r\n//   }\r\n// }\r\n```\r\n\r\n### Namespaced Alerts\r\n\r\n```typescript\r\nimport { Alerts } from \"@dynamic-mock-server/alerts\";\r\n\r\nconst alerts = new Alerts();\r\n\r\n// Create namespaced alert collections\r\nconst routeAlerts = alerts.collection(\"routes\");\r\nconst pluginAlerts = alerts.collection(\"plugins\");\r\n\r\nrouteAlerts.set(\"not-found\", \"Route '/api/users' not found\");\r\npluginAlerts.set(\"load-error\", \"Failed to load plugin 'auth'\");\r\n\r\n// Get all alerts (across all namespaces)\r\nconst allAlerts = alerts.flat;\r\nconsole.log(allAlerts.length); // 2\r\n\r\n// Get alerts from specific namespace\r\nconst routeAlertsOnly = routeAlerts.values;\r\n```\r\n\r\n### Change Notifications\r\n\r\n```typescript\r\nimport { Alerts } from \"@dynamic-mock-server/alerts\";\r\n\r\nconst alerts = new Alerts();\r\n\r\n// Subscribe to changes\r\nconst unsubscribe = alerts.onChange((action, id, value) => {\r\n  console.log(`Alert ${action}: ${id}`);\r\n  // action: \"set\" | \"remove\" | \"clean\" | \"clear\"\r\n});\r\n\r\nalerts.set(\"warning-1\", \"Test warning\"); // Logs: \"Alert set: warning-1\"\r\nalerts.remove(\"warning-1\"); // Logs: \"Alert remove: warning-1\"\r\n\r\n// Unsubscribe when done\r\nunsubscribe();\r\n```\r\n\r\n## API Reference\r\n\r\n### Alerts Class\r\n\r\nExtends `NestedRoutesSuites` from mocks-manager with alert-specific functionality.\r\n\r\n#### Methods\r\n\r\n##### `set(id: string, message: string, error?: Error): void`\r\n\r\nSet an alert with optional error details.\r\n\r\n```typescript\r\nalerts.set(\"alert-1\", \"Something went wrong\");\r\nalerts.set(\"alert-2\", \"Database error\", new Error(\"Connection failed\"));\r\n```\r\n\r\n**Throws:**\r\n\r\n- Error if `id` is not a non-empty string\r\n- Error if `message` is not a non-empty string\r\n\r\n##### `get(id: string): Alert | undefined`\r\n\r\nGet an alert by ID.\r\n\r\n```typescript\r\nconst alert = alerts.get(\"alert-1\");\r\nif (alert) {\r\n  console.log(alert.message);\r\n}\r\n```\r\n\r\n##### `has(id: string): boolean`\r\n\r\nCheck if an alert exists.\r\n\r\n```typescript\r\nif (alerts.has(\"warning-1\")) {\r\n  console.log(\"Warning is active\");\r\n}\r\n```\r\n\r\n##### `remove(id: string): boolean`\r\n\r\nRemove an alert by ID. Returns `true` if removed, `false` if not found.\r\n\r\n```typescript\r\nconst removed = alerts.remove(\"alert-1\");\r\n```\r\n\r\n##### `clean(): void`\r\n\r\nClear all alerts in this collection (preserves child collections).\r\n\r\n```typescript\r\nalerts.clean();\r\n```\r\n\r\n##### `clear(): void`\r\n\r\nClear all alerts and child collections recursively.\r\n\r\n```typescript\r\nalerts.clear();\r\n```\r\n\r\n##### `collection(namespace: string): Alerts`\r\n\r\nGet or create a namespaced alert collection.\r\n\r\n```typescript\r\nconst fileAlerts = alerts.collection(\"files\");\r\nfileAlerts.set(\"not-found\", \"File missing\");\r\n```\r\n\r\n##### `onChange(listener: ChangeListener): UnsubscribeFunction`\r\n\r\nSubscribe to alert changes. Returns unsubscribe function.\r\n\r\n```typescript\r\nconst unsubscribe = alerts.onChange((action, id, value) => {\r\n  console.log(`Alert ${action}: ${id}`);\r\n});\r\n\r\n// Later...\r\nunsubscribe();\r\n```\r\n\r\n**ChangeListener signature:**\r\n\r\n```typescript\r\ntype ChangeListener = (\r\n  action: \"set\" | \"remove\" | \"clean\" | \"clear\",\r\n  id: string,\r\n  value?: unknown\r\n) => void;\r\n```\r\n\r\n#### Properties\r\n\r\n##### `flat: Alert[]`\r\n\r\nGet all alerts recursively from this collection and all child collections.\r\n\r\n```typescript\r\nconst allAlerts = alerts.flat;\r\nconsole.log(`Total alerts: ${allAlerts.length}`);\r\n```\r\n\r\n##### `values: Alert[]`\r\n\r\nGet alerts only from this collection (not including child collections).\r\n\r\n```typescript\r\nconst thisLevelAlerts = alerts.values;\r\n```\r\n\r\n##### `keys: string[]`\r\n\r\nGet all alert IDs in this collection.\r\n\r\n```typescript\r\nconst alertIds = alerts.keys;\r\n```\r\n\r\n##### `size: number`\r\n\r\nGet the number of alerts in this collection.\r\n\r\n```typescript\r\nconsole.log(`Alert count: ${alerts.size}`);\r\n```\r\n\r\n##### `childRoutesSuites: string[]`\r\n\r\nGet names of child alert collections.\r\n\r\n```typescript\r\nconst namespaces = alerts.childRoutesSuites;\r\nconsole.log(`Namespaces: ${namespaces.join(\", \")}`);\r\n```\r\n\r\n### Types\r\n\r\n#### Alert\r\n\r\n```typescript\r\ninterface Alert {\r\n  /** Unique alert identifier */\r\n  id: string;\r\n\r\n  /** Human-readable alert message */\r\n  message: string;\r\n\r\n  /** Optional error details */\r\n  error?: {\r\n    /** Error name */\r\n    name: string;\r\n\r\n    /** Error message */\r\n    message: string;\r\n\r\n    /** Error stack trace */\r\n    stack: string;\r\n  };\r\n}\r\n```\r\n\r\n## Examples\r\n\r\n### Module-Specific Alerts\r\n\r\n```typescript\r\nimport { Alerts } from \"@dynamic-mock-server/alerts\";\r\n\r\nconst alerts = new Alerts();\r\n\r\n// Organize by module\r\nconst serverAlerts = alerts.collection(\"server\");\r\nconst dbAlerts = alerts.collection(\"database\");\r\nconst cacheAlerts = alerts.collection(\"cache\");\r\n\r\nserverAlerts.set(\"port-in-use\", \"Port 3000 is already in use\");\r\ndbAlerts.set(\"connection-lost\", \"Lost connection to database\");\r\ncacheAlerts.set(\"eviction\", \"Cache nearing capacity\");\r\n\r\n// Get all alerts\r\nconsole.log(`Total system alerts: ${alerts.flat.length}`);\r\n```\r\n\r\n### Alert Dashboard\r\n\r\n```typescript\r\nimport { Alerts } from \"@dynamic-mock-server/alerts\";\r\n\r\nconst alerts = new Alerts();\r\n\r\nfunction displayAlerts() {\r\n  const allAlerts = alerts.flat;\r\n\r\n  if (allAlerts.length === 0) {\r\n    console.log(\"No alerts\");\r\n    return;\r\n  }\r\n\r\n  console.log(`\\n=== Active Alerts (${allAlerts.length}) ===`);\r\n\r\n  for (const alert of allAlerts) {\r\n    console.log(`[${alert.id}] ${alert.message}`);\r\n\r\n    if (alert.error) {\r\n      console.log(`  Error: ${alert.error.message}`);\r\n    }\r\n  }\r\n}\r\n\r\n// Subscribe to changes and update display\r\nalerts.onChange(() => {\r\n  displayAlerts();\r\n});\r\n\r\n// Trigger some alerts\r\nalerts.set(\"warn-1\", \"Low memory\");\r\nalerts.set(\"error-1\", \"API timeout\", new Error(\"Request timeout\"));\r\n```\r\n\r\n### Temporary Alerts\r\n\r\n```typescript\r\nimport { Alerts } from \"@dynamic-mock-server/alerts\";\r\n\r\nconst alerts = new Alerts();\r\n\r\n// Set temporary alert\r\nalerts.set(\"loading\", \"Loading configuration...\");\r\n\r\nsetTimeout(() => {\r\n  // Clear after operation completes\r\n  alerts.remove(\"loading\");\r\n}, 2000);\r\n```\r\n\r\n## Dependencies\r\n\r\n- `@dynamic-mock-server/mocks-manager` - Extends NestedRoutesSuites\r\n- `types-guards` - Type checking utilities\r\n\r\n## Related Packages\r\n\r\n- [@dynamic-mock-server/core](../core) - Uses alerts for system notifications\r\n- [@dynamic-mock-server/mocks-manager](../mocks-manager) - Uses alerts for file loading errors\r\n- [@dynamic-mock-server/logger](../logger) - Complementary logging system\r\n\r\n## License\r\n\r\nApache-2.0 © Miguel Martínez\r\n","readmeFilename":"README.md","_rev":"1-742de321d562a860d8fe6198295b6925"}