@resolid/di 0.4.0 → 0.5.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/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ type Resolver = {
9
9
  lazyResolve: LazyResolve;
10
10
  };
11
11
  type FactoryConfig = Record<string, unknown>;
12
- type BindingDefinition<T$1 = unknown, Config extends FactoryConfig = FactoryConfig> = {
12
+ type BindingDefinition<T$1 = unknown, C extends FactoryConfig = FactoryConfig> = {
13
13
  name: string;
14
14
  value: T$1;
15
15
  callable?: never;
@@ -27,10 +27,10 @@ type BindingDefinition<T$1 = unknown, Config extends FactoryConfig = FactoryConf
27
27
  name: string;
28
28
  factory: (options: {
29
29
  resolver: Resolver;
30
- config?: Config;
30
+ config?: C;
31
31
  }) => T$1 | Promise<T$1>;
32
32
  scope?: Scope;
33
- config?: Config;
33
+ config?: C;
34
34
  value?: never;
35
35
  callable?: never;
36
36
  };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{env as e}from"node:process";const t=e=>{let t=n(`__RESOLID_CONTAINER`,()=>{let t=new r;return t.register(e),t});return{resolve:e=>t.resolve(e),dispose:()=>t.dispose()}},n=(t,n)=>{if(e.NODE_ENV==`development`){let e=globalThis;if(t in e)return e[t];let r=n();return e[t]=r,r}return n()};var r=class e{#bindings;#singletons;#constructing;#lazyResolveQueue=[];constructor(e,t,n){this.#bindings=e?.getBindings()??new Map,this.#singletons=e?.getSingletons()??new Map,this.#constructing=t?[...n??e?.getConstructing()??[],t]:[]}getBindings(){return this.#bindings}getSingletons(){return this.#singletons}getConstructing(){return this.#constructing}register(e){for(let t of e)t.callable?this.#bindings.set(t.name,{factory:()=>t.callable,scope:`singleton`}):t.factory?this.#bindings.set(t.name,{factory:(e,n)=>t.factory({resolver:{resolve:e,lazyResolve:n},config:t.config}),scope:t.scope??`singleton`,config:t.config}):this.#bindings.set(t.name,{factory:()=>t.value,scope:`singleton`})}async#resolveBinding(t,n){let r=this.#bindings.get(t);if(!r)throw Error(`No binding found for ${t}.`);let i=r.scope===`singleton`;if(i&&this.#singletons.has(t))return this.#singletons.get(t);let a=new e(this,t,n),o=await r.factory(e=>a.resolve(e),e=>a.lazyResolve(e));return i&&this.#singletons.set(t,o),await a.dequeueLazyResolves(),o}async dequeueLazyResolves(){for(let e of this.#lazyResolveQueue)try{e.resolve(await this.#resolveBinding(e.name,[]))}catch(t){throw Error(`Failed to resolve lazy binding ${e.name}: ${t instanceof Error?t.message:String(t)}`)}}async resolve(e){if(this.#constructing.includes(e))throw Error(`Circular dependency detected: ${[...this.#constructing,e].join(` -> `)}`);return this.#resolveBinding(e)}lazyResolve(e){let t;return new Promise(t=>{this.#lazyResolveQueue.push({name:e,resolve:e=>{t(e)}})}).then(e=>{t=e}),{get value(){if(!t)throw Error(`Lazy binding is not yet resolved. Avoid accessing it before container construction finishes.`);return t}}}async dispose(){let e=[];for(let[t,n]of this.#singletons)if(typeof n.dispose==`function`)try{await n.dispose()}catch(n){e.push({name:t,error:n})}if(this.#singletons.clear(),e.length>0){let t=e.map(({name:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`).join(`; `);throw Error(`Failed to dispose ${e.length} binding(s):\n${t}`)}}};export{t as createContainer};
1
+ const e=process.env.NODE_ENV===`development`,t=e=>{let t=n(`__R_DI`,()=>{let t=new r;return t.register(e),t});return{resolve:e=>t.resolve(e),dispose:()=>t.dispose()}},n=(t,n)=>{if(!e)return n();let r=globalThis;if(t in r)return r[t];let i=n();return r[t]=i,i};var r=class e{_bindings;_singletons;_constructing;_lazyResolveQueue=[];constructor(e,t,n){this._bindings=e?._bindings??new Map,this._singletons=e?._singletons??new Map,this._constructing=t?[...n??e?._constructing??[],t]:[]}register(e){for(let t of e){let e=t.callable?()=>t.callable:t.factory?(e,n)=>t.factory({resolver:{resolve:e,lazyResolve:n},config:t.config}):()=>t.value;this._bindings.set(t.name,{factory:e,scope:t.scope??`singleton`,config:t.config})}}async _resolveBinding(t,n){let r=this._bindings.get(t);if(!r)throw Error(`No binding found for ${t}.`);let i=r.scope===`singleton`;if(i&&this._singletons.has(t))return this._singletons.get(t);let a=new e(this,t,n),o=r.factory(e=>a.resolve(e),e=>a.lazyResolve(e)),s=o instanceof Promise?await o:o;return i&&this._singletons.set(t,s),await a.dequeueLazyResolves(),s}async dequeueLazyResolves(){for(let e of this._lazyResolveQueue)try{e.resolve(await this._resolveBinding(e.name,[]))}catch(t){throw Error(`Failed to resolve lazy binding ${e.name}: ${t instanceof Error?t.message:String(t)}`)}}async resolve(e){if(this._constructing.includes(e))throw Error(`Circular dependency detected: ${[...this._constructing,e].join(` -> `)}`);return this._resolveBinding(e)}lazyResolve(e){let t={resolved:!1};return this._lazyResolveQueue.push({name:e,resolve:e=>{t.value=e,t.resolved=!0}}),{get value(){if(!t.resolved)throw Error(`Lazy binding is not yet resolved. Avoid accessing it before container construction finishes.`);return t.value}}}async dispose(){let e=0,t=``;for(let[n,r]of this._singletons)if(typeof r.dispose==`function`)try{await r.dispose()}catch(r){e++,t+=`${n}: ${r instanceof Error?r.message:r}; `}if(this._singletons.clear(),e>0)throw Error(`Failed to dispose ${e} binding(s):\n${t.slice(0,-2)}`)}};export{t as createContainer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolid/di",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "private": false,
5
5
  "description": "The Resolid DI Container package.",
6
6
  "keywords": [
@@ -35,14 +35,12 @@
35
35
  "files": [
36
36
  "dist"
37
37
  ],
38
- "dependencies": {},
39
38
  "devDependencies": {
40
39
  "@vitest/coverage-v8": "beta",
41
- "tsdown": "^0.15.7",
40
+ "tsdown": "^0.15.8",
42
41
  "typescript": "^5.9.3",
43
42
  "vitest": "beta"
44
43
  },
45
- "peerDependencies": {},
46
44
  "engines": {
47
45
  "node": "^20.19.0 || ^22.13.0 || >=24"
48
46
  },