From bf558440f472c26f814ff783d2128dd7e50388d5 Mon Sep 17 00:00:00 2001 From: Andrei Fangli Date: Sun, 17 Nov 2024 17:26:42 +0200 Subject: [PATCH] Updated form collection inheritance --- src/dependencies/DependencyContainer.ts | 4 +- src/dependencies/DependencyResolverContext.ts | 8 +-- src/dependencies/IDependencyContainer.ts | 2 +- src/dependencies/IDependencyResolver.ts | 2 +- src/dependencies/UseDependency.ts | 6 +- src/dependencies/UseViewModelDependency.ts | 8 +-- .../DependencyContainer.circular.test.ts | 10 ++-- .../DependencyContainer.config.test.ts | 48 +++++++-------- .../DependencyContainer.scope.test.ts | 60 +++++++++---------- .../DependencyContainer.singleton.test.ts | 36 +++++------ .../DependencyContainer.transient.test.ts | 30 +++++----- .../DependencyContainer.unconfigured.test.ts | 36 +++++------ src/dependencies/index.ts | 12 ++-- src/forms/IFormCollection.ts | 9 ++- 14 files changed, 139 insertions(+), 132 deletions(-) diff --git a/src/dependencies/DependencyContainer.ts b/src/dependencies/DependencyContainer.ts index eb255c6..2aafa27 100644 --- a/src/dependencies/DependencyContainer.ts +++ b/src/dependencies/DependencyContainer.ts @@ -1,5 +1,5 @@ -import type { IDependencyContainer, ConfigurableDependency, DependencyFactoryCallback } from "./IDependencyContainer"; -import { type IDependencyResolver, type ResolvableSimpleDependency, type BasicDependency, type SimpleDependency, type ComplexDependency, DependencyToken } from "./IDependencyResolver"; +import type { IDependencyContainer, ConfigurableDependency, DependencyFactoryCallback } from './IDependencyContainer'; +import { type IDependencyResolver, type ResolvableSimpleDependency, type BasicDependency, type SimpleDependency, type ComplexDependency, DependencyToken } from './IDependencyResolver'; type DependencyFactoryKey = DependencyToken | BasicDependency | SimpleDependency; diff --git a/src/dependencies/DependencyResolverContext.ts b/src/dependencies/DependencyResolverContext.ts index f4feed4..02cab6c 100644 --- a/src/dependencies/DependencyResolverContext.ts +++ b/src/dependencies/DependencyResolverContext.ts @@ -1,8 +1,8 @@ -import type { IDependencyResolver, ResolvableSimpleDependency } from "./IDependencyResolver"; -import type { IDependencyContainer, ConfigurableDependency } from "./IDependencyContainer"; +import type { IDependencyResolver, ResolvableSimpleDependency } from './IDependencyResolver'; +import type { IDependencyContainer, ConfigurableDependency } from './IDependencyContainer'; import type { useDependency } from './UseDependency'; -import { DependencyContainer } from "./DependencyContainer"; -import { type PropsWithChildren, createContext, createElement, useContext, useMemo, useRef } from "react"; +import { DependencyContainer } from './DependencyContainer'; +import { type PropsWithChildren, createContext, createElement, useContext, useMemo, useRef } from 'react'; const DependencyResolverContext = createContext(new DependencyContainer()); diff --git a/src/dependencies/IDependencyContainer.ts b/src/dependencies/IDependencyContainer.ts index c3b7abb..f61b3c5 100644 --- a/src/dependencies/IDependencyContainer.ts +++ b/src/dependencies/IDependencyContainer.ts @@ -1,4 +1,4 @@ -import type { IDependencyResolver, BasicDependency, SimpleDependency, ComplexDependency, DependencyToken, ResolvableSimpleDependency } from "./IDependencyResolver"; +import type { IDependencyResolver, BasicDependency, SimpleDependency, ComplexDependency, DependencyToken, ResolvableSimpleDependency } from './IDependencyResolver'; import type { useDependency } from './UseDependency'; /** diff --git a/src/dependencies/IDependencyResolver.ts b/src/dependencies/IDependencyResolver.ts index c9d0a86..66e5c07 100644 --- a/src/dependencies/IDependencyResolver.ts +++ b/src/dependencies/IDependencyResolver.ts @@ -1,4 +1,4 @@ -import type { IDependencyContainer, ConfigurableDependency } from "./IDependencyContainer"; +import type { IDependencyContainer, ConfigurableDependency } from './IDependencyContainer'; import type { useDependency } from './UseDependency'; /** diff --git a/src/dependencies/UseDependency.ts b/src/dependencies/UseDependency.ts index 67b6a50..5c2508e 100644 --- a/src/dependencies/UseDependency.ts +++ b/src/dependencies/UseDependency.ts @@ -1,8 +1,8 @@ -import type { IDependencyResolver, ResolvableSimpleDependency, ComplexDependency } from "./IDependencyResolver"; +import type { IDependencyResolver, ResolvableSimpleDependency, ComplexDependency } from './IDependencyResolver'; import type { IDependencyContainer } from './IDependencyContainer'; import type { useViewModelDependency } from './UseViewModelDependency'; -import { useMemo, useRef } from "react"; -import { useDependencyResolver, type DependencyResolverProvider, type DependencyResolverScope } from "./DependencyResolverContext"; +import { useMemo, useRef } from 'react'; +import { useDependencyResolver, type DependencyResolverProvider, type DependencyResolverScope } from './DependencyResolverContext'; const emptyAdditionalDependencies: readonly unknown[] = []; diff --git a/src/dependencies/UseViewModelDependency.ts b/src/dependencies/UseViewModelDependency.ts index 5ab31b1..15dc6d4 100644 --- a/src/dependencies/UseViewModelDependency.ts +++ b/src/dependencies/UseViewModelDependency.ts @@ -1,8 +1,8 @@ -import type { INotifyPropertiesChanged } from "../viewModels"; -import type { IDependencyResolver, ResolvableSimpleDependency, ComplexDependency } from "./IDependencyResolver"; +import type { INotifyPropertiesChanged } from '../viewModels'; +import type { IDependencyResolver, ResolvableSimpleDependency, ComplexDependency } from './IDependencyResolver'; import type { IDependencyContainer, ConfigurableDependency } from './IDependencyContainer' -import { useViewModel } from "../hooks"; -import { useDependency } from "./UseDependency"; +import { useViewModel } from '../hooks'; +import { useDependency } from './UseDependency'; /** * Resolves the requested view model dependency and subscribes to it for changes. diff --git a/src/dependencies/__tests__/DependencyContainer.circular.test.ts b/src/dependencies/__tests__/DependencyContainer.circular.test.ts index d0ef707..59abbb9 100644 --- a/src/dependencies/__tests__/DependencyContainer.circular.test.ts +++ b/src/dependencies/__tests__/DependencyContainer.circular.test.ts @@ -1,8 +1,8 @@ -import { DependencyToken, type IDependencyResolver } from "../IDependencyResolver"; -import { DependencyContainer } from "../DependencyContainer"; +import { DependencyToken, type IDependencyResolver } from '../IDependencyResolver'; +import { DependencyContainer } from '../DependencyContainer'; describe('DependencyContainer.circular', (): void => { - test("Attempting to resolve self referencing dependency throws exception", () => { + test('Attempting to resolve self referencing dependency throws exception', () => { class A { private static _resolveCount = 0; @@ -21,7 +21,7 @@ describe('DependencyContainer.circular', (): void => { expect(() => resolve(A)).toThrow(new Error('Circular dependency detected while trying to resolve \'A -> A\'.')); }); - test("Attempting to resolve circular dependency throws exception", () => { + test('Attempting to resolve circular dependency throws exception', () => { class A { private static _resolveCount = 0; @@ -52,7 +52,7 @@ describe('DependencyContainer.circular', (): void => { }); - test("Attempting to resolve circular dependency with tokens throws exception", () => { + test('Attempting to resolve circular dependency with tokens throws exception', () => { const dependencyTokenA = new DependencyToken('token A'); const dependencyTokenB = new DependencyToken('token B'); diff --git a/src/dependencies/__tests__/DependencyContainer.config.test.ts b/src/dependencies/__tests__/DependencyContainer.config.test.ts index d980ee1..fbe728e 100644 --- a/src/dependencies/__tests__/DependencyContainer.config.test.ts +++ b/src/dependencies/__tests__/DependencyContainer.config.test.ts @@ -1,8 +1,8 @@ -import { DependencyToken } from "../IDependencyResolver"; -import { DependencyContainer } from "../DependencyContainer"; +import { DependencyToken } from '../IDependencyResolver'; +import { DependencyContainer } from '../DependencyContainer'; describe('DependencyContainer.config', (): void => { - test("Configuring a type as singleton then as scoped updates the configuration", () => { + test('Configuring a type as singleton then as scoped updates the configuration', () => { class MyClass { } @@ -20,7 +20,7 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Configuring a type as scoped then as singleton updates the configuration", () => { + test('Configuring a type as scoped then as singleton updates the configuration', () => { class MyClass { } @@ -38,7 +38,7 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).toBe(thirdInstance); }); - test("Configuring a type as singleton then as transient updates the configuration", () => { + test('Configuring a type as singleton then as transient updates the configuration', () => { class MyClass { } @@ -56,7 +56,7 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Configuring a type as transient then as singleton updates the configuration", () => { + test('Configuring a type as transient then as singleton updates the configuration', () => { class MyClass { } @@ -74,7 +74,7 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).toBe(thirdInstance); }); - test("Configuring a type as scoped then as transient updates the configuration", () => { + test('Configuring a type as scoped then as transient updates the configuration', () => { class MyClass { } @@ -92,7 +92,7 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Configuring a type as transient then as scoped updates the configuration", () => { + test('Configuring a type as transient then as scoped updates the configuration', () => { class MyClass { } @@ -110,8 +110,8 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Configuring a token as singleton then as scoped updates the configuration", () => { - const token = new DependencyToken("test-dependency-token"); + test('Configuring a token as singleton then as scoped updates the configuration', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -129,8 +129,8 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Configuring a token as scoped then as singleton updates the configuration", () => { - const token = new DependencyToken("test-dependency-token"); + test('Configuring a token as scoped then as singleton updates the configuration', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -148,8 +148,8 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).toBe(thirdInstance); }); - test("Configuring a token as singleton then as transient updates the configuration", () => { - const token = new DependencyToken("test-dependency-token"); + test('Configuring a token as singleton then as transient updates the configuration', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -167,8 +167,8 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Configuring a token as transient then as singleton updates the configuration", () => { - const token = new DependencyToken("test-dependency-token"); + test('Configuring a token as transient then as singleton updates the configuration', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -186,8 +186,8 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).toBe(thirdInstance); }); - test("Configuring a token as scoped then as transient updates the configuration", () => { - const token = new DependencyToken("test-dependency-token"); + test('Configuring a token as scoped then as transient updates the configuration', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -205,8 +205,8 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Configuring a token as transient then as scoped updates the configuration", () => { - const token = new DependencyToken("test-dependency-token"); + test('Configuring a token as transient then as scoped updates the configuration', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -224,7 +224,7 @@ describe('DependencyContainer.config', (): void => { expect(secondInstance).not.toBe(thirdInstance); }); - test("Child dependency container overrides parent singleton configuraiton without affecting it", () => { + test('Child dependency container overrides parent singleton configuraiton without affecting it', () => { class MyClass { } @@ -249,7 +249,7 @@ describe('DependencyContainer.config', (): void => { expect(firstInstanceFromChild).not.toBe(secondInstanceFromChild); }); - test("Child dependency container overrides parent transient configuraiton without affecting it", () => { + test('Child dependency container overrides parent transient configuraiton without affecting it', () => { class MyClass { } @@ -274,7 +274,7 @@ describe('DependencyContainer.config', (): void => { expect(firstInstanceFromChild).toBe(secondInstanceFromChild); }); - test("Child dependency container uses parent configuraiton as fallback", () => { + test('Child dependency container uses parent configuraiton as fallback', () => { class MyFirstClass { } class MySecondClass { @@ -295,7 +295,7 @@ describe('DependencyContainer.config', (): void => { expect(secondChildInstance.instance).toBe(parentInstance); }); - test("Child dependency container uses own configuraiton when overridden", () => { + test('Child dependency container uses own configuraiton when overridden', () => { class MyFirstClass { } class MySecondClass { diff --git a/src/dependencies/__tests__/DependencyContainer.scope.test.ts b/src/dependencies/__tests__/DependencyContainer.scope.test.ts index 8fa4fc5..269b289 100644 --- a/src/dependencies/__tests__/DependencyContainer.scope.test.ts +++ b/src/dependencies/__tests__/DependencyContainer.scope.test.ts @@ -1,8 +1,8 @@ -import { DependencyToken } from "../IDependencyResolver"; -import { DependencyContainer } from "../DependencyContainer"; +import { DependencyToken } from '../IDependencyResolver'; +import { DependencyContainer } from '../DependencyContainer'; describe('DependencyContainer.scope', (): void => { - test("Resolving scoped type dependency returns instance", () => { + test('Resolving scoped type dependency returns instance', () => { class MyClass { } @@ -15,7 +15,7 @@ describe('DependencyContainer.scope', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving scoped type dependency returns same instance", () => { + test('Resolving scoped type dependency returns same instance', () => { class MyClass { } @@ -29,7 +29,7 @@ describe('DependencyContainer.scope', (): void => { expect(firstInstance).toBe(secondInstance); }); - test("Resolving singleton type dependency returns same instance across scopes", () => { + test('Resolving singleton type dependency returns same instance across scopes', () => { class MyClass { } @@ -44,7 +44,7 @@ describe('DependencyContainer.scope', (): void => { expect(secondInstance).toBe(thirdInstance); }); - test("Resolving scoped type dependency returns different instance across scopes", () => { + test('Resolving scoped type dependency returns different instance across scopes', () => { class MyClass { } @@ -56,7 +56,7 @@ describe('DependencyContainer.scope', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving scoped type dependency returns different instance from parent scope", () => { + test('Resolving scoped type dependency returns different instance from parent scope', () => { class MyClass { } @@ -70,7 +70,7 @@ describe('DependencyContainer.scope', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving scoped type dependency calls factory once", () => { + test('Resolving scoped type dependency calls factory once', () => { class MyClass { } let callCount = 0; @@ -87,7 +87,7 @@ describe('DependencyContainer.scope', (): void => { expect(callCount).toStrictEqual(1); }); - test("Resolving scoped type dependency calls factory once per scope", () => { + test('Resolving scoped type dependency calls factory once per scope', () => { class MyClass { } let callCount = 0; @@ -103,7 +103,7 @@ describe('DependencyContainer.scope', (): void => { expect(callCount).toStrictEqual(2); }); - test("Resolving scoped type dependency returns cached instance", () => { + test('Resolving scoped type dependency returns cached instance', () => { class MyClass { } const instance = {}; @@ -118,7 +118,7 @@ describe('DependencyContainer.scope', (): void => { expect(secondInstance).toBe(instance); }); - test("Resolving scoped type dependency returns cached instance across scopes", () => { + test('Resolving scoped type dependency returns cached instance across scopes', () => { class MyClass { } const instance = {}; @@ -132,16 +132,16 @@ describe('DependencyContainer.scope', (): void => { expect(secondInstance).toBe(instance); }); - test("Resolving scoped unconfigured token dependency throws exception", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving scoped unconfigured token dependency throws exception', () => { + const token = new DependencyToken('test-dependency-token'); const scopedDependencyResolver = new DependencyContainer().createScope(); - expect(() => scopedDependencyResolver.resolve(token)).toThrow(new Error("There is no configured dependency for token 'test-dependency-token'.")); + expect(() => scopedDependencyResolver.resolve(token)).toThrow(new Error('There is no configured dependency for token \'test-dependency-token\'.')); }); - test("Resolving scoped type token dependency returns instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving scoped type token dependency returns instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } const scopedDependencyResolver = new DependencyContainer() @@ -153,8 +153,8 @@ describe('DependencyContainer.scope', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving scoped type token dependency returns same instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving scoped type token dependency returns same instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -168,8 +168,8 @@ describe('DependencyContainer.scope', (): void => { expect(firstInstance).toBe(secondInstance); }); - test("Resolving scoped type token dependency returns different instances across scopes", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving scoped type token dependency returns different instances across scopes', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -181,8 +181,8 @@ describe('DependencyContainer.scope', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving scoped factory token dependency returns instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving scoped factory token dependency returns instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } const scopedDependencyResolver = new DependencyContainer() @@ -194,8 +194,8 @@ describe('DependencyContainer.scope', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving scoped factory token dependency returns same instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving scoped factory token dependency returns same instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -209,8 +209,8 @@ describe('DependencyContainer.scope', (): void => { expect(firstInstance).toBe(secondInstance); }); - test("Resolving scoped factory token dependency returns different instances across scopes", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving scoped factory token dependency returns different instances across scopes', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -222,9 +222,9 @@ describe('DependencyContainer.scope', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving scoped factory token dependency calls factory once", () => { + test('Resolving scoped factory token dependency calls factory once', () => { let callCount = 0; - const token = new DependencyToken("test-dependency-token"); + const token = new DependencyToken('test-dependency-token'); class MyClass { } const scopedDependencyResolver = new DependencyContainer() @@ -240,9 +240,9 @@ describe('DependencyContainer.scope', (): void => { expect(callCount).toStrictEqual(1); }); - test("Resolving scoped factory token dependency calls factory once per scope", () => { + test('Resolving scoped factory token dependency calls factory once per scope', () => { let callCount = 0; - const token = new DependencyToken("test-dependency-token"); + const token = new DependencyToken('test-dependency-token'); class MyClass { } const dependencyContainer = new DependencyContainer() diff --git a/src/dependencies/__tests__/DependencyContainer.singleton.test.ts b/src/dependencies/__tests__/DependencyContainer.singleton.test.ts index f0e6492..239a2b8 100644 --- a/src/dependencies/__tests__/DependencyContainer.singleton.test.ts +++ b/src/dependencies/__tests__/DependencyContainer.singleton.test.ts @@ -1,8 +1,8 @@ -import { DependencyToken } from "../IDependencyResolver"; -import { DependencyContainer } from "../DependencyContainer"; +import { DependencyToken } from '../IDependencyResolver'; +import { DependencyContainer } from '../DependencyContainer'; describe('DependencyContainer.singleton', (): void => { - test("Resolving singleton type dependency returns instance", () => { + test('Resolving singleton type dependency returns instance', () => { class MyClass { } @@ -14,7 +14,7 @@ describe('DependencyContainer.singleton', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving singleton type dependency returns same instance", () => { + test('Resolving singleton type dependency returns same instance', () => { class MyClass { } @@ -27,7 +27,7 @@ describe('DependencyContainer.singleton', (): void => { expect(firstInstance).toBe(secondInstance); }); - test("Resolving singleton type dependency calls factory once", () => { + test('Resolving singleton type dependency calls factory once', () => { class MyClass { } let callCount = 0; @@ -43,7 +43,7 @@ describe('DependencyContainer.singleton', (): void => { expect(callCount).toStrictEqual(1); }); - test("Resolving singleton type dependency returns same instance", () => { + test('Resolving singleton type dependency returns same instance', () => { class MyClass { } const instance = {}; @@ -57,8 +57,8 @@ describe('DependencyContainer.singleton', (): void => { expect(secondInstance).toBe(instance); }); - test("Resolving singleton type token dependency returns instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving singleton type token dependency returns instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } const dependencyContainer = new DependencyContainer(); @@ -69,8 +69,8 @@ describe('DependencyContainer.singleton', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving singleton type token dependency returns same instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving singleton type token dependency returns same instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -83,8 +83,8 @@ describe('DependencyContainer.singleton', (): void => { expect(firstInstance).toBe(secondInstance); }); - test("Resolving instance token dependency returns same instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving instance token dependency returns same instance', () => { + const token = new DependencyToken('test-dependency-token'); const instance = {}; const dependencyContainer = new DependencyContainer(); @@ -95,8 +95,8 @@ describe('DependencyContainer.singleton', (): void => { expect(resolvedInstance).toBe(instance); }); - test("Resolving singleton factory token dependency returns instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving singleton factory token dependency returns instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } const dependencyContainer = new DependencyContainer(); @@ -107,8 +107,8 @@ describe('DependencyContainer.singleton', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving singleton factory token dependency returns same instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving singleton factory token dependency returns same instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -121,9 +121,9 @@ describe('DependencyContainer.singleton', (): void => { expect(firstInstance).toBe(secondInstance); }); - test("Resolving singleton factory token dependency calls factory once", () => { + test('Resolving singleton factory token dependency calls factory once', () => { let callCount = 0; - const token = new DependencyToken("test-dependency-token"); + const token = new DependencyToken('test-dependency-token'); class MyClass { } const dependencyContainer = new DependencyContainer(); diff --git a/src/dependencies/__tests__/DependencyContainer.transient.test.ts b/src/dependencies/__tests__/DependencyContainer.transient.test.ts index e654945..c6143f8 100644 --- a/src/dependencies/__tests__/DependencyContainer.transient.test.ts +++ b/src/dependencies/__tests__/DependencyContainer.transient.test.ts @@ -1,8 +1,8 @@ -import { DependencyToken } from "../IDependencyResolver"; -import { DependencyContainer } from "../DependencyContainer"; +import { DependencyToken } from '../IDependencyResolver'; +import { DependencyContainer } from '../DependencyContainer'; describe('DependencyContainer.transient', (): void => { - test("Resolving transient type dependency returns instance", () => { + test('Resolving transient type dependency returns instance', () => { class MyClass { } @@ -14,7 +14,7 @@ describe('DependencyContainer.transient', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving transient type dependency returns different instances", () => { + test('Resolving transient type dependency returns different instances', () => { class MyClass { } @@ -27,7 +27,7 @@ describe('DependencyContainer.transient', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving transient type dependency calls factory each time", () => { + test('Resolving transient type dependency calls factory each time', () => { class MyClass { } let callCount = 0; @@ -43,8 +43,8 @@ describe('DependencyContainer.transient', (): void => { expect(callCount).toStrictEqual(2); }); - test("Resolving transient type token dependency returns instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving transient type token dependency returns instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } const dependencyContainer = new DependencyContainer(); @@ -55,8 +55,8 @@ describe('DependencyContainer.transient', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving transient type token dependency returns different instances", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving transient type token dependency returns different instances', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -69,8 +69,8 @@ describe('DependencyContainer.transient', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving transient factory token dependency returns instance", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving transient factory token dependency returns instance', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } const dependencyContainer = new DependencyContainer(); @@ -81,8 +81,8 @@ describe('DependencyContainer.transient', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving transient factory token dependency returns different instances", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving transient factory token dependency returns different instances', () => { + const token = new DependencyToken('test-dependency-token'); class MyClass { } @@ -95,9 +95,9 @@ describe('DependencyContainer.transient', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving transient factory token dependency calls factory each time", () => { + test('Resolving transient factory token dependency calls factory each time', () => { let callCount = 0; - const token = new DependencyToken("test-dependency-token"); + const token = new DependencyToken('test-dependency-token'); class MyClass { } const dependencyContainer = new DependencyContainer(); diff --git a/src/dependencies/__tests__/DependencyContainer.unconfigured.test.ts b/src/dependencies/__tests__/DependencyContainer.unconfigured.test.ts index e42b480..d9c0623 100644 --- a/src/dependencies/__tests__/DependencyContainer.unconfigured.test.ts +++ b/src/dependencies/__tests__/DependencyContainer.unconfigured.test.ts @@ -1,8 +1,8 @@ -import { type IDependencyResolver, DependencyToken } from "../IDependencyResolver"; -import { DependencyContainer } from "../DependencyContainer"; +import { type IDependencyResolver, DependencyToken } from '../IDependencyResolver'; +import { DependencyContainer } from '../DependencyContainer'; describe('DependencyContainer.unconfigured', (): void => { - test("Resolve works without context", () => { + test('Resolve works without context', () => { const { resolve } = new DependencyContainer(); const instance = resolve(class { }); @@ -10,7 +10,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(instance).not.toBeNull(); }); - test("Resolving null dependency returns null", () => { + test('Resolving null dependency returns null', () => { const dependencyContainer = new DependencyContainer(); const resolvedDependency = dependencyContainer.resolve(null); @@ -18,7 +18,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(resolvedDependency).toBeNull(); }); - test("Resolving undefined dependency returns undefined", () => { + test('Resolving undefined dependency returns undefined', () => { const dependencyContainer = new DependencyContainer(); const resolvedDependency = dependencyContainer.resolve(undefined); @@ -26,7 +26,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(resolvedDependency).toBeUndefined(); }); - test("Resolving object dependency returns object", () => { + test('Resolving object dependency returns object', () => { const instnace = {}; const dependencyContainer = new DependencyContainer(); @@ -35,7 +35,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(resolvedDependency).toStrictEqual(instnace); }); - test("Resolving a basic dependency returns instance", () => { + test('Resolving a basic dependency returns instance', () => { class MyClass { } const dependencyContainer = new DependencyContainer(); @@ -45,7 +45,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving a simple dependency returns instance", () => { + test('Resolving a simple dependency returns instance', () => { class MyClass { constructor(dependencyResolver: IDependencyResolver) { } @@ -58,7 +58,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving a simple dependency receives dependecy container as first constructor parameter", () => { + test('Resolving a simple dependency receives dependecy container as first constructor parameter', () => { let receivedDependencyResolver: IDependencyResolver | null = null; class MyClass { @@ -74,7 +74,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(receivedDependencyResolver).toBe(dependencyContainer); }); - test("Resolving a complex dependency returns instance", () => { + test('Resolving a complex dependency returns instance', () => { class MyClass { constructor(dependencyResolver: IDependencyResolver, id: number) { } @@ -87,7 +87,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving a complex dependency receives dependecy container as first constructor parameter", () => { + test('Resolving a complex dependency receives dependecy container as first constructor parameter', () => { let receivedDependencyResolver: IDependencyResolver | null = null; class MyClass { @@ -103,7 +103,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(receivedDependencyResolver).toBe(dependencyContainer); }); - test("Resolving a complex dependency receives additional dependency as second constructor parameter", () => { + test('Resolving a complex dependency receives additional dependency as second constructor parameter', () => { let receivedAdditionalDependency: object | null = null; const additionalDependency = {}; @@ -120,7 +120,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(receivedAdditionalDependency).toBe(additionalDependency); }); - test("Resolving a complex dependency receives additional dependency as third constructor parameter", () => { + test('Resolving a complex dependency receives additional dependency as third constructor parameter', () => { let receivedAdditionalDependency: object | null = null; const additionalDependency = {}; @@ -137,7 +137,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(receivedAdditionalDependency).toBe(additionalDependency); }); - test("Resolving type dependency returns instance", () => { + test('Resolving type dependency returns instance', () => { class MyClass { } @@ -148,7 +148,7 @@ describe('DependencyContainer.unconfigured', (): void => { expect(instance).toBeInstanceOf(MyClass); }); - test("Resolving type dependency returns different instance each time", () => { + test('Resolving type dependency returns different instance each time', () => { class MyClass { } @@ -160,11 +160,11 @@ describe('DependencyContainer.unconfigured', (): void => { expect(firstInstance).not.toBe(secondInstance); }); - test("Resolving unconfigured token dependency throws exception", () => { - const token = new DependencyToken("test-dependency-token"); + test('Resolving unconfigured token dependency throws exception', () => { + const token = new DependencyToken('test-dependency-token'); const dependencyContainer = new DependencyContainer(); - expect(() => dependencyContainer.resolve(token)).toThrow(new Error("There is no configured dependency for token 'test-dependency-token'.")); + expect(() => dependencyContainer.resolve(token)).toThrow(new Error('There is no configured dependency for token \'test-dependency-token\'.')); }); }); \ No newline at end of file diff --git a/src/dependencies/index.ts b/src/dependencies/index.ts index 1603721..494eb9e 100644 --- a/src/dependencies/index.ts +++ b/src/dependencies/index.ts @@ -1,13 +1,13 @@ -export { type IDependencyResolver, type ResolvableSimpleDependency, type BasicDependency, type SimpleDependency, type ComplexDependency, DependencyToken } from "./IDependencyResolver"; -export type { IDependencyContainer, ConfigurableDependency, DependencyFactoryCallback } from "./IDependencyContainer"; -export { DependencyContainer } from "./DependencyContainer"; +export { type IDependencyResolver, type ResolvableSimpleDependency, type BasicDependency, type SimpleDependency, type ComplexDependency, DependencyToken } from './IDependencyResolver'; +export type { IDependencyContainer, ConfigurableDependency, DependencyFactoryCallback } from './IDependencyContainer'; +export { DependencyContainer } from './DependencyContainer'; -export { useDependency } from "./UseDependency"; -export { useViewModelDependency } from "./UseViewModelDependency"; +export { useDependency } from './UseDependency'; +export { useViewModelDependency } from './UseViewModelDependency'; export { type IDependencyResolverProviderProps, DependencyResolverProvider, type IDependencyResolverScopeProps, DependencyResolverScope, useDependencyResolver -} from "./DependencyResolverContext"; \ No newline at end of file +} from './DependencyResolverContext'; \ No newline at end of file diff --git a/src/forms/IFormCollection.ts b/src/forms/IFormCollection.ts index 20b0054..3101620 100644 --- a/src/forms/IFormCollection.ts +++ b/src/forms/IFormCollection.ts @@ -2,6 +2,7 @@ import type { IObservableCollection } from '../collections'; import type { IValidatable } from '../validation'; import type { Form } from './Form'; import type { IConfigurableFormCollection } from './IConfigurableFormCollection'; +import type { IReadOnlyFormCollection } from './IReadOnlyFormCollection'; /** * Represents a configurable observable collection of forms. Callbacks can be configured for setting up individual @@ -10,7 +11,13 @@ import type { IConfigurableFormCollection } from './IConfigurableFormCollection' * @template TForm The concrete type of the form section. * @template TValidationError The concrete type for representing validation errors (strings, enums, numbers etc.). */ -export interface IFormCollection, TValidationError = string> extends IValidatable, IObservableCollection, IConfigurableFormCollection { +export interface IFormCollection, TValidationError = string> extends IValidatable, IObservableCollection, IConfigurableFormCollection, IReadOnlyFormCollection { + /** + * Gets or sets the number of items in the collection. + * @see [Array.length](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/length) + */ + length: number; + /** * Resets the sections collection and all contained items. *