Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/ddd/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@vitruvius-labs/ddd",
"version": "0.1.2",
"version": "0.1.3",
"description": "",
"author": {
"name": "VitruviusLabs"
Expand Down
3 changes: 2 additions & 1 deletion packages/ddd/src/_index.mts
Original file line number Diff line number Diff line change
@@ -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";
Original file line number Diff line number Diff line change
@@ -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<unknown, PropertyDefinitionType, PropertyType>;
type MetaPropertyType = MetaProperty<unknown, TypeDefinitionType, PropertyDefinitionType, PropertyType>;

export type { MetaPropertyType };
15 changes: 11 additions & 4 deletions packages/ddd/src/base/auxiliary/meta-property/meta-property.mts
Original file line number Diff line number Diff line change
Expand Up @@ -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<T, PD extends PropertyDefinition<T> = PropertyDefinition<T>, P extends Property<T, PD> = Property<T, PD>>
abstract class MetaProperty<
T,
TD extends TypeDefinition<T> = TypeDefinition<T>,
PD extends PropertyDefinition<T, TD> = PropertyDefinition<T, TD>,
P extends Property<T, TD, PD> = Property<T, TD, PD>
>
{
public abstract getTypeDefinition(): Promise<TD>;

public abstract getPropertyDefinition(): Promise<PD>;

protected abstract createProperty(parameters: PropertyInstantiationInterface<T, PD>): P;
protected abstract createProperty(parameters: PropertyInstantiationInterface<T, TD, PD>): P;

public async createNewProperty(value: T): Promise<P>
{
Expand All @@ -26,7 +33,7 @@ abstract class MetaProperty<T, PD extends PropertyDefinition<T> = PropertyDefini
{
const property_definition: PD = await this.getPropertyDefinition();

const type_definition: TypeDefinition<T> = property_definition.getTypeDefinition();
const type_definition: TD = property_definition.getTypeDefinition();

const normalized_value: T = await this.normalize(value, type_definition);

Expand All @@ -42,7 +49,7 @@ abstract class MetaProperty<T, PD extends PropertyDefinition<T> = PropertyDefini
}

// eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await
public async normalize(value: unknown, type_definition: TypeDefinition<T>): Promise<T>
public async normalize(value: unknown, type_definition: TD): Promise<T>
{
type_definition.assertType(value);

Expand Down
Original file line number Diff line number Diff line change
@@ -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<T, PD extends PropertyDefinition<T> = PropertyDefinition<T>, P extends Property<T, PD> = Property<T, PD>> extends MetaProperty<T, PD, P>
abstract class PredefinedMetaProperty<
T,
TD extends TypeDefinition<T> = TypeDefinition<T>,
PD extends PropertyDefinition<T, TD> = PropertyDefinition<T, TD>,
P extends Property<T, TD, PD> = Property<T, TD, PD>
> extends MetaProperty<T, TD, PD, P>
{
protected abstract getInitialValue(): Promise<T>;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { TypeDefinition } from "../../../type-definition/type-definition.mjs";

interface PropertyDefinitionInstantiationInterface<T>
interface PropertyDefinitionInstantiationInterface<T, TD extends TypeDefinition<T>>
{
identifier: string;
typeDefinition: TypeDefinition<T>;
typeDefinition: TD;
}

export type { PropertyDefinitionInstantiationInterface };
Original file line number Diff line number Diff line change
@@ -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<unknown>;
type PropertyDefinitionType = PropertyDefinition<unknown, TypeDefinitionType>;

export type { PropertyDefinitionType };
Original file line number Diff line number Diff line change
Expand Up @@ -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<T>
class PropertyDefinition<T, TD extends TypeDefinition<T> = TypeDefinition<T>>
{
protected readonly identifier: string;
protected readonly typeDefinition: TypeDefinition<T>;
protected readonly typeDefinition: TD;

public constructor(parameters: PropertyDefinitionInstantiationInterface<T>)
public constructor(parameters: PropertyDefinitionInstantiationInterface<T, TD>)
{
this.identifier = parameters.identifier;
this.typeDefinition = parameters.typeDefinition;
Expand All @@ -18,7 +18,7 @@ class PropertyDefinition<T>
return this.identifier;
}

public getTypeDefinition(): TypeDefinition<T>
public getTypeDefinition(): TD
{
return this.typeDefinition;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import type { TypeDefinition } from "../../../type-definition/type-definition.mjs";
import type { PropertyDefinition } from "../../../property-definition/property-definition.mjs";

interface PropertyInstantiationInterface<T, PD extends PropertyDefinition<T>>
interface PropertyInstantiationInterface<
T,
TD extends TypeDefinition<T> = TypeDefinition<T>,
PD extends PropertyDefinition<T, TD> = PropertyDefinition<T, TD>
>
{
definition: PD;
value: T;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<unknown, PropertyDefinitionType>;
type PropertyType = Property<unknown, TypeDefinitionType, PropertyDefinitionType>;

export type { PropertyType };
Original file line number Diff line number Diff line change
@@ -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<T, PD extends PropertyDefinition<T> = PropertyDefinition<T>> extends Property<T, PD>
class ImmutableProperty<
T,
TD extends TypeDefinition<T> = TypeDefinition<T>,
PD extends PropertyDefinition<T, TD> = PropertyDefinition<T, TD>
> extends Property<T, TD, PD>
{
public constructor(parameters: PropertyInstantiationInterface<T, PD>)
public constructor(parameters: PropertyInstantiationInterface<T, TD, PD>)
{
super(parameters);

Expand Down
9 changes: 7 additions & 2 deletions packages/ddd/src/base/auxiliary/property/property.mts
Original file line number Diff line number Diff line change
@@ -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<T, PD extends PropertyDefinition<T> = PropertyDefinition<T>>
class Property<
T,
TD extends TypeDefinition<T> = TypeDefinition<T>,
PD extends PropertyDefinition<T, TD> = PropertyDefinition<T, TD>
>
{
private readonly definition: PD;
private mutability: boolean;
private value: T;
private previousValue: T | typeof NoValue;

public constructor(parameters: PropertyInstantiationInterface<T, PD>)
public constructor(parameters: PropertyInstantiationInterface<T, TD, PD>)
{
this.definition = parameters.definition;
this.mutability = true;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type * from "./type-definition.type.mjs";
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { TypeDefinition } from "../../type-definition.mjs";

type TypeDefinitionType = TypeDefinition<unknown>;

export type { TypeDefinitionType };
9 changes: 5 additions & 4 deletions packages/ddd/src/blank-record/blank-record.mts
Original file line number Diff line number Diff line change
@@ -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<M extends BlankRecord<M>> extends RepositoryRecord
{
protected readonly metaRecord: MetaRecord<M>;
protected readonly status: RepositoryStatusProperty;
protected readonly uuid: UUIDv4PropertyType;
protected readonly uuid: ImmutableProperty<UUID>;
protected readonly registrationDate: RepositoryDateProperty;
protected readonly lastUpdateDate: RepositoryDateProperty;

Expand All @@ -30,7 +31,7 @@ abstract class BlankRecord<M extends BlankRecord<M>> extends RepositoryRecord
return this.status;
}

public getUUID(): UUIDv4PropertyType
public getUUID(): ImmutableProperty<UUID>
{
return this.uuid;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<M extends BlankRecord<M>>
{
metaRecord: MetaRecord<M>;
status: RepositoryStatusProperty;
uuid: UUIDv4PropertyType;
uuid: ImmutableProperty<UUID>;
registrationDate: RepositoryDateProperty;
lastUpdateDate: RepositoryDateProperty;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Original file line number Diff line number Diff line change
@@ -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<Date | null, RepositoryDatePropertyDefinition, RepositoryDateProperty>
/* eslint-disable @style/padding-line-between-statements */
type T = Date | null;
type TD = TypeDefinition<Date | null>;
type PD = PropertyDefinition<Date | null>;
type P = RepositoryDateProperty;
/* eslint-enable @style/padding-line-between-statements */

abstract class RepositoryDateMetaProperty extends PredefinedMetaProperty<T, TD, PD, P>
{
protected abstract getIdentifier(): string;

public override async normalize(value: unknown, type_definition: TypeDefinition<Date | null>): Promise<Date | null>
public override async normalize(value: unknown, type_definition: TD): Promise<T>
{
if (isNumber(value) || isString(value))
{
Expand All @@ -21,25 +28,28 @@ abstract class RepositoryDateMetaProperty extends PredefinedMetaProperty<Date |
return await super.normalize(value, type_definition);
}

// eslint-disable-next-line @ts/require-await
public async getPropertyDefinition(): Promise<RepositoryDatePropertyDefinition>
// eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await
public async getTypeDefinition(): Promise<TD>
{
const type_definition: TypeDefinition<Date | null> = new NullableTypeDefinition(new DateTypeDefinition());
return new NullableTypeDefinition(new DateTypeDefinition());
}

return new RepositoryDatePropertyDefinition({
public async getPropertyDefinition(): Promise<PD>
{
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<Date | null, RepositoryDatePropertyDefinition>): RepositoryDateProperty
protected createProperty(parameters: PropertyInstantiationInterface<T>): P
{
return new RepositoryDateProperty(parameters);
}

// eslint-disable-next-line @ts/class-methods-use-this, @ts/require-await
protected async getInitialValue(): Promise<Date | null>
protected async getInitialValue(): Promise<T>
{
return null;
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<Date | null, RepositoryDatePropertyDefinition>
class RepositoryDateProperty extends Property<Date | null>
{
// eslint-disable-next-line @ts/class-methods-use-this
public override isMutable(): false
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
export type * from "./type/_index.mjs";
export * from "./enum/_index.mjs";

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading