diff --git a/packages/ddd/package.json b/packages/ddd/package.json index 61c1b464..0f719a09 100755 --- a/packages/ddd/package.json +++ b/packages/ddd/package.json @@ -1,6 +1,6 @@ { "name": "@vitruvius-labs/ddd", - "version": "0.1.2", + "version": "0.1.3", "description": "", "author": { "name": "VitruviusLabs" diff --git a/packages/ddd/src/_index.mts b/packages/ddd/src/_index.mts index 6a7d6c09..f19f8301 100644 --- a/packages/ddd/src/_index.mts +++ b/packages/ddd/src/_index.mts @@ -1,4 +1,5 @@ export * from "./base/_index.mjs"; -export * from "./blank-record/_index.mjs"; export * from "./value-object/_index.mjs"; export * from "./predefined-type/_index.mjs"; +export * from "./meta-property/_index.mjs"; +export * from "./blank-record/_index.mjs"; diff --git a/packages/ddd/src/base/auxiliary/meta-property/definition/type/meta-property.type.mts b/packages/ddd/src/base/auxiliary/meta-property/definition/type/meta-property.type.mts index 1dc61b84..dadf40f1 100644 --- a/packages/ddd/src/base/auxiliary/meta-property/definition/type/meta-property.type.mts +++ b/packages/ddd/src/base/auxiliary/meta-property/definition/type/meta-property.type.mts @@ -1,7 +1,8 @@ import type { MetaProperty } from "../../meta-property.mjs"; -import type { PropertyType } from "../../../property/definition/type/property.type.mjs"; +import type { TypeDefinitionType } from "../../../type-definition/definition/type/type-definition.type.mjs"; import type { PropertyDefinitionType } from "../../../property-definition/definition/type/property-definition.type.mjs"; +import type { PropertyType } from "../../../property/definition/type/property.type.mjs"; -type MetaPropertyType = MetaProperty; +type MetaPropertyType = MetaProperty; export type { MetaPropertyType }; diff --git a/packages/ddd/src/base/auxiliary/meta-property/meta-property.mts b/packages/ddd/src/base/auxiliary/meta-property/meta-property.mts index 2a2ca3d5..d1c8367b 100644 --- a/packages/ddd/src/base/auxiliary/meta-property/meta-property.mts +++ b/packages/ddd/src/base/auxiliary/meta-property/meta-property.mts @@ -3,11 +3,18 @@ import type { Property } from "../property/property.mjs"; import type { PropertyInstantiationInterface } from "../property/definition/interface/property-instantiation.interface.mjs"; import type { TypeDefinition } from "../type-definition/type-definition.mjs"; -abstract class MetaProperty = PropertyDefinition, P extends Property = Property> +abstract class MetaProperty< + T, + TD extends TypeDefinition = TypeDefinition, + PD extends PropertyDefinition = PropertyDefinition, + P extends Property = Property +> { + public abstract getTypeDefinition(): Promise; + public abstract getPropertyDefinition(): Promise; - protected abstract createProperty(parameters: PropertyInstantiationInterface): P; + protected abstract createProperty(parameters: PropertyInstantiationInterface): P; public async createNewProperty(value: T): Promise

{ @@ -26,7 +33,7 @@ abstract class MetaProperty = PropertyDefini { const property_definition: PD = await this.getPropertyDefinition(); - const type_definition: TypeDefinition = property_definition.getTypeDefinition(); + const type_definition: TD = property_definition.getTypeDefinition(); const normalized_value: T = await this.normalize(value, type_definition); @@ -42,7 +49,7 @@ abstract class MetaProperty = PropertyDefini } // eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await - public async normalize(value: unknown, type_definition: TypeDefinition): Promise + public async normalize(value: unknown, type_definition: TD): Promise { type_definition.assertType(value); diff --git a/packages/ddd/src/base/auxiliary/meta-property/predefined-meta-property.mts b/packages/ddd/src/base/auxiliary/meta-property/predefined-meta-property.mts index 168f81ac..5969b287 100644 --- a/packages/ddd/src/base/auxiliary/meta-property/predefined-meta-property.mts +++ b/packages/ddd/src/base/auxiliary/meta-property/predefined-meta-property.mts @@ -1,8 +1,14 @@ import type { PropertyDefinition } from "../property-definition/property-definition.mjs"; import type { Property } from "../property/property.mjs"; +import type { TypeDefinition } from "../type-definition/type-definition.mjs"; import { MetaProperty } from "./meta-property.mjs"; -abstract class PredefinedMetaProperty = PropertyDefinition, P extends Property = Property> extends MetaProperty +abstract class PredefinedMetaProperty< + T, + TD extends TypeDefinition = TypeDefinition, + PD extends PropertyDefinition = PropertyDefinition, + P extends Property = Property +> extends MetaProperty { protected abstract getInitialValue(): Promise; diff --git a/packages/ddd/src/base/auxiliary/property-definition/definition/interface/property-definition-instantiation-interface.mts b/packages/ddd/src/base/auxiliary/property-definition/definition/interface/property-definition-instantiation-interface.mts index 60a36e84..ebc7d2fe 100644 --- a/packages/ddd/src/base/auxiliary/property-definition/definition/interface/property-definition-instantiation-interface.mts +++ b/packages/ddd/src/base/auxiliary/property-definition/definition/interface/property-definition-instantiation-interface.mts @@ -1,9 +1,9 @@ import type { TypeDefinition } from "../../../type-definition/type-definition.mjs"; -interface PropertyDefinitionInstantiationInterface +interface PropertyDefinitionInstantiationInterface> { identifier: string; - typeDefinition: TypeDefinition; + typeDefinition: TD; } export type { PropertyDefinitionInstantiationInterface }; diff --git a/packages/ddd/src/base/auxiliary/property-definition/definition/type/property-definition.type.mts b/packages/ddd/src/base/auxiliary/property-definition/definition/type/property-definition.type.mts index 5d66f7f0..90150d76 100644 --- a/packages/ddd/src/base/auxiliary/property-definition/definition/type/property-definition.type.mts +++ b/packages/ddd/src/base/auxiliary/property-definition/definition/type/property-definition.type.mts @@ -1,5 +1,6 @@ import type { PropertyDefinition } from "../../property-definition.mjs"; +import type { TypeDefinitionType } from "../../../type-definition/definition/type/type-definition.type.mjs"; -type PropertyDefinitionType = PropertyDefinition; +type PropertyDefinitionType = PropertyDefinition; export type { PropertyDefinitionType }; diff --git a/packages/ddd/src/base/auxiliary/property-definition/property-definition.mts b/packages/ddd/src/base/auxiliary/property-definition/property-definition.mts index 2baeb5be..534eedad 100644 --- a/packages/ddd/src/base/auxiliary/property-definition/property-definition.mts +++ b/packages/ddd/src/base/auxiliary/property-definition/property-definition.mts @@ -2,12 +2,12 @@ import type { NoValue } from "@vitruvius-labs/ts-predicate"; import type { TypeDefinition } from "../type-definition/type-definition.mjs"; import type { PropertyDefinitionInstantiationInterface } from "./definition/interface/property-definition-instantiation-interface.mjs"; -class PropertyDefinition +class PropertyDefinition = TypeDefinition> { protected readonly identifier: string; - protected readonly typeDefinition: TypeDefinition; + protected readonly typeDefinition: TD; - public constructor(parameters: PropertyDefinitionInstantiationInterface) + public constructor(parameters: PropertyDefinitionInstantiationInterface) { this.identifier = parameters.identifier; this.typeDefinition = parameters.typeDefinition; @@ -18,7 +18,7 @@ class PropertyDefinition return this.identifier; } - public getTypeDefinition(): TypeDefinition + public getTypeDefinition(): TD { return this.typeDefinition; } diff --git a/packages/ddd/src/base/auxiliary/property/definition/interface/property-instantiation.interface.mts b/packages/ddd/src/base/auxiliary/property/definition/interface/property-instantiation.interface.mts index 0201a130..0b7dd0b9 100644 --- a/packages/ddd/src/base/auxiliary/property/definition/interface/property-instantiation.interface.mts +++ b/packages/ddd/src/base/auxiliary/property/definition/interface/property-instantiation.interface.mts @@ -1,6 +1,11 @@ +import type { TypeDefinition } from "../../../type-definition/type-definition.mjs"; import type { PropertyDefinition } from "../../../property-definition/property-definition.mjs"; -interface PropertyInstantiationInterface> +interface PropertyInstantiationInterface< + T, + TD extends TypeDefinition = TypeDefinition, + PD extends PropertyDefinition = PropertyDefinition +> { definition: PD; value: T; diff --git a/packages/ddd/src/base/auxiliary/property/definition/type/property.type.mts b/packages/ddd/src/base/auxiliary/property/definition/type/property.type.mts index 75cdd777..853d6496 100644 --- a/packages/ddd/src/base/auxiliary/property/definition/type/property.type.mts +++ b/packages/ddd/src/base/auxiliary/property/definition/type/property.type.mts @@ -1,6 +1,7 @@ import type { Property } from "../../property.mjs"; +import type { TypeDefinitionType } from "../../../type-definition/definition/type/type-definition.type.mjs"; import type { PropertyDefinitionType } from "../../../property-definition/definition/type/property-definition.type.mjs"; -type PropertyType = Property; +type PropertyType = Property; export type { PropertyType }; diff --git a/packages/ddd/src/base/auxiliary/property/immutable-property.mts b/packages/ddd/src/base/auxiliary/property/immutable-property.mts index 61509544..db3bfde9 100644 --- a/packages/ddd/src/base/auxiliary/property/immutable-property.mts +++ b/packages/ddd/src/base/auxiliary/property/immutable-property.mts @@ -1,10 +1,15 @@ +import type { TypeDefinition } from "../type-definition/type-definition.mjs"; import type { PropertyDefinition } from "../property-definition/property-definition.mjs"; import type { PropertyInstantiationInterface } from "./definition/interface/property-instantiation.interface.mjs"; import { Property } from "./property.mjs"; -class ImmutableProperty = PropertyDefinition> extends Property +class ImmutableProperty< + T, + TD extends TypeDefinition = TypeDefinition, + PD extends PropertyDefinition = PropertyDefinition +> extends Property { - public constructor(parameters: PropertyInstantiationInterface) + public constructor(parameters: PropertyInstantiationInterface) { super(parameters); diff --git a/packages/ddd/src/base/auxiliary/property/property.mts b/packages/ddd/src/base/auxiliary/property/property.mts index dd08c1fd..df5aa7b6 100644 --- a/packages/ddd/src/base/auxiliary/property/property.mts +++ b/packages/ddd/src/base/auxiliary/property/property.mts @@ -1,15 +1,20 @@ import { NoValue } from "@vitruvius-labs/ts-predicate"; +import type { TypeDefinition } from "../type-definition/type-definition.mjs"; import type { PropertyDefinition } from "../property-definition/property-definition.mjs"; import type { PropertyInstantiationInterface } from "./definition/interface/property-instantiation.interface.mjs"; -class Property = PropertyDefinition> +class Property< + T, + TD extends TypeDefinition = TypeDefinition, + PD extends PropertyDefinition = PropertyDefinition +> { private readonly definition: PD; private mutability: boolean; private value: T; private previousValue: T | typeof NoValue; - public constructor(parameters: PropertyInstantiationInterface) + public constructor(parameters: PropertyInstantiationInterface) { this.definition = parameters.definition; this.mutability = true; diff --git a/packages/ddd/src/base/auxiliary/type-definition/definition/type/_index.mts b/packages/ddd/src/base/auxiliary/type-definition/definition/type/_index.mts new file mode 100644 index 00000000..5bd86311 --- /dev/null +++ b/packages/ddd/src/base/auxiliary/type-definition/definition/type/_index.mts @@ -0,0 +1 @@ +export type * from "./type-definition.type.mjs"; diff --git a/packages/ddd/src/base/auxiliary/type-definition/definition/type/type-definition.type.mts b/packages/ddd/src/base/auxiliary/type-definition/definition/type/type-definition.type.mts new file mode 100644 index 00000000..726425c8 --- /dev/null +++ b/packages/ddd/src/base/auxiliary/type-definition/definition/type/type-definition.type.mts @@ -0,0 +1,5 @@ +import type { TypeDefinition } from "../../type-definition.mjs"; + +type TypeDefinitionType = TypeDefinition; + +export type { TypeDefinitionType }; diff --git a/packages/ddd/src/blank-record/blank-record.mts b/packages/ddd/src/blank-record/blank-record.mts index 93832fe8..d459cd06 100644 --- a/packages/ddd/src/blank-record/blank-record.mts +++ b/packages/ddd/src/blank-record/blank-record.mts @@ -1,16 +1,17 @@ +import type { UUID } from "node:crypto"; import type { RepositoryStatusProperty } from "./properties/repository-status/repository-status-property.mjs"; -import type { UUIDv4PropertyType } from "./properties/uuid-v4/definition/type/uuid-v4-property.type.mjs"; import type { RepositoryDateProperty } from "./properties/repository-date/repository-date-property.mjs"; import type { BlankRecordInstantiationInterface } from "./definition/interface/blank-record-instantiation.interface.mjs"; +import type { MetaRecord } from "../base/primary/meta-record.mjs"; +import type { ImmutableProperty } from "../base/auxiliary/property/immutable-property.mjs"; import { RepositoryRecord } from "../base/primary/repository-record.mjs"; import { RepositoryActionEnum } from "./properties/repository-status/definition/enum/repository-action.enum.mjs"; -import type { MetaRecord } from "../base/primary/meta-record.mjs"; abstract class BlankRecord> extends RepositoryRecord { protected readonly metaRecord: MetaRecord; protected readonly status: RepositoryStatusProperty; - protected readonly uuid: UUIDv4PropertyType; + protected readonly uuid: ImmutableProperty; protected readonly registrationDate: RepositoryDateProperty; protected readonly lastUpdateDate: RepositoryDateProperty; @@ -30,7 +31,7 @@ abstract class BlankRecord> extends RepositoryRecord return this.status; } - public getUUID(): UUIDv4PropertyType + public getUUID(): ImmutableProperty { return this.uuid; } diff --git a/packages/ddd/src/blank-record/definition/interface/blank-record-instantiation.interface.mts b/packages/ddd/src/blank-record/definition/interface/blank-record-instantiation.interface.mts index d47085c0..a2a855ad 100644 --- a/packages/ddd/src/blank-record/definition/interface/blank-record-instantiation.interface.mts +++ b/packages/ddd/src/blank-record/definition/interface/blank-record-instantiation.interface.mts @@ -1,14 +1,15 @@ -import type { RepositoryStatusProperty } from "../../properties/repository-status/repository-status-property.mjs"; -import type { UUIDv4PropertyType } from "../../properties/uuid-v4/definition/type/uuid-v4-property.type.mjs"; -import type { RepositoryDateProperty } from "../../properties/repository-date/repository-date-property.mjs"; +import type { UUID } from "node:crypto"; import type { BlankRecord } from "../../blank-record.mjs"; import type { MetaRecord } from "../../../base/primary/meta-record.mjs"; +import type { RepositoryStatusProperty } from "../../properties/repository-status/repository-status-property.mjs"; +import type { ImmutableProperty } from "../../../base/auxiliary/property/immutable-property.mjs"; +import type { RepositoryDateProperty } from "../../properties/repository-date/repository-date-property.mjs"; interface BlankRecordInstantiationInterface> { metaRecord: MetaRecord; status: RepositoryStatusProperty; - uuid: UUIDv4PropertyType; + uuid: ImmutableProperty; registrationDate: RepositoryDateProperty; lastUpdateDate: RepositoryDateProperty; } diff --git a/packages/ddd/src/blank-record/properties/repository-date/_index.mts b/packages/ddd/src/blank-record/properties/repository-date/_index.mts index f35422d8..98bb3b42 100644 --- a/packages/ddd/src/blank-record/properties/repository-date/_index.mts +++ b/packages/ddd/src/blank-record/properties/repository-date/_index.mts @@ -1,5 +1,4 @@ export * from "./last-update-date-meta-property.mjs"; export * from "./registration-date-meta-property.mjs"; export * from "./repository-date-meta-property.mjs"; -export * from "./repository-date-property-definition.mjs"; export * from "./repository-date-property.mjs"; diff --git a/packages/ddd/src/blank-record/properties/repository-date/repository-date-meta-property.mts b/packages/ddd/src/blank-record/properties/repository-date/repository-date-meta-property.mts index e2fb61a9..fb4122c2 100644 --- a/packages/ddd/src/blank-record/properties/repository-date/repository-date-meta-property.mts +++ b/packages/ddd/src/blank-record/properties/repository-date/repository-date-meta-property.mts @@ -1,17 +1,24 @@ import { isNumber, isString } from "@vitruvius-labs/ts-predicate"; import type { PropertyInstantiationInterface } from "../../../base/auxiliary/property/definition/interface/property-instantiation.interface.mjs"; import type { TypeDefinition } from "../../../base/auxiliary/type-definition/type-definition.mjs"; -import { RepositoryDatePropertyDefinition } from "./repository-date-property-definition.mjs"; import { PredefinedMetaProperty } from "../../../base/auxiliary/meta-property/predefined-meta-property.mjs"; import { RepositoryDateProperty } from "./repository-date-property.mjs"; import { NullableTypeDefinition } from "../../../predefined-type/nullable/nullable-type-definition.mjs"; import { DateTypeDefinition } from "../../../predefined-type/date/date-type-definition.mjs"; +import { PropertyDefinition } from "../../../base/auxiliary/property-definition/property-definition.mjs"; -abstract class RepositoryDateMetaProperty extends PredefinedMetaProperty +/* eslint-disable @style/padding-line-between-statements */ +type T = Date | null; +type TD = TypeDefinition; +type PD = PropertyDefinition; +type P = RepositoryDateProperty; +/* eslint-enable @style/padding-line-between-statements */ + +abstract class RepositoryDateMetaProperty extends PredefinedMetaProperty { protected abstract getIdentifier(): string; - public override async normalize(value: unknown, type_definition: TypeDefinition): Promise + public override async normalize(value: unknown, type_definition: TD): Promise { if (isNumber(value) || isString(value)) { @@ -21,25 +28,28 @@ abstract class RepositoryDateMetaProperty extends PredefinedMetaProperty + // eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await + public async getTypeDefinition(): Promise { - const type_definition: TypeDefinition = new NullableTypeDefinition(new DateTypeDefinition()); + return new NullableTypeDefinition(new DateTypeDefinition()); + } - return new RepositoryDatePropertyDefinition({ + public async getPropertyDefinition(): Promise + { + return new PropertyDefinition({ identifier: this.getIdentifier(), - typeDefinition: type_definition, + typeDefinition: await this.getTypeDefinition(), }); } // eslint-disable-next-line @ts/class-methods-use-this - protected createProperty(parameters: PropertyInstantiationInterface): RepositoryDateProperty + protected createProperty(parameters: PropertyInstantiationInterface): P { return new RepositoryDateProperty(parameters); } // eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await - protected async getInitialValue(): Promise + protected async getInitialValue(): Promise { return null; } diff --git a/packages/ddd/src/blank-record/properties/repository-date/repository-date-property-definition.mts b/packages/ddd/src/blank-record/properties/repository-date/repository-date-property-definition.mts deleted file mode 100644 index 36361819..00000000 --- a/packages/ddd/src/blank-record/properties/repository-date/repository-date-property-definition.mts +++ /dev/null @@ -1,5 +0,0 @@ -import { PropertyDefinition } from "../../../base/auxiliary/property-definition/property-definition.mjs"; - -class RepositoryDatePropertyDefinition extends PropertyDefinition {} - -export { RepositoryDatePropertyDefinition }; diff --git a/packages/ddd/src/blank-record/properties/repository-date/repository-date-property.mts b/packages/ddd/src/blank-record/properties/repository-date/repository-date-property.mts index 5953ddba..0ba67595 100644 --- a/packages/ddd/src/blank-record/properties/repository-date/repository-date-property.mts +++ b/packages/ddd/src/blank-record/properties/repository-date/repository-date-property.mts @@ -1,7 +1,6 @@ import { Property } from "../../../base/auxiliary/property/property.mjs"; -import type { RepositoryDatePropertyDefinition } from "./repository-date-property-definition.mjs"; -class RepositoryDateProperty extends Property +class RepositoryDateProperty extends Property { // eslint-disable-next-line @ts/class-methods-use-this public override isMutable(): false diff --git a/packages/ddd/src/blank-record/properties/repository-status/_index.mts b/packages/ddd/src/blank-record/properties/repository-status/_index.mts index 1b49ba6f..9f5c559a 100644 --- a/packages/ddd/src/blank-record/properties/repository-status/_index.mts +++ b/packages/ddd/src/blank-record/properties/repository-status/_index.mts @@ -1,6 +1,4 @@ export * from "./definition/_index.mjs"; -export * from "./predicate/_index.mjs"; export * from "./repository-status-meta-property.mjs"; -export * from "./repository-status-property-definition.mjs"; export * from "./repository-status-property.mjs"; export * from "./repository-status-type-definition.mjs"; diff --git a/packages/ddd/src/blank-record/properties/repository-status/definition/_index.mts b/packages/ddd/src/blank-record/properties/repository-status/definition/_index.mts index 8c185feb..573e2b1d 100644 --- a/packages/ddd/src/blank-record/properties/repository-status/definition/_index.mts +++ b/packages/ddd/src/blank-record/properties/repository-status/definition/_index.mts @@ -1,2 +1 @@ -export type * from "./type/_index.mjs"; export * from "./enum/_index.mjs"; diff --git a/packages/ddd/src/blank-record/properties/repository-status/definition/type/_index.mts b/packages/ddd/src/blank-record/properties/repository-status/definition/type/_index.mts deleted file mode 100644 index 3bed1079..00000000 --- a/packages/ddd/src/blank-record/properties/repository-status/definition/type/_index.mts +++ /dev/null @@ -1 +0,0 @@ -export type * from "./repository-status-property.type.mjs"; diff --git a/packages/ddd/src/blank-record/properties/repository-status/definition/type/repository-status-property.type.mts b/packages/ddd/src/blank-record/properties/repository-status/definition/type/repository-status-property.type.mts deleted file mode 100644 index 6b06ed45..00000000 --- a/packages/ddd/src/blank-record/properties/repository-status/definition/type/repository-status-property.type.mts +++ /dev/null @@ -1,7 +0,0 @@ -import type { Property } from "../../../../../base/auxiliary/property/property.mjs"; -import type { RepositoryStatusEnum } from "../enum/repository-status.enum.mjs"; -import type { RepositoryStatusPropertyDefinition } from "../../repository-status-property-definition.mjs"; - -type RepositoryStatusPropertyType = Property; - -export type { RepositoryStatusPropertyType }; diff --git a/packages/ddd/src/blank-record/properties/repository-status/predicate/_index.mts b/packages/ddd/src/blank-record/properties/repository-status/predicate/_index.mts deleted file mode 100644 index 11569281..00000000 --- a/packages/ddd/src/blank-record/properties/repository-status/predicate/_index.mts +++ /dev/null @@ -1 +0,0 @@ -export * from "./assert-repository-status-enum.mjs"; diff --git a/packages/ddd/src/blank-record/properties/repository-status/predicate/assert-repository-status-enum.mts b/packages/ddd/src/blank-record/properties/repository-status/predicate/assert-repository-status-enum.mts deleted file mode 100644 index 96da70b8..00000000 --- a/packages/ddd/src/blank-record/properties/repository-status/predicate/assert-repository-status-enum.mts +++ /dev/null @@ -1,14 +0,0 @@ -import { assertEnumValue } from "@vitruvius-labs/ts-predicate"; -import { RepositoryStatusEnum } from "../definition/enum/repository-status.enum.mjs"; - -function assertRepositoryStatusEnum(value: unknown): asserts value is RepositoryStatusEnum -{ - assertEnumValue(value, [ - RepositoryStatusEnum.NEW, - RepositoryStatusEnum.SAVED, - RepositoryStatusEnum.ARCHIVED, - RepositoryStatusEnum.DESTROYED, - ]); -} - -export { assertRepositoryStatusEnum }; diff --git a/packages/ddd/src/blank-record/properties/repository-status/repository-status-meta-property.mts b/packages/ddd/src/blank-record/properties/repository-status/repository-status-meta-property.mts index 4007167e..63803bda 100644 --- a/packages/ddd/src/blank-record/properties/repository-status/repository-status-meta-property.mts +++ b/packages/ddd/src/blank-record/properties/repository-status/repository-status-meta-property.mts @@ -1,30 +1,42 @@ import type { PropertyInstantiationInterface } from "../../../base/auxiliary/property/definition/interface/property-instantiation.interface.mjs"; import { PredefinedMetaProperty } from "../../../base/auxiliary/meta-property/predefined-meta-property.mjs"; import { RepositoryStatusEnum } from "./definition/enum/repository-status.enum.mjs"; -import { RepositoryStatusPropertyDefinition } from "./repository-status-property-definition.mjs"; import { RepositoryStatusProperty } from "./repository-status-property.mjs"; import { BlankRecordPropertyEnum } from "../../definition/enum/blank-record-property.enum.mjs"; import { RepositoryStatusTypeDefinition } from "./repository-status-type-definition.mjs"; +import { PropertyDefinition } from "../../../base/auxiliary/property-definition/property-definition.mjs"; -class RepositoryStatusMetaProperty extends PredefinedMetaProperty +/* eslint-disable @style/padding-line-between-statements */ +type T = RepositoryStatusEnum; +type TD = RepositoryStatusTypeDefinition; +type PD = PropertyDefinition; +type P = RepositoryStatusProperty; +/* eslint-enable @style/padding-line-between-statements */ + +class RepositoryStatusMetaProperty extends PredefinedMetaProperty { // eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await - public async getPropertyDefinition(): Promise + public async getTypeDefinition(): Promise + { + return new RepositoryStatusTypeDefinition(); + } + + public async getPropertyDefinition(): Promise { - return new RepositoryStatusPropertyDefinition({ + return new PropertyDefinition({ identifier: BlankRecordPropertyEnum.REPOSITORY_STATUS, - typeDefinition: new RepositoryStatusTypeDefinition(), + typeDefinition: await this.getTypeDefinition(), }); } // eslint-disable-next-line @ts/class-methods-use-this - protected createProperty(parameters: PropertyInstantiationInterface): RepositoryStatusProperty + protected createProperty(parameters: PropertyInstantiationInterface): P { return new RepositoryStatusProperty(parameters); } // eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await - protected async getInitialValue(): Promise + protected async getInitialValue(): Promise { return RepositoryStatusEnum.NEW; } diff --git a/packages/ddd/src/blank-record/properties/repository-status/repository-status-property-definition.mts b/packages/ddd/src/blank-record/properties/repository-status/repository-status-property-definition.mts deleted file mode 100644 index 8d83d838..00000000 --- a/packages/ddd/src/blank-record/properties/repository-status/repository-status-property-definition.mts +++ /dev/null @@ -1,6 +0,0 @@ -import type { RepositoryStatusEnum } from "./definition/enum/repository-status.enum.mjs"; -import { PropertyDefinition } from "../../../base/auxiliary/property-definition/property-definition.mjs"; - -class RepositoryStatusPropertyDefinition extends PropertyDefinition {} - -export { RepositoryStatusPropertyDefinition }; diff --git a/packages/ddd/src/blank-record/properties/repository-status/repository-status-property.mts b/packages/ddd/src/blank-record/properties/repository-status/repository-status-property.mts index 6952a290..567ffd90 100644 --- a/packages/ddd/src/blank-record/properties/repository-status/repository-status-property.mts +++ b/packages/ddd/src/blank-record/properties/repository-status/repository-status-property.mts @@ -1,15 +1,15 @@ -import type { RepositoryStatusPropertyDefinition } from "./repository-status-property-definition.mjs"; +import { NoValue } from "@vitruvius-labs/ts-predicate"; import type { PropertyInstantiationInterface } from "../../../base/auxiliary/property/definition/interface/property-instantiation.interface.mjs"; +import type { EnumTypeDefinition } from "../../../predefined-type/enum/enum-type-definition.mjs"; import { Property } from "../../../base/auxiliary/property/property.mjs"; import { RepositoryStatusEnum } from "./definition/enum/repository-status.enum.mjs"; import { RepositoryActionEnum } from "./definition/enum/repository-action.enum.mjs"; -import { NoValue } from "@vitruvius-labs/ts-predicate"; -class RepositoryStatusProperty extends Property +class RepositoryStatusProperty extends Property> { protected action: RepositoryActionEnum; - public constructor(parameters: PropertyInstantiationInterface) + public constructor(parameters: PropertyInstantiationInterface>) { super(parameters); diff --git a/packages/ddd/src/blank-record/properties/repository-status/repository-status-type-definition.mts b/packages/ddd/src/blank-record/properties/repository-status/repository-status-type-definition.mts index 8b2dcbde..c2c17ce2 100644 --- a/packages/ddd/src/blank-record/properties/repository-status/repository-status-type-definition.mts +++ b/packages/ddd/src/blank-record/properties/repository-status/repository-status-type-definition.mts @@ -1,13 +1,17 @@ -import type { RepositoryStatusEnum } from "./definition/enum/repository-status.enum.mjs"; -import { RequiredTypeDefinition } from "../../../predefined-type/required/required-type-definition.mjs"; -import { assertRepositoryStatusEnum } from "./predicate/assert-repository-status-enum.mjs"; +import { RepositoryStatusEnum } from "./definition/enum/repository-status.enum.mjs"; +import { EnumTypeDefinition } from "../../../predefined-type/enum/enum-type-definition.mjs"; -class RepositoryStatusTypeDefinition extends RequiredTypeDefinition +class RepositoryStatusTypeDefinition extends EnumTypeDefinition { // eslint-disable-next-line @ts/class-methods-use-this - public assertType(value: unknown): asserts value is RepositoryStatusEnum + public getValues(): ReadonlyArray { - assertRepositoryStatusEnum(value); + return [ + RepositoryStatusEnum.NEW, + RepositoryStatusEnum.SAVED, + RepositoryStatusEnum.ARCHIVED, + RepositoryStatusEnum.DESTROYED, + ]; } } diff --git a/packages/ddd/src/blank-record/properties/uuid-v4/_index.mts b/packages/ddd/src/blank-record/properties/uuid-v4/_index.mts index 34fe3dde..2424d5cd 100644 --- a/packages/ddd/src/blank-record/properties/uuid-v4/_index.mts +++ b/packages/ddd/src/blank-record/properties/uuid-v4/_index.mts @@ -1,3 +1 @@ -export type * from "./definition/_index.mjs"; export * from "./uuid-v4-meta-property.mjs"; -export * from "./uuid-v4-property-definition.mjs"; diff --git a/packages/ddd/src/blank-record/properties/uuid-v4/definition/_index.mts b/packages/ddd/src/blank-record/properties/uuid-v4/definition/_index.mts deleted file mode 100644 index 343d0f1c..00000000 --- a/packages/ddd/src/blank-record/properties/uuid-v4/definition/_index.mts +++ /dev/null @@ -1 +0,0 @@ -export type * from "./type/_index.mjs"; diff --git a/packages/ddd/src/blank-record/properties/uuid-v4/definition/type/_index.mts b/packages/ddd/src/blank-record/properties/uuid-v4/definition/type/_index.mts deleted file mode 100644 index ac67799e..00000000 --- a/packages/ddd/src/blank-record/properties/uuid-v4/definition/type/_index.mts +++ /dev/null @@ -1 +0,0 @@ -export type * from "./uuid-v4-property.type.mjs"; diff --git a/packages/ddd/src/blank-record/properties/uuid-v4/definition/type/uuid-v4-property.type.mts b/packages/ddd/src/blank-record/properties/uuid-v4/definition/type/uuid-v4-property.type.mts deleted file mode 100644 index c71aef42..00000000 --- a/packages/ddd/src/blank-record/properties/uuid-v4/definition/type/uuid-v4-property.type.mts +++ /dev/null @@ -1,7 +0,0 @@ -import type { UUID } from "node:crypto"; -import type { ImmutableProperty } from "../../../../../base/auxiliary/property/immutable-property.mjs"; -import type { UUIDv4PropertyDefinition } from "../../uuid-v4-property-definition.mjs"; - -type UUIDv4PropertyType = ImmutableProperty; - -export type { UUIDv4PropertyType }; diff --git a/packages/ddd/src/blank-record/properties/uuid-v4/uuid-v4-meta-property.mts b/packages/ddd/src/blank-record/properties/uuid-v4/uuid-v4-meta-property.mts index 4db33115..2695c068 100644 --- a/packages/ddd/src/blank-record/properties/uuid-v4/uuid-v4-meta-property.mts +++ b/packages/ddd/src/blank-record/properties/uuid-v4/uuid-v4-meta-property.mts @@ -1,30 +1,43 @@ import { type UUID, randomUUID } from "node:crypto"; import type { PropertyInstantiationInterface } from "../../../base/auxiliary/property/definition/interface/property-instantiation.interface.mjs"; +import type { TypeDefinition } from "../../../base/auxiliary/type-definition/type-definition.mjs"; import { PredefinedMetaProperty } from "../../../base/auxiliary/meta-property/predefined-meta-property.mjs"; import { ImmutableProperty } from "../../../base/auxiliary/property/immutable-property.mjs"; -import { UUIDv4PropertyDefinition } from "./uuid-v4-property-definition.mjs"; import { BlankRecordPropertyEnum } from "../../definition/enum/blank-record-property.enum.mjs"; import { UUIDv4TypeDefinition } from "../../../predefined-type/uuid-v4/uuid-v4-type-definition.mjs"; +import { PropertyDefinition } from "../../../base/auxiliary/property-definition/property-definition.mjs"; -class UUIDv4MetaProperty extends PredefinedMetaProperty> +/* eslint-disable @style/padding-line-between-statements */ +type T = UUID; +type TD = TypeDefinition; +type PD = PropertyDefinition; +type P = ImmutableProperty; +/* eslint-enable @style/padding-line-between-statements */ + +class UUIDv4MetaProperty extends PredefinedMetaProperty { // eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await - public async getPropertyDefinition(): Promise + public async getTypeDefinition(): Promise + { + return new UUIDv4TypeDefinition(); + } + + public async getPropertyDefinition(): Promise { - return new UUIDv4PropertyDefinition({ + return new PropertyDefinition({ identifier: BlankRecordPropertyEnum.UUID, - typeDefinition: new UUIDv4TypeDefinition(), + typeDefinition: await this.getTypeDefinition(), }); } // eslint-disable-next-line @ts/class-methods-use-this - protected createProperty(parameters: PropertyInstantiationInterface): ImmutableProperty + protected createProperty(parameters: PropertyInstantiationInterface): P { return new ImmutableProperty(parameters); } // eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await - protected async getInitialValue(): Promise + protected async getInitialValue(): Promise { return randomUUID(); } diff --git a/packages/ddd/src/blank-record/properties/uuid-v4/uuid-v4-property-definition.mts b/packages/ddd/src/blank-record/properties/uuid-v4/uuid-v4-property-definition.mts deleted file mode 100644 index 323a2d72..00000000 --- a/packages/ddd/src/blank-record/properties/uuid-v4/uuid-v4-property-definition.mts +++ /dev/null @@ -1,6 +0,0 @@ -import type { UUID } from "node:crypto"; -import { PropertyDefinition } from "../../../base/auxiliary/property-definition/property-definition.mjs"; - -class UUIDv4PropertyDefinition extends PropertyDefinition {} - -export { UUIDv4PropertyDefinition }; diff --git a/packages/ddd/src/meta-property/_index.mts b/packages/ddd/src/meta-property/_index.mts new file mode 100644 index 00000000..7a8d8b95 --- /dev/null +++ b/packages/ddd/src/meta-property/_index.mts @@ -0,0 +1,2 @@ +export * from "./generic-immutable-meta-property.mjs"; +export * from "./generic-meta-property.mjs"; diff --git a/packages/ddd/src/meta-property/generic-immutable-meta-property.mts b/packages/ddd/src/meta-property/generic-immutable-meta-property.mts new file mode 100644 index 00000000..fa5d25aa --- /dev/null +++ b/packages/ddd/src/meta-property/generic-immutable-meta-property.mts @@ -0,0 +1,34 @@ +import type { TypeDefinition } from "../base/auxiliary/type-definition/type-definition.mjs"; +import type { PropertyInstantiationInterface } from "../base/auxiliary/property/definition/interface/property-instantiation.interface.mjs"; +import { MetaProperty } from "../base/auxiliary/meta-property/meta-property.mjs"; +import { PropertyDefinition } from "../base/auxiliary/property-definition/property-definition.mjs"; +import { ImmutableProperty } from "../base/auxiliary/property/immutable-property.mjs"; + +abstract class GenericImmutableMetaProperty< + T, + TD extends TypeDefinition = TypeDefinition +> extends MetaProperty< + T, + TD, + PropertyDefinition, + ImmutableProperty> +> +{ + protected abstract getIdentifier(): string; + + public async getPropertyDefinition(): Promise> + { + return new PropertyDefinition({ + identifier: this.getIdentifier(), + typeDefinition: await this.getTypeDefinition(), + }); + } + + // eslint-disable-next-line @ts/class-methods-use-this + protected createProperty(parameters: PropertyInstantiationInterface): ImmutableProperty> + { + return new ImmutableProperty(parameters); + } +} + +export { GenericImmutableMetaProperty }; diff --git a/packages/ddd/src/meta-property/generic-meta-property.mts b/packages/ddd/src/meta-property/generic-meta-property.mts new file mode 100644 index 00000000..f06afd41 --- /dev/null +++ b/packages/ddd/src/meta-property/generic-meta-property.mts @@ -0,0 +1,34 @@ +import type { TypeDefinition } from "../base/auxiliary/type-definition/type-definition.mjs"; +import type { PropertyInstantiationInterface } from "../base/auxiliary/property/definition/interface/property-instantiation.interface.mjs"; +import { MetaProperty } from "../base/auxiliary/meta-property/meta-property.mjs"; +import { PropertyDefinition } from "../base/auxiliary/property-definition/property-definition.mjs"; +import { Property } from "../base/auxiliary/property/property.mjs"; + +abstract class GenericMetaProperty< + T, + TD extends TypeDefinition = TypeDefinition +> extends MetaProperty< + T, + TD, + PropertyDefinition, + Property> +> +{ + protected abstract getIdentifier(): string; + + public async getPropertyDefinition(): Promise> + { + return new PropertyDefinition({ + identifier: this.getIdentifier(), + typeDefinition: await this.getTypeDefinition(), + }); + } + + // eslint-disable-next-line @ts/class-methods-use-this + protected createProperty(parameters: PropertyInstantiationInterface): Property> + { + return new Property(parameters); + } +} + +export { GenericMetaProperty };