From 81b4d920dd9f43e064772bfba863dfb108cdac15 Mon Sep 17 00:00:00 2001 From: kaokei Date: Mon, 13 Jan 2025 18:32:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8A=9B=E5=87=BA=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/binding.ts | 4 +-- src/container.ts | 4 +-- src/errors/BindingNotValidError.ts | 10 +++++++ src/errors/ConstructorInjectMissTokenError.ts | 10 ------- src/errors/DuplicateBindingError.ts | 10 +++++++ src/errors/InjectFailedError.ts | 29 ------------------- src/errors/PropertyInjectMissTokenError.ts | 10 ------- src/errors/ProviderNotValidError.ts | 10 ------- src/errors/TokenNotFoundError.ts | 2 +- src/errors/index.ts | 8 ++--- src/test.ts | 11 ------- tsconfig.app.json | 2 +- tsconfig.node.json | 2 +- tsconfig.vitest.json | 2 +- vite.config.ts | 2 +- 15 files changed, 32 insertions(+), 84 deletions(-) create mode 100644 src/errors/BindingNotValidError.ts delete mode 100644 src/errors/ConstructorInjectMissTokenError.ts create mode 100644 src/errors/DuplicateBindingError.ts delete mode 100644 src/errors/InjectFailedError.ts delete mode 100644 src/errors/PropertyInjectMissTokenError.ts delete mode 100644 src/errors/ProviderNotValidError.ts delete mode 100644 src/test.ts diff --git a/src/binding.ts b/src/binding.ts index e4e2819..a711be5 100644 --- a/src/binding.ts +++ b/src/binding.ts @@ -8,7 +8,7 @@ import { import { Container } from './container'; import { getMetadata, getOwnMetadata } from './cachemap'; import { resolveToken } from './token'; -import { CircularDependencyError } from './errors'; +import { CircularDependencyError, BindingNotValidError } from './errors'; export class Binding { public container!: Container; @@ -108,7 +108,7 @@ export class Binding { } else if (BindingTypeEnum.DynamicValue === this.type) { return this.resolveDynamicValue(); } else { - // throw error + throw new BindingNotValidError(this); } } diff --git a/src/container.ts b/src/container.ts index 6406342..102f026 100644 --- a/src/container.ts +++ b/src/container.ts @@ -1,5 +1,5 @@ import { Binding } from './binding'; -import { TokenNotFoundError } from './errors/TokenNotFoundError'; +import { TokenNotFoundError, DuplicateBindingError } from './errors'; import { IDENTITY, NOOP } from './constants'; import { GenericToken } from './interfaces'; @@ -11,7 +11,7 @@ export class Container { public bind(serviceIdentifier: any) { if (this.bindings.has(serviceIdentifier)) { - // todo: throw new Error('Already bound'); + throw new DuplicateBindingError(serviceIdentifier); } const binding = this.buildBinding(serviceIdentifier); this.bindings.set(serviceIdentifier, binding); diff --git a/src/errors/BindingNotValidError.ts b/src/errors/BindingNotValidError.ts new file mode 100644 index 0000000..050f12b --- /dev/null +++ b/src/errors/BindingNotValidError.ts @@ -0,0 +1,10 @@ +export class BindingNotValidError extends Error { + public name = 'BINDING_NOT_VALID_ERROR'; + public message = this.name; + + constructor(binding: any) { + super(); + + this.message = `BINDING NOT VALID. YOU CAN USE ONE OF THESE METHODS {to/toSelf/toService/toConstantValue/toDynamicValue}. ${binding}`; + } +} diff --git a/src/errors/ConstructorInjectMissTokenError.ts b/src/errors/ConstructorInjectMissTokenError.ts deleted file mode 100644 index c00dcde..0000000 --- a/src/errors/ConstructorInjectMissTokenError.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class ConstructorInjectMissTokenError extends Error { - public name = 'CONSTRUCTOR_INJECT_MISS_TOKEN_ERROR'; - public message = this.name; - - constructor(target: any) { - super(); - - this.message = `For the constructor of class ${target}, every parameter must specify a @Inject.`; - } -} diff --git a/src/errors/DuplicateBindingError.ts b/src/errors/DuplicateBindingError.ts new file mode 100644 index 0000000..32930d4 --- /dev/null +++ b/src/errors/DuplicateBindingError.ts @@ -0,0 +1,10 @@ +export class DuplicateBindingError extends Error { + public name = 'DUPLICATE_BINDING_ERROR'; + public message = this.name; + + constructor(token: any) { + super(); + + this.message = `DUPLICATE BINDING. ${token}`; + } +} diff --git a/src/errors/InjectFailedError.ts b/src/errors/InjectFailedError.ts deleted file mode 100644 index 9c82ed7..0000000 --- a/src/errors/InjectFailedError.ts +++ /dev/null @@ -1,29 +0,0 @@ -export class InjectFailedError extends Error { - public name = 'INJECT_FAILED_ERROR'; - public message = this.name; - - constructor( - injectMeta: any, - ClassName: any, - key: string | number, - paramType?: any - ) { - super(); - - if (paramType) { - // 是构造函数的参数装饰器 - if (injectMeta && injectMeta.value === Object) { - this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`; - } else if (paramType === Object) { - this.message = `CONSTRUCTOR PARAMETER TYPE IS OBJECT OR INTERFACE, MUST USE @INJECT TO SPECIFY INJECTION TOKEN. PARAMETER ${key} OF CLASS ${ClassName}.`; - } - } else { - // 是属性装饰器 - if (!injectMeta) { - this.message = `INJECT PROPERTY REQUIRE @INJECT() DECORATOR. PROPERTY ${key} OF CLASS ${ClassName}.`; - } else if (injectMeta.value === Object) { - this.message = `CAN NOT USE OBJECT AS INJECTION TOKEN. PROPERTY ${key} OF CLASS ${ClassName}.`; - } - } - } -} diff --git a/src/errors/PropertyInjectMissTokenError.ts b/src/errors/PropertyInjectMissTokenError.ts deleted file mode 100644 index e80c3c0..0000000 --- a/src/errors/PropertyInjectMissTokenError.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class PropertyInjectMissTokenError extends Error { - public name = 'PROPERTY_INJECT_MISS_TOKEN_ERROR'; - public message = this.name; - - constructor(target: any, targetKey: string) { - super(); - - this.message = `For the property ${targetKey} of class ${target}, @Inject must specify a token.`; - } -} diff --git a/src/errors/ProviderNotValidError.ts b/src/errors/ProviderNotValidError.ts deleted file mode 100644 index 3ca4e54..0000000 --- a/src/errors/ProviderNotValidError.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class ProviderNotValidError extends Error { - public name = 'PROVIDER_NOT_VALID_ERROR'; - public message = this.name; - - constructor(provider: any) { - super(); - - this.message = `PROVIDER NOT VALID. ${provider}`; - } -} diff --git a/src/errors/TokenNotFoundError.ts b/src/errors/TokenNotFoundError.ts index 5dd72d8..d6e84d2 100644 --- a/src/errors/TokenNotFoundError.ts +++ b/src/errors/TokenNotFoundError.ts @@ -5,6 +5,6 @@ export class TokenNotFoundError extends Error { constructor(token: any) { super(); - this.message = `TOKEN IS NOT A INJECTABLE CLASS OR SKIP OUT OF ROOT INJECTOR. YOU CAN USE @Optional DECORATOR TO IGNORE THIS ERROR IF THIS SERVICE IS OPTIONAL. ${token}`; + this.message = `TOKEN IS NOT BOUND TO CONTAINER. YOU CAN USE @Optional DECORATOR TO IGNORE THIS ERROR IF THIS SERVICE IS OPTIONAL. ${token}`; } } diff --git a/src/errors/index.ts b/src/errors/index.ts index 08f358a..280f37d 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -1,6 +1,4 @@ -export { CircularDependencyError } from './CircularDependencyError'; -export { InjectFailedError } from './InjectFailedError'; -export { ProviderNotValidError } from './ProviderNotValidError'; export { TokenNotFoundError } from './TokenNotFoundError'; -export { ConstructorInjectMissTokenError } from './ConstructorInjectMissTokenError'; -export { PropertyInjectMissTokenError } from './PropertyInjectMissTokenError'; +export { BindingNotValidError } from './BindingNotValidError'; +export { DuplicateBindingError } from './DuplicateBindingError'; +export { CircularDependencyError } from './CircularDependencyError'; diff --git a/src/test.ts b/src/test.ts deleted file mode 100644 index 879219a..0000000 --- a/src/test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Container } from './container'; - -class Test { - public name = 123; -} - -const container = new Container(); - -container.bind(Test).toSelf(); - -const test1 = container.get(Test); diff --git a/tsconfig.app.json b/tsconfig.app.json index 2033005..684183c 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -20,7 +20,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + // "noUncheckedSideEffectImports": true }, "include": ["src/**/*.ts"], "exclude": ["src/**/*.ignore.ts"] diff --git a/tsconfig.node.json b/tsconfig.node.json index abcd7f0..02cc406 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -18,7 +18,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + // "noUncheckedSideEffectImports": true }, "include": ["vite.config.ts"] } diff --git a/tsconfig.vitest.json b/tsconfig.vitest.json index 2ce354f..b0f790e 100644 --- a/tsconfig.vitest.json +++ b/tsconfig.vitest.json @@ -26,7 +26,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true + // "noUncheckedSideEffectImports": true }, "include": ["tests/**/*.ts"] } diff --git a/vite.config.ts b/vite.config.ts index 932f4be..e28f47d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,7 +13,7 @@ import dts from 'vite-plugin-dts'; export default defineConfig({ plugins: [ dts({ - rollupTypes: true, + // rollupTypes: true, include: ["./src"], tsconfigPath: './tsconfig.app.json', beforeWriteFile: (filePath, content) => {