{"_id":"@arcmantle/injector","_rev":"5-bec647b1b99f660d2ab9dc8a1df5b2b9","name":"@arcmantle/injector","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"@arcmantle/injector","version":"1.0.0","license":"Apache-2.0","_id":"@arcmantle/injector@1.0.0","maintainers":[{"name":"roenlie","email":"kristofferroenlie@gmail.com"}],"contributors":[{"name":"Kristoffer Roen-Lie"}],"dist":{"shasum":"931f971402ab2e2d7b27a4d156b080a630c7f6df","tarball":"https://registry.npmjs.org/@arcmantle/injector/-/injector-1.0.0.tgz","fileCount":14,"integrity":"sha512-kyqyL234b7EAO8+3DctkZbPa2tp+iy2vkcNsMt25gGlE5SooEWA4XzoX/NbbImjWyoN44cSKBGCD827btZdKWQ==","signatures":[{"sig":"MEQCIESsqdtV0yg+ysmuAlkPMdcHebWorz6K2kg2N2NmURQbAiAvfC13QvJLJta/vHmzy+lL91IuQkSzJf7Z6jwvunHOOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96751},"main":"./dist/index.js","type":"module","_from":"file:arcmantle-injector-1.0.0.tgz","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"scripts":{"build":"rimraf dist && tsc --project ./src/tsconfig.json"},"_npmUser":{"name":"roenlie","actor":{"name":"roenlie","type":"user","email":"kristofferroenlie@gmail.com"},"email":"kristofferroenlie@gmail.com"},"_resolved":"/tmp/ee696602626e2aa401b1c0adfce4b832/arcmantle-injector-1.0.0.tgz","_integrity":"sha512-kyqyL234b7EAO8+3DctkZbPa2tp+iy2vkcNsMt25gGlE5SooEWA4XzoX/NbbImjWyoN44cSKBGCD827btZdKWQ==","_npmVersion":"11.4.2","description":"Dependency injection done simple.","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.8.3","@types/node":"^24.0.10","@arcmantle/tsconfig":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/injector_1.0.0_1751579567069_0.05560184856725159","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@arcmantle/injector","version":"1.0.1","license":"Apache-2.0","_id":"@arcmantle/injector@1.0.1","maintainers":[{"name":"roenlie","email":"kristofferroenlie@gmail.com"}],"contributors":[{"name":"Kristoffer Roen-Lie"}],"dist":{"shasum":"be4a3af2edbece6496c9a4ce5e28bdf69e330f91","tarball":"https://registry.npmjs.org/@arcmantle/injector/-/injector-1.0.1.tgz","fileCount":14,"integrity":"sha512-tiBkDXtHfNvQTvArZJEm122Uf75yuIWbHHYhCZcGfFMVJDb0W5z0NzrF6RDrl69phgFaeN3B4bOYcCcDtZQ1Kw==","signatures":[{"sig":"MEQCIBMQT4mhQE9FlHZOdkOrNDvWN2OI1leGnMwPlUePCAOTAiBQtwiWQF53bLLzPk5hBQBQEveDmvdoF824off2vPKIyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96749},"main":"./dist/index.js","type":"module","_from":"file:arcmantle-injector-1.0.1.tgz","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"scripts":{"build":"rimraf dist && tsc --project ./src/tsconfig.json"},"_npmUser":{"name":"roenlie","actor":{"name":"roenlie","type":"user","email":"kristofferroenlie@gmail.com"},"email":"kristofferroenlie@gmail.com"},"_resolved":"/tmp/9151b1e0371de529932945075f98a393/arcmantle-injector-1.0.1.tgz","_integrity":"sha512-tiBkDXtHfNvQTvArZJEm122Uf75yuIWbHHYhCZcGfFMVJDb0W5z0NzrF6RDrl69phgFaeN3B4bOYcCcDtZQ1Kw==","_npmVersion":"11.4.2","description":"Dependency injection done simple.","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.8.3","@types/node":"^24.0.10","@arcmantle/tsconfig":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/injector_1.0.1_1751755244620_0.5759862980667605","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@arcmantle/injector","version":"1.0.2","author":{"name":"Kristoffer Roen-Lie"},"license":"Apache-2.0","_id":"@arcmantle/injector@1.0.2","maintainers":[{"name":"roenlie","email":"kristofferroenlie@gmail.com"}],"dist":{"shasum":"f2da6b973c2047692f5fe829a486454c12ce81ec","tarball":"https://registry.npmjs.org/@arcmantle/injector/-/injector-1.0.2.tgz","fileCount":14,"integrity":"sha512-+PIa6OG7FHU9Vs/H2wdb7Y/TPMUnHVYTBYUzx0jHGbTaCfPbNT0+kBc7m5OHXdJPGi/yiHkkzd9WTlRhn1J3Zg==","signatures":[{"sig":"MEUCIEu02q8e8vj+G3uyZfz25X87yNR/1qDM4VsRLvqXiHpFAiEA5fQv/DRcXjacjYxV2XXO8gmueAqBxwt1cuUY7ifBr4g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96733},"main":"./dist/index.js","type":"module","_from":"file:arcmantle-injector-1.0.2.tgz","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"scripts":{"build":"rimraf dist && tsc --project ./src/tsconfig.json"},"_npmUser":{"name":"roenlie","email":"kristofferroenlie@gmail.com"},"_resolved":"/tmp/7c1342a2cf504af3857c2af7375d4fb7/arcmantle-injector-1.0.2.tgz","_integrity":"sha512-+PIa6OG7FHU9Vs/H2wdb7Y/TPMUnHVYTBYUzx0jHGbTaCfPbNT0+kBc7m5OHXdJPGi/yiHkkzd9WTlRhn1J3Zg==","_npmVersion":"11.4.2","description":"Dependency injection done simple.","directories":{},"sideEffects":false,"_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.8.3","@types/node":"^24.0.14","@arcmantle/tsconfig":"^1.0.5"},"_npmOperationalInternal":{"tmp":"tmp/injector_1.0.2_1752757863343_0.4568650330298867","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@arcmantle/injector","version":"1.0.3","author":{"name":"Kristoffer Roen-Lie"},"license":"Apache-2.0","_id":"@arcmantle/injector@1.0.3","maintainers":[{"name":"roenlie","email":"kristofferroenlie@gmail.com"}],"homepage":"https://github.com/arcmantle/injector#readme","bugs":{"url":"https://github.com/arcmantle/injector/issues"},"dist":{"shasum":"58292dcefa5a9b1ad40d7e92c7beb886516741ed","tarball":"https://registry.npmjs.org/@arcmantle/injector/-/injector-1.0.3.tgz","fileCount":14,"integrity":"sha512-xX1MttI+A+PtEBKwSW0hjtKF/ZoB8ojHLa9YTMqZWfiROAAqPwq+m76lQg8Ia55/ptZktusEU4P0rQOJsD4VOQ==","signatures":[{"sig":"MEYCIQCBLz/51JPHL4yBFMyZQ9wNwUN5uuHQrIdbEoopSvaSxQIhALWpfaFsZcXJMQYx1rklvTCmHSliQQEtzurGpTv52qk2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96830},"main":"./dist/index.js","type":"module","_from":"file:arcmantle-injector-1.0.3.tgz","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"scripts":{"build":"rimraf dist && tsc --project ./src/tsconfig.json"},"_npmUser":{"name":"roenlie","email":"kristofferroenlie@gmail.com"},"_resolved":"/tmp/5b30e992f0bb5ff4504414d3261e41c7/arcmantle-injector-1.0.3.tgz","_integrity":"sha512-xX1MttI+A+PtEBKwSW0hjtKF/ZoB8ojHLa9YTMqZWfiROAAqPwq+m76lQg8Ia55/ptZktusEU4P0rQOJsD4VOQ==","repository":{"url":"git+https://github.com/arcmantle/injector.git","type":"git"},"_npmVersion":"11.4.2","description":"Dependency injection done simple.","directories":{},"sideEffects":false,"_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","typescript":"^5.8.3","@types/node":"^24.0.14","@arcmantle/tsconfig":"^1.0.6"},"_npmOperationalInternal":{"tmp":"tmp/injector_1.0.3_1752781600643_0.6527712087351352","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@arcmantle/injector","version":"1.0.4","description":"Dependency injection done simple.","repository":{"type":"git","url":"git+https://github.com/arcmantle/injector.git"},"license":"Apache-2.0","author":{"name":"Kristoffer Roen-Lie"},"sideEffects":false,"type":"module","exports":{".":"./dist/index.js"},"main":"./dist/index.js","types":"./dist/index.d.ts","devDependencies":{"@arcmantle/tsconfig":"^1.0.8","@types/node":"^24.0.14","rimraf":"^6.0.1","typescript":"^5.8.3"},"scripts":{"build":"rimraf dist && tsc --project ./src/tsconfig.json"},"_id":"@arcmantle/injector@1.0.4","bugs":{"url":"https://github.com/arcmantle/injector/issues"},"homepage":"https://github.com/arcmantle/injector#readme","_integrity":"sha512-UWHdq7PLphcEyg2LJ7SDAuvXYoOU5JOTt05QIgxL32/jDv9yR2S9/nwMt1FK4ej5u/5nGHrk8PovXgKdVYSAWw==","_resolved":"/tmp/a73d9970c96cc6bbaddacf5872f19acd/arcmantle-injector-1.0.4.tgz","_from":"file:arcmantle-injector-1.0.4.tgz","_nodeVersion":"24.4.1","_npmVersion":"11.4.2","dist":{"integrity":"sha512-UWHdq7PLphcEyg2LJ7SDAuvXYoOU5JOTt05QIgxL32/jDv9yR2S9/nwMt1FK4ej5u/5nGHrk8PovXgKdVYSAWw==","shasum":"9b64978c100cb54478304c5b0355e49715042a0c","tarball":"https://registry.npmjs.org/@arcmantle/injector/-/injector-1.0.4.tgz","fileCount":14,"unpackedSize":96830,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCIthFkFm4SkdRvdKqTveQ1TftT7puCgEKSIp+1lMt4dgIgQNKZrtrHtk4Hq/YwQpf9HhzZaG4hsTI8hMpjVLG+fuA="}]},"_npmUser":{"name":"roenlie","email":"kristofferroenlie@gmail.com"},"directories":{},"maintainers":[{"name":"roenlie","email":"kristofferroenlie@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/injector_1.0.4_1752791556911_0.6904795938160075"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-03T21:52:46.943Z","modified":"2025-07-17T22:32:37.373Z","1.0.0":"2025-07-03T21:52:47.258Z","1.0.1":"2025-07-05T22:40:44.812Z","1.0.2":"2025-07-17T13:11:03.574Z","1.0.3":"2025-07-17T19:46:40.862Z","1.0.4":"2025-07-17T22:32:37.120Z"},"bugs":{"url":"https://github.com/arcmantle/injector/issues"},"author":{"name":"Kristoffer Roen-Lie"},"license":"Apache-2.0","homepage":"https://github.com/arcmantle/injector#readme","repository":{"type":"git","url":"git+https://github.com/arcmantle/injector.git"},"description":"Dependency injection done simple.","maintainers":[{"name":"roenlie","email":"kristofferroenlie@gmail.com"}],"readme":"# @arcmantle/injector\n\nDependency injection done simple.\n\nA lightweight, type-safe dependency injection container for TypeScript/JavaScript applications with support for multiple binding types, lifetimes, and hierarchical containers.\n\n## Features\n\n- 🎯 **Simple API** - Intuitive fluent interface for binding and resolving dependencies\n- 🔧 **Multiple Binding Types** - Support for classes, factories, and constants\n- ⏱️ **Lifetime Management** - Singleton and transient lifetimes\n- 🏷️ **Named & Tagged Bindings** - Additional granularity for complex scenarios\n- 🌳 **Hierarchical Containers** - Parent-child container relationships\n- 📦 **Module System** - Organize related bindings into loadable modules\n- 💫 **Activation Hooks** - Post-creation instance processing\n- 🔍 **TypeScript First** - Full type safety and IntelliSense support\n\n## Installation\n\n```bash\nnpm install @arcmantle/injector\n# or\npnpm add @arcmantle/injector\n# or\nyarn add @arcmantle/injector\n```\n\n## Basic Usage\n\n### Creating a Container\n\n```typescript\nimport { PluginContainer } from '@arcmantle/injector';\n\nconst container = new PluginContainer();\n```\n\n### Binding Values\n\n#### Constants\n\n```typescript\n// Bind a constant value\ncontainer.bind('API_URL').constant('https://api.example.com');\ncontainer.bind('config').constant({ timeout: 5000, retries: 3 });\n```\n\n#### Classes\n\n```typescript\nclass DatabaseService {\n  constructor(private container: PluginContainer) {}\n}\n\nclass UserService {\n  constructor(private container: PluginContainer) {\n    this.db = container.get('database');\n  }\n}\n\n// Bind classes (singleton by default)\ncontainer.bind('database').class(DatabaseService).singleton();\ncontainer.bind('users').class(UserService).transient();\n```\n\n#### Factories\n\n```typescript\n// Bind a factory function\ncontainer.bind('logger').factory(container => {\n  const config = container.get('config');\n  return new Logger(config.logLevel);\n}).singleton();\n```\n\n### Resolving Dependencies\n\n```typescript\n// Get a single instance\nconst config = container.get('config');\nconst userService = container.get<UserService>('users');\n\n// Try to get (returns undefined if not bound)\nconst optional = container.tryGet('optional-service');\n\n// Get all instances of a binding\nconst plugins = container.getAll('plugin');\n```\n\n## Advanced Features\n\n### Named Bindings\n\n```typescript\n// Bind multiple implementations with names\ncontainer.bind('database').class(PostgreSQLService).named('postgres');\ncontainer.bind('database').class(MongoDBService).named('mongo');\n\n// Resolve by name\nconst pgDb = container.getNamed('database', 'postgres');\nconst mongoDb = container.getNamed('database', 'mongo');\n```\n\n### Tagged Bindings\n\n```typescript\n// Bind with name and tag for extra specificity\ncontainer.bind('cache')\n  .class(RedisCache)\n  .tagged('redis', 'production');\n\ncontainer.bind('cache')\n  .class(MemoryCache)\n  .tagged('memory', 'development');\n\n// Resolve by name and tag\nconst prodCache = container.getTagged('cache', 'redis', 'production');\n```\n\n### Activation Hooks\n\n```typescript\ncontainer.bind('service')\n  .class(MyService)\n  .onActivation((instance, container) => {\n    // Perform additional setup\n    instance.initialize();\n    return instance;\n  })\n  .singleton();\n```\n\n### Hierarchical Containers\n\n```typescript\nconst parentContainer = new PluginContainer();\nconst childContainer = new PluginContainer({ parent: parentContainer });\n\n// Child containers inherit parent bindings\nparentContainer.bind('shared').constant('parent-value');\nconsole.log(childContainer.get('shared')); // 'parent-value'\n\n// Child bindings override parent bindings\nchildContainer.bind('shared').constant('child-value');\nconsole.log(childContainer.get('shared')); // 'child-value'\n```\n\n### Module System\n\n```typescript\nimport { PluginModule } from '@arcmantle/injector';\n\n// Create a module\nconst databaseModule = new PluginModule(({ bind, bindOnce, rebind }) => {\n  bind('connection').factory(container => {\n    const config = container.get('db-config');\n    return new Connection(config);\n  }).singleton();\n\n  bind('repository').class(UserRepository).transient();\n});\n\n// Load the module\ncontainer.load(databaseModule);\n\n// Unload when needed\ncontainer.unload(databaseModule);\n```\n\n## Binding Methods\n\n### `bind(identifier)`\n\nCreates a new binding, potentially overriding existing ones.\n\n### `bindOnce(identifier)`\n\nOnly binds if the identifier doesn't already exist. Returns `undefined` if already bound.\n\n### `rebind(identifier)`\n\nRemoves existing bindings for the identifier and creates a new one.\n\n## Resolution Methods\n\n| Method | Description |\n|--------|-------------|\n| `get(id)` | Get single instance (throws if not found) |\n| `tryGet(id)` | Get single instance or undefined |\n| `getNamed(id, name)` | Get named instance |\n| `getTagged(id, name, tag)` | Get tagged instance |\n| `getAll(id)` | Get all instances as array |\n| `tryGetAll(id)` | Get all instances or empty array |\n| `getLast(id)` | Get the last registered instance |\n\n## Container Management\n\n```typescript\n// Check if bindings exist\ncontainer.has('service');          // In this container only\ncontainer.exists('service');       // In this container or parents\ncontainer.hasNamed('service', 'name');\ncontainer.existsNamed('service', 'name');\n\n// Remove bindings\ncontainer.unbind('service');       // Remove specific binding\ncontainer.unbindAll();             // Remove all bindings\n```\n\n## TypeScript Usage\n\nThe library is designed with TypeScript in mind:\n\n```typescript\ninterface IUserService {\n  getUser(id: string): User;\n}\n\nclass UserService implements IUserService {\n  getUser(id: string): User {\n    // implementation\n  }\n}\n\n// Type-safe binding and resolution\ncontainer.bind<IUserService>('users').class(UserService);\nconst userService = container.get<IUserService>('users');\n```\n\n## Configuration Options\n\n```typescript\nconst container = new PluginContainer({\n  defaultLifetime: 'transient',  // Default: 'singleton'\n  parent: parentContainer        // Optional parent container\n});\n```\n\n## Best Practices\n\n1. **Use Interfaces**: Bind to interfaces rather than concrete classes for better testability\n2. **Module Organization**: Group related bindings into modules\n3. **Singleton by Default**: Use singletons for stateless services, transients for stateful ones\n4. **Container Hierarchy**: Use parent containers for shared dependencies\n5. **Named Bindings**: Use named bindings for multiple implementations of the same interface\n\n## License\n\nApache-2.0 © Kristoffer Roen-Lie\n\n## Contributing\n\nThis package is part of the @arcmantle monorepo. Please refer to the main repository for contribution guidelines.\n","readmeFilename":"README.md"}