Skip to content

Commit

Permalink
fix: update getBaseClassDependencyCount to rely on getBaseType
Browse files Browse the repository at this point in the history
  • Loading branch information
notaphplover committed Dec 3, 2024
1 parent 61cae4e commit d9369ee
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 33 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed

### Fixed
- Fixed unexpected property access while running planning checks on injected base types.

## [6.1.5]

Expand Down
62 changes: 30 additions & 32 deletions src/planning/reflection_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { getTargets } from '@inversifyjs/core';

import * as METADATA_KEY from '../constants/metadata_keys';
import { interfaces } from '../interfaces/interfaces';
import { getBaseType } from '../utils/get_base_type';
import { getFunctionName } from '../utils/serialization';
import { Metadata } from './metadata';

Expand All @@ -17,40 +18,37 @@ function getBaseClassDependencyCount(
metadataReader: interfaces.MetadataReader,
func: NewableFunction,
): number {
const baseConstructor: NewableFunction =
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
Object.getPrototypeOf(func.prototype).constructor as NewableFunction;
if (baseConstructor !== (Object as unknown as NewableFunction)) {
// get targets for base class

const targets: interfaces.Target[] = getTargets(metadataReader)(
baseConstructor as Newable,
);

// get unmanaged metadata
const metadata: interfaces.Metadata[][] = targets.map(
(t: interfaces.Target) =>
t.metadata.filter(
(m: interfaces.Metadata) => m.key === METADATA_KEY.UNMANAGED_TAG,
),
);

// Compare the number of constructor arguments with the number of
// unmanaged dependencies unmanaged dependencies are not required
const unmanagedCount: number = ([] as Metadata[]).concat.apply(
[],
metadata,
).length;
const dependencyCount: number = targets.length - unmanagedCount;

if (dependencyCount > 0) {
return dependencyCount;
} else {
return getBaseClassDependencyCount(metadataReader, baseConstructor);
}
} else {
const baseConstructor: Newable | undefined = getBaseType(func);

if (baseConstructor === undefined || baseConstructor === Object) {
return 0;
}

// get targets for base class
const targets: interfaces.Target[] =
getTargets(metadataReader)(baseConstructor);

// get unmanaged metadata
const metadata: interfaces.Metadata[][] = targets.map(
(t: interfaces.Target) =>
t.metadata.filter(
(m: interfaces.Metadata) => m.key === METADATA_KEY.UNMANAGED_TAG,
),
);

// Compare the number of constructor arguments with the number of
// unmanaged dependencies unmanaged dependencies are not required
const unmanagedCount: number = ([] as Metadata[]).concat.apply(
[],
metadata,
).length;
const dependencyCount: number = targets.length - unmanagedCount;

if (dependencyCount > 0) {
return dependencyCount;
} else {
return getBaseClassDependencyCount(metadataReader, baseConstructor);
}
}

export { getDependencies, getBaseClassDependencyCount, getFunctionName };
2 changes: 1 addition & 1 deletion src/utils/get_base_type.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Newable } from '@inversifyjs/common';

interface Prototype {
constructor: Newable;
constructor?: Newable;
}

// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
Expand Down

0 comments on commit d9369ee

Please sign in to comment.