From 7766235e547d69a12e05212a35db22286a034f5b Mon Sep 17 00:00:00 2001 From: Pablo Baleztena Date: Wed, 4 Sep 2024 19:21:45 -0300 Subject: [PATCH] [loom] Add basic domain models --- apps/loom/README.md | 3 ++ apps/loom/domain/package.json | 22 ++++++++++++ apps/loom/domain/src/entities/app.ts | 9 +++++ apps/loom/domain/src/entities/apps/web-app.ts | 13 +++++++ apps/loom/domain/src/entities/defaults.ts | 13 +++++++ apps/loom/domain/src/entities/environment.ts | 12 +++++++ apps/loom/domain/src/entities/index.ts | 0 apps/loom/domain/src/entities/permission.ts | 6 ++++ apps/loom/domain/src/entities/project.ts | 6 ++++ apps/loom/domain/src/entities/schema.ts | 36 +++++++++++++++++++ apps/loom/domain/src/entities/use-case.ts | 17 +++++++++ apps/loom/domain/src/entities/user-story.ts | 9 +++++ apps/loom/domain/src/entities/user-type.ts | 5 +++ .../use-cases/initialization/init-project.ts | 21 +++++++++++ apps/loom/domain/tsconfig.build.json | 15 ++++++++ apps/loom/domain/tsconfig.json | 4 +++ apps/loom/domain/vitest.config.ts | 10 ++++++ 17 files changed, 201 insertions(+) create mode 100644 apps/loom/README.md create mode 100644 apps/loom/domain/package.json create mode 100644 apps/loom/domain/src/entities/app.ts create mode 100644 apps/loom/domain/src/entities/apps/web-app.ts create mode 100644 apps/loom/domain/src/entities/defaults.ts create mode 100644 apps/loom/domain/src/entities/environment.ts create mode 100644 apps/loom/domain/src/entities/index.ts create mode 100644 apps/loom/domain/src/entities/permission.ts create mode 100644 apps/loom/domain/src/entities/project.ts create mode 100644 apps/loom/domain/src/entities/schema.ts create mode 100644 apps/loom/domain/src/entities/use-case.ts create mode 100644 apps/loom/domain/src/entities/user-story.ts create mode 100644 apps/loom/domain/src/entities/user-type.ts create mode 100644 apps/loom/domain/src/use-cases/initialization/init-project.ts create mode 100644 apps/loom/domain/tsconfig.build.json create mode 100644 apps/loom/domain/tsconfig.json create mode 100644 apps/loom/domain/vitest.config.ts diff --git a/apps/loom/README.md b/apps/loom/README.md new file mode 100644 index 0000000..27f9d32 --- /dev/null +++ b/apps/loom/README.md @@ -0,0 +1,3 @@ +# Loom + +Loom is the design tool for the `Fabric` framework. It is a web-based tool that allows you to create and manage and design every part of your systems diff --git a/apps/loom/domain/package.json b/apps/loom/domain/package.json new file mode 100644 index 0000000..3dda3e6 --- /dev/null +++ b/apps/loom/domain/package.json @@ -0,0 +1,22 @@ +{ + "name": "@loom/domain", + "type": "module", + "module": "dist/index.js", + "main": "dist/index.js", + "files": [ + "dist" + ], + "private": true, + "packageManager": "yarn@4.1.1", + "devDependencies": { + "typescript": "^5.5.4", + "vitest": "^2.0.5" + }, + "dependencies": { + "@ulthar/fabric-core": "workspace:^" + }, + "scripts": { + "test": "vitest", + "build": "tsc -p tsconfig.build.json" + } +} diff --git a/apps/loom/domain/src/entities/app.ts b/apps/loom/domain/src/entities/app.ts new file mode 100644 index 0000000..2ddb8c8 --- /dev/null +++ b/apps/loom/domain/src/entities/app.ts @@ -0,0 +1,9 @@ +import { Entity, SemVer } from "@ulthar/fabric-core"; +import { EnvironmentVariable } from "./environment.js"; + +export interface App extends Entity { + title: string; + version: SemVer; + description: string; + environment: EnvironmentVariable[]; +} diff --git a/apps/loom/domain/src/entities/apps/web-app.ts b/apps/loom/domain/src/entities/apps/web-app.ts new file mode 100644 index 0000000..2e02cf6 --- /dev/null +++ b/apps/loom/domain/src/entities/apps/web-app.ts @@ -0,0 +1,13 @@ +import { App } from "../app.js"; + +export const WebFramework = { + EXPRESS: "EXPRESS", + REACT: "REACT", + VUE: "VUE", + SVELTE: "SVELTE", +} as const; +export type WebFramework = (typeof WebFramework)[keyof typeof WebFramework]; + +export interface SSRWebApp extends App { + framework: WebFramework; +} diff --git a/apps/loom/domain/src/entities/defaults.ts b/apps/loom/domain/src/entities/defaults.ts new file mode 100644 index 0000000..115f5a9 --- /dev/null +++ b/apps/loom/domain/src/entities/defaults.ts @@ -0,0 +1,13 @@ +export const DefaultEnvironmentType = { + DEVELOPMENT: "DEVELOPMENT", + DEMO: "DEMO", + STAGING: "STAGING", + PRODUCTION: "PRODUCTION", +}; +export type DefaultEnvironmentType = keyof typeof DefaultEnvironmentType; + +export const DefaultUserType = { + ADMIN: "ADMIN", + REGULAR: "REGULAR", +}; +export type DefaultUserType = keyof typeof DefaultUserType; diff --git a/apps/loom/domain/src/entities/environment.ts b/apps/loom/domain/src/entities/environment.ts new file mode 100644 index 0000000..d04f8c8 --- /dev/null +++ b/apps/loom/domain/src/entities/environment.ts @@ -0,0 +1,12 @@ +import { ValueSchema } from "./schema.js"; + +export interface Environment { + name: string; + variables: EnvironmentVariable[]; +} + +export interface EnvironmentVariable extends ValueSchema { + name: string; + description: string; + isSecret: boolean; +} diff --git a/apps/loom/domain/src/entities/index.ts b/apps/loom/domain/src/entities/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/apps/loom/domain/src/entities/permission.ts b/apps/loom/domain/src/entities/permission.ts new file mode 100644 index 0000000..f70e960 --- /dev/null +++ b/apps/loom/domain/src/entities/permission.ts @@ -0,0 +1,6 @@ +import { Entity } from "@ulthar/fabric-core"; + +export interface Permission extends Entity { + name: string; + description: string; +} diff --git a/apps/loom/domain/src/entities/project.ts b/apps/loom/domain/src/entities/project.ts new file mode 100644 index 0000000..6744810 --- /dev/null +++ b/apps/loom/domain/src/entities/project.ts @@ -0,0 +1,6 @@ +export interface Project { + name: string; + description: string; + tags: string[]; + environmentTypes: string[]; +} diff --git a/apps/loom/domain/src/entities/schema.ts b/apps/loom/domain/src/entities/schema.ts new file mode 100644 index 0000000..27137c0 --- /dev/null +++ b/apps/loom/domain/src/entities/schema.ts @@ -0,0 +1,36 @@ +export interface ObjectSchema { + name: string; + description: string; + optional: boolean; + fields: (ArraySchema | ValueSchema | ObjectSchema)[]; +} + +export interface ArraySchema { + name: string; + description: string; + type: "ARRAY"; + itemSchema: ObjectSchema | ValueSchema; +} + +export interface ValueSchema { + name: string; + description: string; + optional: boolean; + type: ValueType; +} + +export const ValueType = { + STRING: "STRING", + EMAIL: "EMAIL", + NUMBER: "NUMBER", + BOOLEAN: "BOOLEAN", + URL: "URL", +} as const; +export type ValueType = keyof typeof ValueType; + +export const FieldType = { + ARRAY: "ARRAY", + OBJECT: "OBJECT", + ...ValueType, +} as const; +export type FieldType = keyof typeof FieldType; diff --git a/apps/loom/domain/src/entities/use-case.ts b/apps/loom/domain/src/entities/use-case.ts new file mode 100644 index 0000000..18ff69d --- /dev/null +++ b/apps/loom/domain/src/entities/use-case.ts @@ -0,0 +1,17 @@ +import { ObjectSchema } from "./schema.js"; + +export const UseCaseType = { + QUERY: "QUERY", + COMMAND: "COMMAND", +} as const; +export type UseCaseType = (typeof UseCaseType)[keyof typeof UseCaseType]; + +export interface UseCase { + name: string; + type: UseCaseType; + description: string; + requiredPermissions: string[]; + optionalPermissions: string[]; + payloadSchema: ObjectSchema; + responseSchema: ObjectSchema; +} diff --git a/apps/loom/domain/src/entities/user-story.ts b/apps/loom/domain/src/entities/user-story.ts new file mode 100644 index 0000000..2fbf3e5 --- /dev/null +++ b/apps/loom/domain/src/entities/user-story.ts @@ -0,0 +1,9 @@ +import { DefaultUserType } from "./defaults.js"; +import { UseCase } from "./use-case.js"; + +export interface UserStory { + name: string; + description: string; + userTypes: DefaultUserType | string; + useCases: UseCase[]; +} diff --git a/apps/loom/domain/src/entities/user-type.ts b/apps/loom/domain/src/entities/user-type.ts new file mode 100644 index 0000000..30a1f89 --- /dev/null +++ b/apps/loom/domain/src/entities/user-type.ts @@ -0,0 +1,5 @@ +import { Entity } from "@ulthar/fabric-core"; + +export interface UserType extends Entity { + name: string; +} diff --git a/apps/loom/domain/src/use-cases/initialization/init-project.ts b/apps/loom/domain/src/use-cases/initialization/init-project.ts new file mode 100644 index 0000000..7d43d1d --- /dev/null +++ b/apps/loom/domain/src/use-cases/initialization/init-project.ts @@ -0,0 +1,21 @@ +import { UnexpectedError, UseCaseDefinition } from "@ulthar/fabric-core"; + +export interface InitProjectRequestModel { + title: string; + description?: string; +} +export type InitProjectErrors = UnexpectedError; + +export const initProjectUseCase = { + name: "initProject", + isAuthRequired: true, + useCase: (async () => { + return {}; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + }) as any, +} as const satisfies UseCaseDefinition< + void, + InitProjectRequestModel, + void, + InitProjectErrors +>; diff --git a/apps/loom/domain/tsconfig.build.json b/apps/loom/domain/tsconfig.build.json new file mode 100644 index 0000000..7706c0e --- /dev/null +++ b/apps/loom/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/apps/loom/domain/tsconfig.json b/apps/loom/domain/tsconfig.json new file mode 100644 index 0000000..7a7fde8 --- /dev/null +++ b/apps/loom/domain/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../../tsconfig.json", + "exclude": ["dist", "node_modules"] +} diff --git a/apps/loom/domain/vitest.config.ts b/apps/loom/domain/vitest.config.ts new file mode 100644 index 0000000..f1362e1 --- /dev/null +++ b/apps/loom/domain/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + exclude: ["**/index.ts"], + }, + passWithNoTests: true, + }, +});