Skip to content

Commit

Permalink
feat: improve error messages (#66)
Browse files Browse the repository at this point in the history
- Simplify error messages
- Allow for near-infinite deep dependency trees.

Co-authored-by: Nico Jansen <[email protected]>
  • Loading branch information
mayorandrew and nicojs committed Dec 13, 2024
1 parent 028cd45 commit 64f7640
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 6 deletions.
11 changes: 6 additions & 5 deletions src/api/TChildContext.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
// Forces typescript to explicitly calculate the complicated type
export type Simplify<T> = {} & { [K in keyof T]: T[K] };

export type TChildContext<
TParentContext,
TProvided,
CurrentToken extends string,
> = {
[K in keyof (TParentContext & {
[K in CurrentToken]: TProvided;
})]: K extends CurrentToken
> = Simplify<{
[K in keyof TParentContext | CurrentToken]: K extends CurrentToken //
? TProvided
: K extends keyof TParentContext
? TParentContext[K]
: never;
};
}>;
54 changes: 54 additions & 0 deletions testResources/long-dependency-graph.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// error: false
import { createInjector, tokens } from '../src/index.js';

const rootInjector = createInjector();

class Foo {
constructor(public qux: boolean) {}
public static inject = tokens('qux');
}

const fooInjector = rootInjector
.provideValue('qux', true)
.provideClass('foo1', Foo)
.provideClass('foo2', Foo)
.provideClass('foo3', Foo)
.provideClass('foo4', Foo)
.provideClass('foo5', Foo)
.provideClass('foo6', Foo)
.provideClass('foo7', Foo)
.provideClass('foo8', Foo)
.provideClass('foo9', Foo)
.provideClass('foo10', Foo)
.provideClass('foo11', Foo)
.provideClass('foo12', Foo)
.provideClass('foo13', Foo)
.provideClass('foo14', Foo)
.provideClass('foo15', Foo)
.provideClass('foo16', Foo)
.provideClass('foo17', Foo)
.provideClass('foo18', Foo)
.provideClass('foo19', Foo)
.provideClass('foo20', Foo)
.provideClass('foo21', Foo)
.provideClass('foo22', Foo)
.provideClass('foo23', Foo)
.provideClass('foo24', Foo)
.provideClass('foo25', Foo)
.provideClass('foo26', Foo)
.provideClass('foo27', Foo)
.provideClass('foo28', Foo)
.provideClass('foo29', Foo)
.provideClass('foo30', Foo)
.provideClass('foo41', Foo)
.provideClass('foo42', Foo)
.provideClass('foo43', Foo)
.provideClass('foo44', Foo)
.provideClass('foo45', Foo)
.provideClass('foo46', Foo)
.provideClass('foo47', Foo)
.provideClass('foo48', Foo)
.provideClass('foo49', Foo)
.provideClass('foo50', Foo);

const foo = fooInjector.resolve('foo50');
2 changes: 1 addition & 1 deletion testResources/tokens-of-type-string.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// error: "Type 'string[]' is not assignable to type 'readonly InjectionToken<TChildContext<{}, number, \"bar\">>[]'"
// error: "Type 'string[]' is not assignable to type 'readonly InjectionToken<{ bar: number; }>[]'"

import { createInjector } from '../src/index.js';

Expand Down

0 comments on commit 64f7640

Please sign in to comment.