diff --git a/packages/fabric/core/README.md b/packages/fabric/core/README.md index 9bd5c19..fb16799 100644 --- a/packages/fabric/core/README.md +++ b/packages/fabric/core/README.md @@ -1 +1 @@ -# @ulthar/fabric-core +# @fabric/core diff --git a/packages/fabric/core/package.json b/packages/fabric/core/package.json index 0263d15..fd94849 100644 --- a/packages/fabric/core/package.json +++ b/packages/fabric/core/package.json @@ -1,5 +1,5 @@ { - "name": "@ulthar/fabric-core", + "name": "@fabric/core", "type": "module", "module": "dist/index.js", "main": "dist/index.js", diff --git a/packages/fabric/core/src/domain/entity/files/index.ts b/packages/fabric/core/src/domain/entity/files/index.ts deleted file mode 100644 index ebe3117..0000000 --- a/packages/fabric/core/src/domain/entity/files/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./image-file.js"; -export * from "./stored-file.js"; diff --git a/packages/fabric/core/src/domain/entity/index.ts b/packages/fabric/core/src/domain/entity/index.ts deleted file mode 100644 index c42a26d..0000000 --- a/packages/fabric/core/src/domain/entity/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./entity.js"; diff --git a/packages/fabric/core/src/domain/index.ts b/packages/fabric/core/src/domain/index.ts deleted file mode 100644 index f227b7a..0000000 --- a/packages/fabric/core/src/domain/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./entity/index.js"; -export * from "./models/index.js"; -export * from "./security/index.js"; -export * from "./types/index.js"; -export * from "./use-case/index.js"; diff --git a/packages/fabric/core/src/index.ts b/packages/fabric/core/src/index.ts index ef61d0a..dbc3c9e 100644 --- a/packages/fabric/core/src/index.ts +++ b/packages/fabric/core/src/index.ts @@ -1,9 +1,7 @@ export * from "./array/index.js"; -export * from "./domain/index.js"; export * from "./error/index.js"; export * from "./record/index.js"; export * from "./result/index.js"; -export * from "./storage/index.js"; export * from "./time/index.js"; export * from "./types/index.js"; export * from "./variant/index.js"; diff --git a/packages/fabric/core/src/storage/state-store.ts b/packages/fabric/core/src/storage/state-store.ts deleted file mode 100644 index fdf8d2e..0000000 --- a/packages/fabric/core/src/storage/state-store.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ModelSchema } from "../domain/index.js"; -import { ModelToType } from "../domain/models/types/model-to-type.js"; -import { Keyof } from "../types/keyof.js"; -import { StoreQuery } from "./query/query.js"; - -export interface StateStore { - from>( - entityName: TEntityName, - ): StoreQuery>; -} diff --git a/packages/fabric/core/src/types/enum.ts b/packages/fabric/core/src/types/enum.ts index 0237c2e..fe3a94c 100644 --- a/packages/fabric/core/src/types/enum.ts +++ b/packages/fabric/core/src/types/enum.ts @@ -1 +1 @@ -export type EnumToValues> = T[keyof T]; +export type EnumToType> = T[keyof T]; diff --git a/packages/fabric/domain/README.md b/packages/fabric/domain/README.md new file mode 100644 index 0000000..e339422 --- /dev/null +++ b/packages/fabric/domain/README.md @@ -0,0 +1 @@ +# model diff --git a/packages/fabric/domain/package.json b/packages/fabric/domain/package.json new file mode 100644 index 0000000..913751b --- /dev/null +++ b/packages/fabric/domain/package.json @@ -0,0 +1,22 @@ +{ + "name": "@fabric/domain", + "type": "module", + "module": "dist/index.js", + "main": "dist/index.js", + "files": [ + "dist" + ], + "private": true, + "packageManager": "yarn@4.1.1", + "devDependencies": { + "typescript": "^5.6.2", + "vitest": "^2.1.1" + }, + "dependencies": { + "@fabric/core": "workspace:^" + }, + "scripts": { + "test": "vitest", + "build": "tsc -p tsconfig.build.json" + } +} diff --git a/packages/fabric/core/src/storage/errors/circular-dependency-error.ts b/packages/fabric/domain/src/errors/circular-dependency-error.ts similarity index 80% rename from packages/fabric/core/src/storage/errors/circular-dependency-error.ts rename to packages/fabric/domain/src/errors/circular-dependency-error.ts index 0896c8f..954c8f2 100644 --- a/packages/fabric/core/src/storage/errors/circular-dependency-error.ts +++ b/packages/fabric/domain/src/errors/circular-dependency-error.ts @@ -1,4 +1,4 @@ -import { TaggedError } from "../../error/tagged-error.js"; +import { TaggedError } from "@fabric/core"; export class CircularDependencyError extends TaggedError<"CircularDependencyError"> { context: { key: string; dep: string }; diff --git a/packages/fabric/core/src/storage/errors/index.ts b/packages/fabric/domain/src/errors/index.ts similarity index 100% rename from packages/fabric/core/src/storage/errors/index.ts rename to packages/fabric/domain/src/errors/index.ts diff --git a/packages/fabric/core/src/storage/errors/query-error.ts b/packages/fabric/domain/src/errors/query-error.ts similarity index 80% rename from packages/fabric/core/src/storage/errors/query-error.ts rename to packages/fabric/domain/src/errors/query-error.ts index 9c3dc83..fca7f63 100644 --- a/packages/fabric/core/src/storage/errors/query-error.ts +++ b/packages/fabric/domain/src/errors/query-error.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { TaggedError } from "../../error/tagged-error.js"; + +import { TaggedError } from "@fabric/core"; export class StoreQueryError extends TaggedError<"StoreQueryError"> { constructor( diff --git a/packages/fabric/core/src/domain/events/event.ts b/packages/fabric/domain/src/events/event.ts similarity index 67% rename from packages/fabric/core/src/domain/events/event.ts rename to packages/fabric/domain/src/events/event.ts index 22d0ac5..be843d1 100644 --- a/packages/fabric/core/src/domain/events/event.ts +++ b/packages/fabric/domain/src/events/event.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { PosixDate } from "../../time/posix-date.js"; -import { TaggedVariant } from "../../variant/variant.js"; +import { PosixDate, TaggedVariant } from "@fabric/core"; import { UUID } from "../types/uuid.js"; /** @@ -15,8 +14,7 @@ export interface Event /** * A stored event is an inmutable event, already stored, with it's version in the stream and timestamp. */ -export interface StoredEvent - extends Readonly> { +export type StoredEvent = Readonly & { readonly version: number; readonly timestamp: PosixDate; -} +}; diff --git a/packages/fabric/domain/src/events/index.ts b/packages/fabric/domain/src/events/index.ts new file mode 100644 index 0000000..8aad408 --- /dev/null +++ b/packages/fabric/domain/src/events/index.ts @@ -0,0 +1 @@ +export * from "./event.js"; diff --git a/packages/fabric/core/src/files/base-file.ts b/packages/fabric/domain/src/files/base-file.ts similarity index 100% rename from packages/fabric/core/src/files/base-file.ts rename to packages/fabric/domain/src/files/base-file.ts diff --git a/packages/fabric/core/src/files/bytes.ts b/packages/fabric/domain/src/files/bytes.ts similarity index 100% rename from packages/fabric/core/src/files/bytes.ts rename to packages/fabric/domain/src/files/bytes.ts diff --git a/packages/fabric/core/src/domain/entity/files/image-file.ts b/packages/fabric/domain/src/files/image-file.ts similarity index 72% rename from packages/fabric/core/src/domain/entity/files/image-file.ts rename to packages/fabric/domain/src/files/image-file.ts index 66a17c8..76d772c 100644 --- a/packages/fabric/core/src/domain/entity/files/image-file.ts +++ b/packages/fabric/domain/src/files/image-file.ts @@ -1,4 +1,4 @@ -import { ImageMimeType } from "../../../files/mime-type.js"; +import { ImageMimeType } from "./mime-type.js"; import { StoredFile } from "./stored-file.js"; /** diff --git a/packages/fabric/core/src/files/in-memory-file.ts b/packages/fabric/domain/src/files/in-memory-file.ts similarity index 74% rename from packages/fabric/core/src/files/in-memory-file.ts rename to packages/fabric/domain/src/files/in-memory-file.ts index 8c25367..4ec31ed 100644 --- a/packages/fabric/core/src/files/in-memory-file.ts +++ b/packages/fabric/domain/src/files/in-memory-file.ts @@ -1,4 +1,4 @@ -import { Base64String } from "../domain/types/base-64.js"; +import { Base64String } from "../types/base-64.js"; import { BaseFile } from "./base-file.js"; /** diff --git a/packages/fabric/core/src/files/index.ts b/packages/fabric/domain/src/files/index.ts similarity index 80% rename from packages/fabric/core/src/files/index.ts rename to packages/fabric/domain/src/files/index.ts index 3468cb7..381360a 100644 --- a/packages/fabric/core/src/files/index.ts +++ b/packages/fabric/domain/src/files/index.ts @@ -1,8 +1,10 @@ export * from "./base-file.js"; export * from "./bytes.js"; +export * from "./image-file.js"; export * from "./in-memory-file.js"; export * from "./invalid-file-type-error.js"; export * from "./is-in-memory-file.js"; export * from "./is-mime-type.js"; export * from "./media-file.js"; export * from "./mime-type.js"; +export * from "./stored-file.js"; diff --git a/packages/fabric/core/src/files/invalid-file-type-error.ts b/packages/fabric/domain/src/files/invalid-file-type-error.ts similarity index 71% rename from packages/fabric/core/src/files/invalid-file-type-error.ts rename to packages/fabric/domain/src/files/invalid-file-type-error.ts index 5bc5f11..66e63bb 100644 --- a/packages/fabric/core/src/files/invalid-file-type-error.ts +++ b/packages/fabric/domain/src/files/invalid-file-type-error.ts @@ -1,4 +1,4 @@ -import { TaggedError } from "../error/tagged-error.js"; +import { TaggedError } from "@fabric/core"; export class InvalidFileTypeError extends TaggedError<"InvalidFileTypeError"> { constructor() { diff --git a/packages/fabric/core/src/files/is-in-memory-file.ts b/packages/fabric/domain/src/files/is-in-memory-file.ts similarity index 93% rename from packages/fabric/core/src/files/is-in-memory-file.ts rename to packages/fabric/domain/src/files/is-in-memory-file.ts index 3adfc31..c3a07f0 100644 --- a/packages/fabric/core/src/files/is-in-memory-file.ts +++ b/packages/fabric/domain/src/files/is-in-memory-file.ts @@ -1,5 +1,5 @@ +import { isRecord } from "@fabric/core"; import validator from "validator"; -import { isRecord } from "../record/is-record.js"; import { InMemoryFile } from "./in-memory-file.js"; const { isBase64, isMimeType } = validator; diff --git a/packages/fabric/core/src/files/is-mime-type.spec.ts b/packages/fabric/domain/src/files/is-mime-type.spec.ts similarity index 100% rename from packages/fabric/core/src/files/is-mime-type.spec.ts rename to packages/fabric/domain/src/files/is-mime-type.spec.ts diff --git a/packages/fabric/core/src/files/is-mime-type.ts b/packages/fabric/domain/src/files/is-mime-type.ts similarity index 100% rename from packages/fabric/core/src/files/is-mime-type.ts rename to packages/fabric/domain/src/files/is-mime-type.ts diff --git a/packages/fabric/core/src/files/media-file.ts b/packages/fabric/domain/src/files/media-file.ts similarity index 74% rename from packages/fabric/core/src/files/media-file.ts rename to packages/fabric/domain/src/files/media-file.ts index 5c86a4e..9f1e4ce 100644 --- a/packages/fabric/core/src/files/media-file.ts +++ b/packages/fabric/domain/src/files/media-file.ts @@ -1,4 +1,4 @@ -import { StoredFile } from "../domain/entity/files/stored-file.js"; +import { StoredFile } from "./stored-file.js"; /** * Represents a media file, either an image, a video or an audio file. diff --git a/packages/fabric/core/src/files/mime-type.ts b/packages/fabric/domain/src/files/mime-type.ts similarity index 100% rename from packages/fabric/core/src/files/mime-type.ts rename to packages/fabric/domain/src/files/mime-type.ts diff --git a/packages/fabric/core/src/domain/entity/files/stored-file.ts b/packages/fabric/domain/src/files/stored-file.ts similarity index 57% rename from packages/fabric/core/src/domain/entity/files/stored-file.ts rename to packages/fabric/domain/src/files/stored-file.ts index 4ed5ff1..dbc71da 100644 --- a/packages/fabric/core/src/domain/entity/files/stored-file.ts +++ b/packages/fabric/domain/src/files/stored-file.ts @@ -1,5 +1,5 @@ -import { BaseFile } from "../../../files/base-file.js"; -import { Entity } from "../entity.js"; +import { Entity } from "../types/entity.js"; +import { BaseFile } from "./base-file.js"; /** * Represents a file as managed by the domain. diff --git a/packages/fabric/domain/src/index.ts b/packages/fabric/domain/src/index.ts new file mode 100644 index 0000000..8d7b7da --- /dev/null +++ b/packages/fabric/domain/src/index.ts @@ -0,0 +1,9 @@ +export * from "./errors/index.js"; +export * from "./events/index.js"; +export * from "./files/index.js"; +export * from "./models/index.js"; +export * from "./query/index.js"; +export * from "./security/index.js"; +export * from "./storage/index.js"; +export * from "./types/index.js"; +export * from "./use-case/index.js"; diff --git a/packages/fabric/core/src/domain/models/fields/base-field.ts b/packages/fabric/domain/src/models/fields/base-field.ts similarity index 100% rename from packages/fabric/core/src/domain/models/fields/base-field.ts rename to packages/fabric/domain/src/models/fields/base-field.ts diff --git a/packages/fabric/core/src/domain/models/fields/field-to-type.spec.ts b/packages/fabric/domain/src/models/fields/field-to-type.spec.ts similarity index 100% rename from packages/fabric/core/src/domain/models/fields/field-to-type.spec.ts rename to packages/fabric/domain/src/models/fields/field-to-type.spec.ts diff --git a/packages/fabric/core/src/domain/models/fields/field-to-type.ts b/packages/fabric/domain/src/models/fields/field-to-type.ts similarity index 100% rename from packages/fabric/core/src/domain/models/fields/field-to-type.ts rename to packages/fabric/domain/src/models/fields/field-to-type.ts diff --git a/packages/fabric/core/src/domain/models/fields/index.ts b/packages/fabric/domain/src/models/fields/index.ts similarity index 100% rename from packages/fabric/core/src/domain/models/fields/index.ts rename to packages/fabric/domain/src/models/fields/index.ts diff --git a/packages/fabric/core/src/domain/models/fields/integer.ts b/packages/fabric/domain/src/models/fields/integer.ts similarity index 85% rename from packages/fabric/core/src/domain/models/fields/integer.ts rename to packages/fabric/domain/src/models/fields/integer.ts index abfef7a..48b9a69 100644 --- a/packages/fabric/core/src/domain/models/fields/integer.ts +++ b/packages/fabric/domain/src/models/fields/integer.ts @@ -1,4 +1,4 @@ -import { TaggedVariant, VariantTag } from "../../../variant/variant.js"; +import { TaggedVariant, VariantTag } from "@fabric/core"; import { BaseField } from "./base-field.js"; export interface IntegerFieldOptions extends BaseField { diff --git a/packages/fabric/core/src/domain/models/fields/reference-field.spec.ts b/packages/fabric/domain/src/models/fields/reference-field.spec.ts similarity index 98% rename from packages/fabric/core/src/domain/models/fields/reference-field.spec.ts rename to packages/fabric/domain/src/models/fields/reference-field.spec.ts index 28e37b7..cbd58f7 100644 --- a/packages/fabric/core/src/domain/models/fields/reference-field.spec.ts +++ b/packages/fabric/domain/src/models/fields/reference-field.spec.ts @@ -1,5 +1,5 @@ +import { isError } from "@fabric/core"; import { describe, expect, it } from "vitest"; -import { isError } from "../../../error/is-error.js"; import { defineModel } from "../model.js"; import { Field } from "./index.js"; import { diff --git a/packages/fabric/core/src/domain/models/fields/reference-field.ts b/packages/fabric/domain/src/models/fields/reference-field.ts similarity index 89% rename from packages/fabric/core/src/domain/models/fields/reference-field.ts rename to packages/fabric/domain/src/models/fields/reference-field.ts index dd93f52..3d07b90 100644 --- a/packages/fabric/core/src/domain/models/fields/reference-field.ts +++ b/packages/fabric/domain/src/models/fields/reference-field.ts @@ -1,6 +1,4 @@ -import { TaggedError } from "../../../error/tagged-error.js"; -import { Result } from "../../../result/result.js"; -import { TaggedVariant, VariantTag } from "../../../variant/variant.js"; +import { Result, TaggedError, TaggedVariant, VariantTag } from "@fabric/core"; import { ModelSchema } from "../model-schema.js"; import { BaseField } from "./base-field.js"; diff --git a/packages/fabric/core/src/domain/models/fields/string-field.ts b/packages/fabric/domain/src/models/fields/string-field.ts similarity index 85% rename from packages/fabric/core/src/domain/models/fields/string-field.ts rename to packages/fabric/domain/src/models/fields/string-field.ts index b15f2e5..2df7b35 100644 --- a/packages/fabric/core/src/domain/models/fields/string-field.ts +++ b/packages/fabric/domain/src/models/fields/string-field.ts @@ -1,4 +1,4 @@ -import { TaggedVariant, VariantTag } from "../../../variant/variant.js"; +import { TaggedVariant, VariantTag } from "@fabric/core"; import { BaseField } from "./base-field.js"; export interface StringFieldOptions extends BaseField { diff --git a/packages/fabric/core/src/domain/models/fields/uuid-field.ts b/packages/fabric/domain/src/models/fields/uuid-field.ts similarity index 84% rename from packages/fabric/core/src/domain/models/fields/uuid-field.ts rename to packages/fabric/domain/src/models/fields/uuid-field.ts index 7eb717b..f4bcafc 100644 --- a/packages/fabric/core/src/domain/models/fields/uuid-field.ts +++ b/packages/fabric/domain/src/models/fields/uuid-field.ts @@ -1,4 +1,4 @@ -import { TaggedVariant, VariantTag } from "../../../variant/variant.js"; +import { TaggedVariant, VariantTag } from "@fabric/core"; import { BaseField } from "./base-field.js"; export interface UUIDFieldOptions extends BaseField { diff --git a/packages/fabric/core/src/domain/models/index.ts b/packages/fabric/domain/src/models/index.ts similarity index 100% rename from packages/fabric/core/src/domain/models/index.ts rename to packages/fabric/domain/src/models/index.ts diff --git a/packages/fabric/core/src/domain/models/model-schema.ts b/packages/fabric/domain/src/models/model-schema.ts similarity index 100% rename from packages/fabric/core/src/domain/models/model-schema.ts rename to packages/fabric/domain/src/models/model-schema.ts diff --git a/packages/fabric/core/src/domain/models/model.spec.ts b/packages/fabric/domain/src/models/model.spec.ts similarity index 100% rename from packages/fabric/core/src/domain/models/model.spec.ts rename to packages/fabric/domain/src/models/model.spec.ts diff --git a/packages/fabric/core/src/domain/models/model.ts b/packages/fabric/domain/src/models/model.ts similarity index 100% rename from packages/fabric/core/src/domain/models/model.ts rename to packages/fabric/domain/src/models/model.ts diff --git a/packages/fabric/core/src/domain/models/types/index.ts b/packages/fabric/domain/src/models/types/index.ts similarity index 100% rename from packages/fabric/core/src/domain/models/types/index.ts rename to packages/fabric/domain/src/models/types/index.ts diff --git a/packages/fabric/core/src/domain/models/types/model-field-names.ts b/packages/fabric/domain/src/models/types/model-field-names.ts similarity index 100% rename from packages/fabric/core/src/domain/models/types/model-field-names.ts rename to packages/fabric/domain/src/models/types/model-field-names.ts diff --git a/packages/fabric/core/src/domain/models/types/model-to-type.ts b/packages/fabric/domain/src/models/types/model-to-type.ts similarity index 100% rename from packages/fabric/core/src/domain/models/types/model-to-type.ts rename to packages/fabric/domain/src/models/types/model-to-type.ts diff --git a/packages/fabric/domain/src/query/aggregate-options.ts b/packages/fabric/domain/src/query/aggregate-options.ts new file mode 100644 index 0000000..361d650 --- /dev/null +++ b/packages/fabric/domain/src/query/aggregate-options.ts @@ -0,0 +1,24 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { Keyof, TaggedVariant } from "@fabric/core"; + +export type AggregateOptions = Record>; + +export type AggregateFn = CountAggregate; + +export interface CountAggregate extends TaggedVariant<"AggregateCount"> { + field: Keyof; +} +export interface SumAggregate extends TaggedVariant<"AggregateSum"> { + field: Keyof; +} +export interface AvgAggregate extends TaggedVariant<"AggregateAvg"> { + field: Keyof; +} + +export interface MinAggregate extends TaggedVariant<"AggregateMin"> { + field: Keyof; +} +export interface MaxAggregate extends TaggedVariant<"AggregateMax"> { + field: Keyof; +} diff --git a/packages/fabric/core/src/storage/query/filter-options.ts b/packages/fabric/domain/src/query/filter-options.ts similarity index 100% rename from packages/fabric/core/src/storage/query/filter-options.ts rename to packages/fabric/domain/src/query/filter-options.ts diff --git a/packages/fabric/core/src/storage/query/index.ts b/packages/fabric/domain/src/query/index.ts similarity index 100% rename from packages/fabric/core/src/storage/query/index.ts rename to packages/fabric/domain/src/query/index.ts diff --git a/packages/fabric/core/src/storage/query/order-by-options.ts b/packages/fabric/domain/src/query/order-by-options.ts similarity index 100% rename from packages/fabric/core/src/storage/query/order-by-options.ts rename to packages/fabric/domain/src/query/order-by-options.ts diff --git a/packages/fabric/core/src/storage/query/query-builder.ts b/packages/fabric/domain/src/query/query-builder.ts similarity index 77% rename from packages/fabric/core/src/storage/query/query-builder.ts rename to packages/fabric/domain/src/query/query-builder.ts index bedd4c6..94df580 100644 --- a/packages/fabric/core/src/storage/query/query-builder.ts +++ b/packages/fabric/domain/src/query/query-builder.ts @@ -1,9 +1,9 @@ -import { ModelSchema } from "../../domain/index.js"; -import { ModelToType } from "../../domain/models/types/model-to-type.js"; -import { AsyncResult } from "../../result/async-result.js"; -import { Keyof } from "../../types/index.js"; +import { AsyncResult, Keyof } from "@fabric/core"; import { StoreQueryError } from "../errors/query-error.js"; -import { StorageDriver } from "../storage-driver.js"; +import { ModelToType } from "../models/index.js"; +import { ModelSchema } from "../models/model-schema.js"; +import { StorageDriver } from "../storage/storage-driver.js"; +import { AggregateOptions } from "./aggregate-options.js"; import { FilterOptions } from "./filter-options.js"; import { OrderByOptions } from "./order-by-options.js"; import { @@ -24,6 +24,9 @@ export class QueryBuilder< private driver: StorageDriver, private query: QueryDefinition, ) {} + aggregate>(): SelectableQuery { + throw new Error("Method not implemented."); + } where(where: FilterOptions): StoreSortableQuery { this.query = { diff --git a/packages/fabric/core/src/storage/query/query.ts b/packages/fabric/domain/src/query/query.ts similarity index 91% rename from packages/fabric/core/src/storage/query/query.ts rename to packages/fabric/domain/src/query/query.ts index 608b7af..e55b0dd 100644 --- a/packages/fabric/core/src/storage/query/query.ts +++ b/packages/fabric/domain/src/query/query.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { AsyncResult } from "../../result/async-result.js"; -import { Keyof } from "../../types/keyof.js"; +import { AsyncResult, Keyof } from "@fabric/core"; import { StoreQueryError } from "../errors/query-error.js"; +import { AggregateOptions } from "./aggregate-options.js"; import { FilterOptions } from "./filter-options.js"; import { OrderByOptions } from "./order-by-options.js"; @@ -10,6 +10,8 @@ export interface StoreQuery { orderBy(opts: OrderByOptions): StoreLimitableQuery; limit(limit: number, offset?: number): SelectableQuery; + aggregate>(opts: K): SelectableQuery; + select(): AsyncResult; select>( keys: K[], diff --git a/packages/fabric/core/src/domain/security/index.ts b/packages/fabric/domain/src/security/index.ts similarity index 100% rename from packages/fabric/core/src/domain/security/index.ts rename to packages/fabric/domain/src/security/index.ts diff --git a/packages/fabric/core/src/domain/security/policy.ts b/packages/fabric/domain/src/security/policy.ts similarity index 100% rename from packages/fabric/core/src/domain/security/policy.ts rename to packages/fabric/domain/src/security/policy.ts diff --git a/packages/fabric/core/src/storage/event-store.ts b/packages/fabric/domain/src/storage/event-store.ts similarity index 66% rename from packages/fabric/core/src/storage/event-store.ts rename to packages/fabric/domain/src/storage/event-store.ts index c0fe1d3..6918397 100644 --- a/packages/fabric/core/src/storage/event-store.ts +++ b/packages/fabric/domain/src/storage/event-store.ts @@ -1,9 +1,7 @@ -import { Event } from "../domain/events/event.js"; -import { UUID } from "../domain/index.js"; -import { AsyncResult } from "../result/async-result.js"; -import { PosixDate } from "../time/posix-date.js"; -import { MaybePromise } from "../types/maybe-promise.js"; -import { StoreQueryError } from "./errors/query-error.js"; +import { AsyncResult, MaybePromise, PosixDate } from "@fabric/core"; +import { StoreQueryError } from "../errors/query-error.js"; +import { Event, StoredEvent } from "../events/event.js"; +import { UUID } from "../types/uuid.js"; export interface EventStore { getStream( @@ -36,8 +34,3 @@ export interface EventFilterOptions { limit?: number; offset?: number; } - -export type StoredEvent = TEvent & { - version: bigint; - timestamp: number; -}; diff --git a/packages/fabric/core/src/storage/index.ts b/packages/fabric/domain/src/storage/index.ts similarity index 60% rename from packages/fabric/core/src/storage/index.ts rename to packages/fabric/domain/src/storage/index.ts index a22b9df..cab4965 100644 --- a/packages/fabric/core/src/storage/index.ts +++ b/packages/fabric/domain/src/storage/index.ts @@ -1,5 +1,3 @@ -export * from "./errors/index.js"; export * from "./event-store.js"; -export * from "./query/index.js"; export * from "./state-store.js"; export * from "./storage-driver.js"; diff --git a/packages/fabric/domain/src/storage/state-store.ts b/packages/fabric/domain/src/storage/state-store.ts new file mode 100644 index 0000000..9df3acc --- /dev/null +++ b/packages/fabric/domain/src/storage/state-store.ts @@ -0,0 +1,18 @@ +import { Keyof } from "@fabric/core"; +import { ModelToType } from "../models/index.js"; +import { ModelSchema } from "../models/model-schema.js"; +import { QueryBuilder } from "../query/query-builder.js"; +import { StoreQuery } from "../query/query.js"; +import { StorageDriver } from "./storage-driver.js"; + +export class StateStore { + constructor(private driver: StorageDriver) {} + + from>( + entityName: TEntityName, + ): StoreQuery> { + return new QueryBuilder(this.driver, { + from: entityName, + }) as StoreQuery>; + } +} diff --git a/packages/fabric/core/src/storage/storage-driver.ts b/packages/fabric/domain/src/storage/storage-driver.ts similarity index 76% rename from packages/fabric/core/src/storage/storage-driver.ts rename to packages/fabric/domain/src/storage/storage-driver.ts index f80309a..02269da 100644 --- a/packages/fabric/core/src/storage/storage-driver.ts +++ b/packages/fabric/domain/src/storage/storage-driver.ts @@ -1,11 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { ModelSchema } from "../domain/index.js"; -import { UnexpectedError } from "../error/unexpected-error.js"; -import { AsyncResult } from "../result/async-result.js"; -import { CircularDependencyError } from "./errors/circular-dependency-error.js"; -import { StoreQueryError } from "./errors/query-error.js"; -import { QueryDefinition } from "./query/query.js"; +import { AsyncResult, UnexpectedError } from "@fabric/core"; +import { CircularDependencyError } from "../errors/circular-dependency-error.js"; +import { StoreQueryError } from "../errors/query-error.js"; +import { ModelSchema } from "../models/model-schema.js"; +import { QueryDefinition } from "../query/query.js"; export interface StorageDriver { /** diff --git a/packages/fabric/core/src/domain/types/base-64.ts b/packages/fabric/domain/src/types/base-64.ts similarity index 100% rename from packages/fabric/core/src/domain/types/base-64.ts rename to packages/fabric/domain/src/types/base-64.ts diff --git a/packages/fabric/core/src/domain/types/email.ts b/packages/fabric/domain/src/types/email.ts similarity index 100% rename from packages/fabric/core/src/domain/types/email.ts rename to packages/fabric/domain/src/types/email.ts diff --git a/packages/fabric/core/src/domain/entity/entity.ts b/packages/fabric/domain/src/types/entity.ts similarity index 83% rename from packages/fabric/core/src/domain/entity/entity.ts rename to packages/fabric/domain/src/types/entity.ts index 17d240e..7b2ffab 100644 --- a/packages/fabric/core/src/domain/entity/entity.ts +++ b/packages/fabric/domain/src/types/entity.ts @@ -1,4 +1,4 @@ -import { UUID } from "../types/uuid.js"; +import { UUID } from "./uuid.js"; /** * An entity is a domain object that is defined by its identity. diff --git a/packages/fabric/core/src/domain/types/index.ts b/packages/fabric/domain/src/types/index.ts similarity index 58% rename from packages/fabric/core/src/domain/types/index.ts rename to packages/fabric/domain/src/types/index.ts index ea45bfc..380f939 100644 --- a/packages/fabric/core/src/domain/types/index.ts +++ b/packages/fabric/domain/src/types/index.ts @@ -1,3 +1,5 @@ +export * from "./base-64.js"; export * from "./email.js"; +export * from "./entity.js"; export * from "./semver.js"; export * from "./uuid.js"; diff --git a/packages/fabric/core/src/domain/types/semver.ts b/packages/fabric/domain/src/types/semver.ts similarity index 100% rename from packages/fabric/core/src/domain/types/semver.ts rename to packages/fabric/domain/src/types/semver.ts diff --git a/packages/fabric/core/src/domain/types/uuid.ts b/packages/fabric/domain/src/types/uuid.ts similarity index 100% rename from packages/fabric/core/src/domain/types/uuid.ts rename to packages/fabric/domain/src/types/uuid.ts diff --git a/packages/fabric/core/src/domain/use-case/index.ts b/packages/fabric/domain/src/use-case/index.ts similarity index 100% rename from packages/fabric/core/src/domain/use-case/index.ts rename to packages/fabric/domain/src/use-case/index.ts diff --git a/packages/fabric/core/src/domain/use-case/use-case-definition.ts b/packages/fabric/domain/src/use-case/use-case-definition.ts similarity index 91% rename from packages/fabric/core/src/domain/use-case/use-case-definition.ts rename to packages/fabric/domain/src/use-case/use-case-definition.ts index 85c35dd..b7e9768 100644 --- a/packages/fabric/core/src/domain/use-case/use-case-definition.ts +++ b/packages/fabric/domain/src/use-case/use-case-definition.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { TaggedError } from "../../error/tagged-error.js"; +import { TaggedError } from "@fabric/core"; import { UseCase } from "./use-case.js"; export type UseCaseDefinition< diff --git a/packages/fabric/core/src/domain/use-case/use-case.ts b/packages/fabric/domain/src/use-case/use-case.ts similarity index 75% rename from packages/fabric/core/src/domain/use-case/use-case.ts rename to packages/fabric/domain/src/use-case/use-case.ts index 54610a5..de67136 100644 --- a/packages/fabric/core/src/domain/use-case/use-case.ts +++ b/packages/fabric/domain/src/use-case/use-case.ts @@ -1,5 +1,4 @@ -import { TaggedError } from "../../error/tagged-error.js"; -import { AsyncResult } from "../../result/async-result.js"; +import { AsyncResult, TaggedError } from "@fabric/core"; /** * A use case is a piece of domain logic that can be executed. diff --git a/packages/fabric/domain/src/utils/index.ts b/packages/fabric/domain/src/utils/index.ts new file mode 100644 index 0000000..245b7df --- /dev/null +++ b/packages/fabric/domain/src/utils/index.ts @@ -0,0 +1 @@ +export * from "./sort-by-dependencies.js"; diff --git a/packages/fabric/core/src/storage/utils/sort-by-dependencies.spec.ts b/packages/fabric/domain/src/utils/sort-by-dependencies.spec.ts similarity index 100% rename from packages/fabric/core/src/storage/utils/sort-by-dependencies.spec.ts rename to packages/fabric/domain/src/utils/sort-by-dependencies.spec.ts diff --git a/packages/fabric/core/src/storage/utils/sort-by-dependencies.ts b/packages/fabric/domain/src/utils/sort-by-dependencies.ts similarity index 95% rename from packages/fabric/core/src/storage/utils/sort-by-dependencies.ts rename to packages/fabric/domain/src/utils/sort-by-dependencies.ts index 17bf35e..8a7d2c9 100644 --- a/packages/fabric/core/src/storage/utils/sort-by-dependencies.ts +++ b/packages/fabric/domain/src/utils/sort-by-dependencies.ts @@ -1,4 +1,4 @@ -import { Result } from "../../result/result.js"; +import { Result } from "@fabric/core"; import { CircularDependencyError } from "../errors/circular-dependency-error.js"; export function sortByDependencies( diff --git a/packages/fabric/domain/tsconfig.build.json b/packages/fabric/domain/tsconfig.build.json new file mode 100644 index 0000000..7706c0e --- /dev/null +++ b/packages/fabric/domain/tsconfig.build.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "allowImportingTsExtensions": false, + "outDir": "dist" + }, + "exclude": [ + "src/**/*.spec.ts", + "dist", + "node_modules", + "coverage", + "vitest.config.ts" + ] +} diff --git a/packages/fabric/domain/tsconfig.json b/packages/fabric/domain/tsconfig.json new file mode 100644 index 0000000..7a7fde8 --- /dev/null +++ b/packages/fabric/domain/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../../tsconfig.json", + "exclude": ["dist", "node_modules"] +} diff --git a/packages/fabric/domain/vitest.config.ts b/packages/fabric/domain/vitest.config.ts new file mode 100644 index 0000000..f1362e1 --- /dev/null +++ b/packages/fabric/domain/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + exclude: ["**/index.ts"], + }, + passWithNoTests: true, + }, +}); diff --git a/packages/fabric/store-sqlite/package.json b/packages/fabric/store-sqlite/package.json index 0e25aba..b89b03f 100644 --- a/packages/fabric/store-sqlite/package.json +++ b/packages/fabric/store-sqlite/package.json @@ -13,7 +13,8 @@ "vitest": "^2.1.1" }, "dependencies": { - "@ulthar/fabric-core": "workspace:^", + "@fabric/core": "workspace:^", + "@fabric/domain": "workspace:^", "sqlite3": "^5.1.7" }, "scripts": { diff --git a/packages/fabric/store-sqlite/src/model-to-sql.ts b/packages/fabric/store-sqlite/src/model-to-sql.ts index e596463..2859b6c 100644 --- a/packages/fabric/store-sqlite/src/model-to-sql.ts +++ b/packages/fabric/store-sqlite/src/model-to-sql.ts @@ -1,10 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { - BaseField, - FieldDefinition, - ModelDefinition, - VariantTag, -} from "@ulthar/fabric-core"; +import { VariantTag } from "@fabric/core"; +import { BaseField, FieldDefinition, Model } from "@fabric/domain"; type FieldMap = { [K in FieldDefinition[VariantTag]]: ( @@ -23,6 +19,12 @@ const FieldMap: FieldMap = { modifiersFromOpts(f), ].join(" "); }, + IntegerField: function (): string { + throw new Error("Function not implemented."); + }, + ReferenceField: function (): string { + throw new Error("Function not implemented."); + }, }; function modifiersFromOpts(options: BaseField) { @@ -37,7 +39,7 @@ function fieldDefinitionToSQL(field: FieldDefinition) { } export function modelToSql( - model: ModelDefinition>, + model: Model>, ) { return Object.entries(model.fields) .map(([name, type]) => `${name} ${fieldDefinitionToSQL(type)}`) diff --git a/packages/fabric/store-sqlite/src/sqlite-driver.spec.ts b/packages/fabric/store-sqlite/src/sqlite-driver.spec.ts index 4331d9f..cd71e6c 100644 --- a/packages/fabric/store-sqlite/src/sqlite-driver.spec.ts +++ b/packages/fabric/store-sqlite/src/sqlite-driver.spec.ts @@ -1,4 +1,4 @@ -import { createModel, Field, isError } from "@ulthar/fabric-core"; +import { createModel, Field, isError } from "@fabric/core"; import { afterEach, beforeEach, describe, expect, test } from "vitest"; import { SQLiteStorageDriver } from "./sqlite-driver.js"; diff --git a/packages/fabric/store-sqlite/src/sqlite-driver.ts b/packages/fabric/store-sqlite/src/sqlite-driver.ts index 25e8b26..d900b00 100644 --- a/packages/fabric/store-sqlite/src/sqlite-driver.ts +++ b/packages/fabric/store-sqlite/src/sqlite-driver.ts @@ -1,15 +1,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { AsyncResult, UnexpectedError } from "@fabric/core"; +import { unlink } from "fs/promises"; + import { - AsyncResult, CircularDependencyError, - ModelDefinition, QueryDefinition, StorageDriver, StoreQueryError, - UnexpectedError, -} from "@ulthar/fabric-core"; -import { unlink } from "fs/promises"; - +} from "@fabric/domain"; import { Database, Statement } from "sqlite3"; import { modelToSql } from "./model-to-sql.js"; import { diff --git a/packages/templates/domain/package.json b/packages/templates/domain/package.json index b55616f..191826f 100644 --- a/packages/templates/domain/package.json +++ b/packages/templates/domain/package.json @@ -13,7 +13,8 @@ "vitest": "^2.1.1" }, "dependencies": { - "@ulthar/fabric-core": "workspace:^" + "@fabric/core": "workspace:^", + "@fabric/domain": "workspace:^" }, "scripts": { "test": "vitest", diff --git a/packages/templates/domain/src/security/permission.ts b/packages/templates/domain/src/security/permission.ts index a40047a..0f5c88a 100644 --- a/packages/templates/domain/src/security/permission.ts +++ b/packages/templates/domain/src/security/permission.ts @@ -1,4 +1,4 @@ -import { EnumToValues } from "@ulthar/fabric-core"; +import { EnumToType } from "@fabric/core"; /** * A permission is a string that represents a something that a user is allowed to do in the system. It should be in the form of: `ACTION_ENTITY`. @@ -7,4 +7,4 @@ import { EnumToValues } from "@ulthar/fabric-core"; */ export const Permission = {} as const; -export type Permission = EnumToValues; +export type Permission = EnumToType; diff --git a/packages/templates/domain/src/security/policy.ts b/packages/templates/domain/src/security/policy.ts index c6310f0..b70b6dd 100644 --- a/packages/templates/domain/src/security/policy.ts +++ b/packages/templates/domain/src/security/policy.ts @@ -1,4 +1,4 @@ -import { Policy } from "@ulthar/fabric-core"; +import { Policy } from "@fabric/domain"; import { Permission } from "./permission.js"; import { UserType } from "./users.js"; diff --git a/packages/templates/domain/src/security/users.ts b/packages/templates/domain/src/security/users.ts index 35ebcdf..301665a 100644 --- a/packages/templates/domain/src/security/users.ts +++ b/packages/templates/domain/src/security/users.ts @@ -1,4 +1,4 @@ -import { EnumToValues } from "@ulthar/fabric-core"; +import { EnumToType } from "@fabric/core"; /** * A User Type is a string that represents a user type. @@ -8,4 +8,4 @@ export const UserType = { // ADMIN: "ADMIN", // SPECIAL_USER: "SPECIAL_USER", }; -export type UserType = EnumToValues; +export type UserType = EnumToType; diff --git a/packages/templates/domain/src/use-cases.ts b/packages/templates/domain/src/use-cases.ts index 5c861f2..5cebd66 100644 --- a/packages/templates/domain/src/use-cases.ts +++ b/packages/templates/domain/src/use-cases.ts @@ -1,4 +1,4 @@ -import { UseCaseDefinition } from "@ulthar/fabric-core"; +import { UseCaseDefinition } from "@fabric/domain"; export const UseCases = [] as const satisfies UseCaseDefinition[]; diff --git a/packages/templates/lib/package.json b/packages/templates/lib/package.json index efe2e53..8338fb0 100644 --- a/packages/templates/lib/package.json +++ b/packages/templates/lib/package.json @@ -13,7 +13,7 @@ "vitest": "^2.1.1" }, "dependencies": { - "@ulthar/fabric-core": "workspace:^" + "@fabric/core": "workspace:^" }, "scripts": { "test": "vitest", diff --git a/yarn.lock b/yarn.lock index abc51d4..b4d4b7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -403,6 +403,27 @@ __metadata: languageName: node linkType: hard +"@fabric/core@workspace:^, @fabric/core@workspace:packages/fabric/core": + version: 0.0.0-use.local + resolution: "@fabric/core@workspace:packages/fabric/core" + dependencies: + "@types/validator": "npm:^13.12.2" + typescript: "npm:^5.6.2" + validator: "npm:^13.12.0" + vitest: "npm:^2.1.1" + languageName: unknown + linkType: soft + +"@fabric/domain@workspace:^, @fabric/domain@workspace:packages/fabric/domain": + version: 0.0.0-use.local + resolution: "@fabric/domain@workspace:packages/fabric/domain" + dependencies: + "@fabric/core": "workspace:^" + typescript: "npm:^5.6.2" + vitest: "npm:^2.1.1" + languageName: unknown + linkType: soft + "@gar/promisify@npm:^1.0.1": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -824,22 +845,11 @@ __metadata: languageName: node linkType: hard -"@ulthar/fabric-core@workspace:^, @ulthar/fabric-core@workspace:packages/fabric/core": - version: 0.0.0-use.local - resolution: "@ulthar/fabric-core@workspace:packages/fabric/core" - dependencies: - "@types/validator": "npm:^13.12.2" - typescript: "npm:^5.6.2" - validator: "npm:^13.12.0" - vitest: "npm:^2.1.1" - languageName: unknown - linkType: soft - "@ulthar/lib-template@workspace:packages/templates/lib": version: 0.0.0-use.local resolution: "@ulthar/lib-template@workspace:packages/templates/lib" dependencies: - "@ulthar/fabric-core": "workspace:^" + "@fabric/core": "workspace:^" typescript: "npm:^5.6.2" vitest: "npm:^2.1.1" languageName: unknown @@ -849,7 +859,8 @@ __metadata: version: 0.0.0-use.local resolution: "@ulthar/store-sqlite@workspace:packages/fabric/store-sqlite" dependencies: - "@ulthar/fabric-core": "workspace:^" + "@fabric/core": "workspace:^" + "@fabric/domain": "workspace:^" sqlite3: "npm:^5.1.7" typescript: "npm:^5.6.2" vitest: "npm:^2.1.1" @@ -860,7 +871,7 @@ __metadata: version: 0.0.0-use.local resolution: "@ulthar/template-domain@workspace:packages/templates/domain" dependencies: - "@ulthar/fabric-core": "workspace:^" + "@fabric/core": "workspace:^" typescript: "npm:^5.6.2" vitest: "npm:^2.1.1" languageName: unknown