UNPKG

@quicore/resource-id

Version:

Deterministic and compact ID generation for API resources using pluggable hashing.

144 lines (90 loc) 3.35 kB
# @quicore/resource-id A lightweight, pluggable utility for generating compact, deterministic, and integration-scoped resource identifiers using flexible components. Ideal for APIs, FHIR systems, and cross-service data referencing. --- ## ✨ Features - 🔐 Compact deterministic ID generation using Blake2b + Base62 - 🧩 Component-based customization (resourceType, resourceId, integrationId) - 📦 Works with any API data (not just FHIR) - ⚙️ Chainable and extensible class structure - 💾 MongoDB-friendly (22-character Base62 IDs by default) --- ## 📦 Installation ```bash npm install @quicore/resource-id ```` --- ## 🚀 Quick Start ```js import { ResourceIDGenerator } from '@quicore/resource-id'; const id = new ResourceIDGenerator() .setIntegrationId('my-app') .setResourceType('Invoice') .setResourceId('INV-12345') .generate(); console.log(id); // Compact, consistent ID (e.g., "004f83akdT3mJLhFtVNckT") ``` --- ## 🔄 Use Case While originally designed for [FHIR](https://hl7.org/fhir/) resources, `ResourceIDGenerator` is **generic** and can be used for any API data: * `resourceId` = the **unique identifier** of your data object * `resourceType` = the **type/category** of your object (`"User"`, `"Invoice"`, `"Post"`, etc.) * `integrationId` = a **scoping prefix** to prevent ID collisions across systems --- ## 📘 API Reference ### `class ResourceIDGenerator` Extends `IDGenerator` and is ready to use out of the box. #### `.setIntegrationId(id: string)` Sets a prefix to scope the generated ID by system/environment. #### `.setResourceType(type: string)` Sets the type/category of the data object (e.g., `'User'`, `'Appointment'`). #### `.setResourceId(id: string)` Sets the primary unique identifier (e.g., a database or API ID). #### `.setIdLength(length: number)` (Optional) Set the output ID length (minimum 10, default 22). #### `.generate() → string` Returns a compact, Base62-encoded ID derived from all components. --- ### `class IDGenerator` The base abstract class for deterministic ID generation. To extend: ```js class MyCustomGenerator extends IDGenerator { createCanonicalString() { return `${this.components.a}-${this.components.b}`; } validateComponents() { if (!this.components.a || !this.components.b) { throw new Error('Missing required components'); } } } ``` --- ## 🧬 Output Format Internally, IDs are created by hashing this structure: ``` <integrationId>::<resourceType>::<resourceId> ``` Then encoded into a compact **Base62** string using `blake2b`. --- ## 🔐 Why Deterministic IDs? * Guarantees the same input always gives the same ID * Useful for deduplication, data sync, upserts, or ID federation * Scope-aware via `integrationId` to prevent overlap --- ## 🔧 FHIR Support (Optional) For FHIR-specific use, the package includes: ### `class FHIRIDGenerator` ```js import { FHIRIDGenerator } from '@quicore/resource-id'; const resource = { id: 'abc123', resourceType: 'Patient' }; const id = new FHIRIDGenerator(resource) .setIntegrationId('epic') .generate(); console.log(id); // e.g., "A81dskf9e3rKW2ThjL9bc3" ``` --- ## 📄 License MIT