From ca55503e665c57a118e7d023eb035ae6595fc4a3 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 22 Jul 2025 20:17:11 +0200 Subject: [PATCH] refactor/imports (#217) * refactored core and core/utils imports * refactored core and core/utils imports * refactored media imports * refactored auth imports * refactored data imports * updated package json exports, fixed mm config * fix tests --- app/__test__/api/DataApi.spec.ts | 4 +- app/__test__/auth/Authenticator.spec.ts | 44 +----- app/__test__/auth/authorize/authorize.spec.ts | 2 +- app/__test__/core/Registry.spec.ts | 4 +- app/__test__/core/object/SchemaObject.spec.ts | 4 +- app/__test__/data/DataController.spec.ts | 15 +-- app/__test__/data/data.test.ts | 10 +- app/__test__/data/helper.ts | 2 +- app/__test__/data/mutation.relation.test.ts | 13 +- app/__test__/data/mutation.simple.test.ts | 5 +- app/__test__/data/polymorphic.test.ts | 6 +- app/__test__/data/prototype.test.ts | 23 ++-- app/__test__/data/relations.test.ts | 21 +-- app/__test__/data/specs/Entity.spec.ts | 4 +- app/__test__/data/specs/EntityManager.spec.ts | 12 +- app/__test__/data/specs/JoinBuilder.spec.ts | 6 +- app/__test__/data/specs/Mutator.spec.ts | 14 +- app/__test__/data/specs/Repository.spec.ts | 17 +-- app/__test__/data/specs/SchemaManager.spec.ts | 6 +- app/__test__/data/specs/WhereBuilder.spec.ts | 2 +- app/__test__/data/specs/WithBuilder.spec.ts | 15 +-- .../data/specs/connection/Connection.spec.ts | 2 +- .../data/specs/fields/BooleanField.spec.ts | 5 +- .../data/specs/fields/DateField.spec.ts | 4 +- .../data/specs/fields/EnumField.spec.ts | 5 +- app/__test__/data/specs/fields/Field.spec.ts | 2 +- .../data/specs/fields/FieldIndex.spec.ts | 5 +- .../data/specs/fields/JsonField.spec.ts | 5 +- .../data/specs/fields/JsonSchemaField.spec.ts | 2 +- .../data/specs/fields/NumberField.spec.ts | 5 +- .../data/specs/fields/PrimaryField.spec.ts | 2 +- .../data/specs/fields/TextField.spec.ts | 2 +- .../specs/relations/EntityRelation.spec.ts | 8 +- app/__test__/flows/SubWorkflowTask.spec.ts | 2 +- app/__test__/flows/Task.spec.ts | 2 +- app/__test__/flows/inputs.test.ts | 2 +- app/__test__/flows/workflow-basic.test.ts | 2 +- app/__test__/helper.ts | 3 +- app/__test__/media/Storage.spec.ts | 2 +- app/__test__/modules/AppAuth.spec.ts | 5 +- app/__test__/modules/AppData.spec.ts | 2 +- app/__test__/modules/AppMedia.spec.ts | 5 +- app/__test__/modules/Module.spec.ts | 5 +- app/__test__/modules/ModuleManager.spec.ts | 6 +- app/__test__/modules/module-test-suite.ts | 10 +- app/build.ts | 9 +- app/package.json | 20 +-- app/src/Api.ts | 2 +- app/src/adapter/bun/bun.adapter.ts | 3 +- .../bun/connection/BunSqliteConnection.ts | 2 +- app/src/adapter/cloudflare/config.ts | 6 +- .../cloudflare/connection/D1Connection.ts | 2 +- .../cloudflare/connection/DoConnection.ts | 2 +- .../cloudflare/storage/StorageR2Adapter.ts | 13 +- app/src/adapter/index.ts | 9 +- .../node/connection/NodeSqliteConnection.ts | 2 +- app/src/adapter/node/node.adapter.ts | 5 +- .../node/storage/StorageLocalAdapter.ts | 11 +- app/src/adapter/sqlite/bun.ts | 2 +- app/src/adapter/sqlite/edge.ts | 2 +- app/src/adapter/sqlite/node.ts | 2 +- app/src/auth/AppAuth.ts | 15 ++- app/src/auth/api/AuthApi.ts | 4 +- app/src/auth/api/AuthController.ts | 12 +- app/src/auth/auth-permissions.ts | 2 +- app/src/auth/auth-schema.ts | 3 +- app/src/auth/authenticate/Authenticator.ts | 32 ++--- .../strategies/PasswordStrategy.ts | 10 +- .../auth/authenticate/strategies/Strategy.ts | 4 +- .../strategies/oauth/CustomOAuthStrategy.ts | 2 +- .../strategies/oauth/OAuthStrategy.ts | 12 +- app/src/auth/authorize/Guard.ts | 3 +- app/src/auth/authorize/Role.ts | 2 +- app/src/auth/errors.ts | 5 +- app/src/auth/index.ts | 22 --- app/src/auth/middlewares.ts | 4 +- app/src/cli/commands/create/create.ts | 2 +- app/src/cli/commands/run/run.ts | 7 +- app/src/cli/utils/telemetry.ts | 4 +- app/src/core/drivers/email/index.ts | 20 --- app/src/core/index.ts | 51 ------- app/src/core/object/SchemaObject.ts | 25 ++-- app/src/core/object/query/query.ts | 2 +- app/src/core/template/SimpleRenderer.spec.ts | 2 +- app/src/core/utils/console.ts | 4 +- app/src/core/utils/index.ts | 15 +++ app/src/core/utils/objects.ts | 36 +++-- .../core/{object => utils}/schema/index.ts | 2 +- .../core/{object => utils}/schema/secret.ts | 0 app/src/data/AppData.ts | 13 +- app/src/data/api/DataApi.ts | 5 +- app/src/data/api/DataController.ts | 13 +- app/src/data/connection/Connection.ts | 3 +- .../connection/sqlite/SqliteConnection.ts | 2 +- app/src/data/data-schema.ts | 2 +- app/src/data/entities/Entity.ts | 5 +- app/src/data/entities/EntityManager.ts | 4 +- app/src/data/entities/EntityTypescript.ts | 3 +- app/src/data/entities/Result.ts | 2 +- app/src/data/entities/mutation/Mutator.ts | 5 +- .../data/entities/mutation/MutatorResult.ts | 2 +- app/src/data/entities/query/Repository.ts | 3 +- app/src/data/entities/query/WhereBuilder.ts | 2 +- app/src/data/entities/query/WithBuilder.ts | 6 +- app/src/data/errors.ts | 5 +- app/src/data/events/index.ts | 4 +- app/src/data/fields/BooleanField.ts | 4 +- app/src/data/fields/DateField.ts | 2 +- app/src/data/fields/EnumField.ts | 4 +- app/src/data/fields/Field.ts | 3 +- app/src/data/fields/JsonField.ts | 4 +- app/src/data/fields/JsonSchemaField.ts | 4 +- app/src/data/fields/NumberField.ts | 4 +- app/src/data/fields/PrimaryField.ts | 5 +- app/src/data/fields/TextField.ts | 4 +- app/src/data/fields/VirtualField.ts | 2 +- app/src/data/fields/field-test-suite.ts | 2 +- app/src/data/helper.ts | 3 +- app/src/data/index.ts | 45 ------- app/src/data/permissions/index.ts | 2 +- app/src/data/relations/EntityRelation.ts | 5 +- app/src/data/relations/ManyToManyRelation.ts | 2 +- app/src/data/relations/ManyToOneRelation.ts | 5 +- app/src/data/relations/PolymorphicRelation.ts | 2 +- app/src/data/relations/RelationField.ts | 2 +- app/src/data/relations/RelationMutator.ts | 2 +- app/src/data/schema/SchemaManager.ts | 8 +- app/src/data/schema/constructor.ts | 3 +- app/src/data/server/query.spec.ts | 2 +- app/src/data/server/query.ts | 2 +- app/src/flows/AppFlows.ts | 3 +- app/src/flows/flows-schema.ts | 2 +- app/src/flows/flows/triggers/EventTrigger.ts | 2 +- app/src/flows/flows/triggers/HttpTrigger.ts | 2 +- app/src/flows/flows/triggers/Trigger.ts | 2 +- app/src/flows/tasks/Task.tsx | 2 +- app/src/flows/tasks/presets/FetchTask.ts | 2 +- app/src/flows/tasks/presets/LogTask.ts | 2 +- app/src/flows/tasks/presets/RenderTask.ts | 2 +- app/src/flows/tasks/presets/SubFlowTask.ts | 2 +- app/src/index.ts | 126 +++++++++++++++++- app/src/media/AppMedia.ts | 11 +- app/src/media/MediaField.ts | 2 +- app/src/media/api/MediaApi.ts | 3 +- app/src/media/api/MediaController.ts | 13 +- app/src/media/index.ts | 51 ------- app/src/media/media-permissions.ts | 2 +- app/src/media/media-registry.ts | 28 ++++ app/src/media/media-schema.ts | 7 +- app/src/media/storage/StorageAdapter.ts | 5 +- .../storage/adapters/adapter-test-suite.ts | 4 +- .../cloudinary/StorageCloudinaryAdapter.ts | 2 +- .../adapters/s3/StorageS3Adapter.spec.ts | 2 +- .../storage/adapters/s3/StorageS3Adapter.ts | 6 +- app/src/media/utils/index.ts | 2 +- app/src/modules/Controller.ts | 7 +- app/src/modules/Module.ts | 9 +- app/src/modules/ModuleApi.ts | 5 +- app/src/modules/ModuleHelper.ts | 15 +-- app/src/modules/ModuleManager.ts | 28 ++-- app/src/modules/permissions/index.ts | 2 +- app/src/modules/registries.ts | 2 +- app/src/modules/server/AdminController.tsx | 5 +- app/src/modules/server/AppServer.ts | 6 +- app/src/modules/server/SystemController.ts | 11 +- .../cloudflare/image-optimization.plugin.ts | 3 +- app/src/plugins/dev/sync-types.plugin.ts | 3 +- app/src/ui/client/ClientProvider.tsx | 2 +- app/src/ui/client/api/use-entity.ts | 7 +- app/src/ui/client/index.ts | 2 +- app/src/ui/client/schema/auth/use-auth.ts | 2 +- .../ui/client/schema/data/use-bknd-data.ts | 5 +- app/src/ui/client/schema/flows/use-flows.ts | 2 +- app/src/ui/client/utils/AppReduced.ts | 4 +- .../ui/components/form/Formy/components.tsx | 2 +- app/src/ui/elements/media/Dropzone.tsx | 2 +- .../ui/elements/media/DropzoneContainer.tsx | 3 +- app/src/ui/hooks/use-event.ts | 2 +- app/src/ui/hooks/use-search.ts | 3 +- app/src/ui/lib/routes.ts | 4 +- .../ui/modules/data/components/EntityForm.tsx | 29 ++-- .../modules/data/components/EntityTable.tsx | 2 +- .../modules/data/components/EntityTable2.tsx | 2 +- .../fields/EntityJsonSchemaFormField.tsx | 3 +- .../fields/EntityRelationalFormField.tsx | 3 +- .../components/schema/create-modal/schema.ts | 2 +- .../create-modal/step.entity.fields.tsx | 3 +- .../schema/create-modal/step.entity.tsx | 4 +- .../schema/create-modal/step.relation.tsx | 4 +- .../media/template.media.component.tsx | 3 +- .../ui/modules/data/hooks/useEntityForm.tsx | 2 +- .../flows/components/TriggerComponent.tsx | 2 +- .../flows/components/form/TemplateField.tsx | 4 +- .../components2/nodes/tasks/FetchTaskNode.tsx | 2 +- .../nodes/triggers/TriggerNode.tsx | 2 +- app/src/ui/routes/auth/auth.roles.tsx | 8 +- app/src/ui/routes/auth/auth.settings.tsx | 2 +- app/src/ui/routes/auth/auth.strategies.tsx | 2 +- app/src/ui/routes/auth/forms/role.form.tsx | 3 +- app/src/ui/routes/data/_data.root.tsx | 2 +- app/src/ui/routes/data/data.$entity.$id.tsx | 6 +- .../ui/routes/data/data.$entity.create.tsx | 4 +- app/src/ui/routes/data/data.$entity.index.tsx | 5 +- .../ui/routes/data/data.schema.$entity.tsx | 4 +- .../routes/data/forms/entity.fields.form.tsx | 9 +- app/src/ui/routes/flows/_flows.root.tsx | 2 +- .../flows/components/FlowCreateModal.tsx | 2 +- app/src/ui/routes/media/media.settings.tsx | 2 +- .../ui/routes/settings/components/Setting.tsx | 3 +- .../settings/components/SettingNewModal.tsx | 2 +- app/src/ui/routes/settings/utils/schema.ts | 3 +- .../test/tests/flow-create-schema-test.tsx | 2 +- .../routes/test/tests/react-hook-errors.tsx | 2 +- bun.lock | 4 +- 214 files changed, 680 insertions(+), 791 deletions(-) delete mode 100644 app/src/auth/index.ts delete mode 100644 app/src/core/index.ts rename app/src/core/{object => utils}/schema/index.ts (97%) rename app/src/core/{object => utils}/schema/secret.ts (100%) delete mode 100644 app/src/data/index.ts delete mode 100644 app/src/media/index.ts create mode 100644 app/src/media/media-registry.ts diff --git a/app/__test__/api/DataApi.spec.ts b/app/__test__/api/DataApi.spec.ts index c0eeb639..b0e19fd2 100644 --- a/app/__test__/api/DataApi.spec.ts +++ b/app/__test__/api/DataApi.spec.ts @@ -1,12 +1,12 @@ import { afterAll, beforeAll, describe, expect, it } from "bun:test"; -import { Guard } from "../../src/auth"; +import { Guard } from "../../src/auth/authorize/Guard"; import { DataApi } from "../../src/data/api/DataApi"; import { DataController } from "../../src/data/api/DataController"; import { dataConfigSchema } from "../../src/data/data-schema"; import * as proto from "../../src/data/prototype"; import { schemaToEm } from "../helper"; import { disableConsoleLog, enableConsoleLog } from "core/utils/test"; -import { parse } from "bknd/core"; +import { parse } from "core/utils/schema"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); diff --git a/app/__test__/auth/Authenticator.spec.ts b/app/__test__/auth/Authenticator.spec.ts index bb45f1d9..0794528e 100644 --- a/app/__test__/auth/Authenticator.spec.ts +++ b/app/__test__/auth/Authenticator.spec.ts @@ -1,45 +1,3 @@ import { describe, expect, test } from "bun:test"; -import { Authenticator, type User, type UserPool } from "../../src/auth"; -import { cookieConfig } from "../../src/auth/authenticate/Authenticator"; -import { PasswordStrategy } from "../../src/auth/authenticate/strategies/PasswordStrategy"; -import { parse } from "bknd/core"; -/*class MemoryUserPool implements UserPool { - constructor(private users: User[] = []) {} - - async findBy(prop: "id" | "email" | "username", value: string | number) { - return this.users.find((user) => user[prop] === value); - } - - async create(user: Pick) { - const id = this.users.length + 1; - const newUser = { ...user, id, username: user.email }; - this.users.push(newUser); - return newUser; - } -}*/ - -describe("Authenticator", async () => { - test("cookie options", async () => { - console.log("parsed", parse(cookieConfig, undefined)); - console.log(cookieConfig.template({})); - }); - /*const userpool = new MemoryUserPool([ - { id: 1, email: "d", username: "test", password: await hash.sha256("test") }, - ]); - - test("sha256 login", async () => { - const auth = new Authenticator(userpool, { - password: new PasswordStrategy({ - hashing: "sha256", - }), - }); - - const { token } = await auth.login("password", { email: "d", password: "test" }); - expect(token).toBeDefined(); - - const { iat, ...decoded } = decodeJwt(token); - expect(decoded).toEqual({ id: 1, email: "d", username: "test" }); - expect(await auth.verify(token)).toBe(true); - });*/ -}); +describe("Authenticator", async () => {}); diff --git a/app/__test__/auth/authorize/authorize.spec.ts b/app/__test__/auth/authorize/authorize.spec.ts index 45349695..c0e04ff9 100644 --- a/app/__test__/auth/authorize/authorize.spec.ts +++ b/app/__test__/auth/authorize/authorize.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { Guard } from "../../../src/auth"; +import { Guard } from "../../../src/auth/authorize/Guard"; describe("authorize", () => { test("basic", async () => { diff --git a/app/__test__/core/Registry.spec.ts b/app/__test__/core/Registry.spec.ts index 30f8cf87..cf9f68e8 100644 --- a/app/__test__/core/Registry.spec.ts +++ b/app/__test__/core/Registry.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test"; -import { Registry } from "core"; -import { s } from "bknd/core"; +import { Registry } from "core/registry/Registry"; +import { s } from "core/utils/schema"; type Constructor = new (...args: any[]) => T; diff --git a/app/__test__/core/object/SchemaObject.spec.ts b/app/__test__/core/object/SchemaObject.spec.ts index 687f450c..c73e0467 100644 --- a/app/__test__/core/object/SchemaObject.spec.ts +++ b/app/__test__/core/object/SchemaObject.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test"; -import { SchemaObject } from "../../../src/core"; -import { s } from "bknd/core"; +import { s } from "core/utils/schema"; +import { SchemaObject } from "core/object/SchemaObject"; describe("SchemaObject", async () => { test("basic", async () => { diff --git a/app/__test__/data/DataController.spec.ts b/app/__test__/data/DataController.spec.ts index be24ae12..ca4905d5 100644 --- a/app/__test__/data/DataController.spec.ts +++ b/app/__test__/data/DataController.spec.ts @@ -1,19 +1,16 @@ import { afterAll, beforeAll, describe, expect, test } from "bun:test"; -import { Guard } from "../../src/auth"; -import { parse } from "bknd/core"; -import { - Entity, - type EntityData, - EntityManager, - ManyToOneRelation, - TextField, -} from "../../src/data"; +import { Guard } from "../../src/auth/authorize/Guard"; +import { parse } from "core/utils/schema"; + import { DataController } from "../../src/data/api/DataController"; import { dataConfigSchema } from "../../src/data/data-schema"; import { disableConsoleLog, enableConsoleLog, getDummyConnection } from "../helper"; import type { RepositoryResultJSON } from "data/entities/query/RepositoryResult"; import type { MutatorResultJSON } from "data/entities/mutation/MutatorResult"; +import { Entity, EntityManager, type EntityData } from "data/entities"; +import { TextField } from "data/fields"; +import { ManyToOneRelation } from "data/relations"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); beforeAll(() => disableConsoleLog(["log", "warn"])); diff --git a/app/__test__/data/data.test.ts b/app/__test__/data/data.test.ts index 8032167f..10cf8ac9 100644 --- a/app/__test__/data/data.test.ts +++ b/app/__test__/data/data.test.ts @@ -1,12 +1,6 @@ import { afterAll, describe, expect, test } from "bun:test"; -import { - Entity, - EntityManager, - NumberField, - PrimaryField, - Repository, - TextField, -} from "../../src/data"; +import { Entity, EntityManager } from "data/entities"; +import { TextField, PrimaryField, NumberField } from "data/fields"; import { getDummyConnection } from "./helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/helper.ts b/app/__test__/data/helper.ts index df1ed889..09229dad 100644 --- a/app/__test__/data/helper.ts +++ b/app/__test__/data/helper.ts @@ -2,7 +2,7 @@ import { unlink } from "node:fs/promises"; import type { SqliteDatabase } from "kysely"; // @ts-ignore import Database from "libsql"; -import { SqliteLocalConnection } from "../../src/data"; +import { SqliteLocalConnection } from "data/connection/sqlite/SqliteLocalConnection"; export function getDummyDatabase(memory: boolean = true): { dummyDb: SqliteDatabase; diff --git a/app/__test__/data/mutation.relation.test.ts b/app/__test__/data/mutation.relation.test.ts index 57124b23..346355c0 100644 --- a/app/__test__/data/mutation.relation.test.ts +++ b/app/__test__/data/mutation.relation.test.ts @@ -1,13 +1,10 @@ // eslint-disable-next-line import/no-unresolved import { afterAll, describe, expect, test } from "bun:test"; -import { - Entity, - EntityManager, - ManyToOneRelation, - NumberField, - SchemaManager, - TextField, -} from "../../src/data"; +import { Entity } from "data/entities"; +import { EntityManager } from "data/entities/EntityManager"; +import { ManyToOneRelation } from "data/relations"; +import { NumberField, TextField } from "data/fields"; +import { SchemaManager } from "data/schema/SchemaManager"; import { getDummyConnection } from "./helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/mutation.simple.test.ts b/app/__test__/data/mutation.simple.test.ts index 93b17da2..e5e65ee0 100644 --- a/app/__test__/data/mutation.simple.test.ts +++ b/app/__test__/data/mutation.simple.test.ts @@ -1,7 +1,8 @@ // eslint-disable-next-line import/no-unresolved import { afterAll, describe, expect, test } from "bun:test"; -import { Entity, EntityManager, Mutator, NumberField, TextField } from "../../src/data"; -import { TransformPersistFailedException } from "../../src/data/errors"; +import { Entity, EntityManager } from "data/entities"; +import { NumberField, TextField } from "data/fields"; +import { TransformPersistFailedException } from "data/errors"; import { getDummyConnection } from "./helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/polymorphic.test.ts b/app/__test__/data/polymorphic.test.ts index ddc093b5..5777801b 100644 --- a/app/__test__/data/polymorphic.test.ts +++ b/app/__test__/data/polymorphic.test.ts @@ -1,6 +1,8 @@ import { afterAll, expect as bunExpect, describe, test } from "bun:test"; -import { stripMark } from "bknd/core"; -import { Entity, EntityManager, PolymorphicRelation, TextField } from "../../src/data"; +import { stripMark } from "core/utils/schema"; +import { Entity, EntityManager } from "data/entities"; +import { TextField } from "data/fields"; +import { PolymorphicRelation } from "data/relations"; import { getDummyConnection } from "./helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/prototype.test.ts b/app/__test__/data/prototype.test.ts index e0dfc7cc..843dc1c5 100644 --- a/app/__test__/data/prototype.test.ts +++ b/app/__test__/data/prototype.test.ts @@ -2,19 +2,20 @@ import { describe, expect, test } from "bun:test"; import { BooleanField, DateField, - Entity, - EntityIndex, - EntityManager, EnumField, JsonField, + NumberField, + TextField, + EntityIndex, +} from "data/fields"; +import { Entity, EntityManager } from "data/entities"; +import { ManyToManyRelation, ManyToOneRelation, - NumberField, OneToOneRelation, PolymorphicRelation, - TextField, -} from "../../src/data"; -import { DummyConnection } from "../../src/data/connection/DummyConnection"; +} from "data/relations"; +import { DummyConnection } from "data/connection/DummyConnection"; import { FieldPrototype, type FieldSchema, @@ -32,8 +33,8 @@ import { number, relation, text, -} from "../../src/data/prototype"; -import { MediaField } from "../../src/media/MediaField"; +} from "data/prototype"; +import { MediaField } from "media/MediaField"; describe("prototype", () => { test("...", () => { @@ -296,9 +297,9 @@ describe("prototype", () => { new Entity("posts", [new TextField("name"), new TextField("slug", { required: true })]), new Entity("comments", [new TextField("some")]), new Entity("users", [new TextField("email")]), - ]; + ] as const; const _em2 = new EntityManager( - es, + [...es], new DummyConnection(), [new ManyToOneRelation(es[0], es[1]), new ManyToOneRelation(es[0], es[2])], [ diff --git a/app/__test__/data/relations.test.ts b/app/__test__/data/relations.test.ts index 07ecd199..9080c45a 100644 --- a/app/__test__/data/relations.test.ts +++ b/app/__test__/data/relations.test.ts @@ -1,13 +1,14 @@ // eslint-disable-next-line import/no-unresolved import { afterAll, describe, expect, test } from "bun:test"; -import { Entity, EntityManager, TextField } from "../../src/data"; +import { Entity, EntityManager } from "data/entities"; +import { TextField } from "data/fields"; import { ManyToManyRelation, ManyToOneRelation, OneToOneRelation, PolymorphicRelation, RelationField, -} from "../../src/data/relations"; +} from "data/relations"; import { getDummyConnection } from "./helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); @@ -77,7 +78,7 @@ describe("Relations", async () => { const em = new EntityManager(entities, dummyConnection, relations); // verify naming - const rel = em.relations.all[0]; + const rel = em.relations.all[0]!; expect(rel.source.entity.name).toBe(posts.name); expect(rel.source.reference).toBe(posts.name); expect(rel.target.entity.name).toBe(users.name); @@ -89,11 +90,11 @@ describe("Relations", async () => { // verify low level relation expect(em.relationsOf(users.name).length).toBe(1); expect(em.relationsOf(users.name).length).toBe(1); - expect(em.relationsOf(users.name)[0].source.entity).toBe(posts); + expect(em.relationsOf(users.name)[0]!.source.entity).toBe(posts); expect(posts.field("author_id")).toBeInstanceOf(RelationField); expect(em.relationsOf(users.name).length).toBe(1); expect(em.relationsOf(users.name).length).toBe(1); - expect(em.relationsOf(users.name)[0].source.entity).toBe(posts); + expect(em.relationsOf(users.name)[0]!.source.entity).toBe(posts); // verify high level relation (from users) const userPostsRel = em.relationOf(users.name, "posts"); @@ -191,7 +192,7 @@ describe("Relations", async () => { const em = new EntityManager(entities, dummyConnection, relations); // verify naming - const rel = em.relations.all[0]; + const rel = em.relations.all[0]!; expect(rel.source.entity.name).toBe(users.name); expect(rel.source.reference).toBe(users.name); expect(rel.target.entity.name).toBe(settings.name); @@ -202,8 +203,8 @@ describe("Relations", async () => { expect(em.relationsOf(users.name).length).toBe(1); expect(em.relationsOf(users.name).length).toBe(1); - expect(em.relationsOf(users.name)[0].source.entity).toBe(users); - expect(em.relationsOf(users.name)[0].target.entity).toBe(settings); + expect(em.relationsOf(users.name)[0]!.source.entity).toBe(users); + expect(em.relationsOf(users.name)[0]!.target.entity).toBe(settings); // verify high level relation (from users) const userSettingRel = em.relationOf(users.name, settings.name); @@ -323,7 +324,7 @@ describe("Relations", async () => { ); // mutation info - expect(relations[0].helper(posts.name)!.getMutationInfo()).toEqual({ + expect(relations[0]!.helper(posts.name)!.getMutationInfo()).toEqual({ reference: "categories", local_field: undefined, $set: false, @@ -334,7 +335,7 @@ describe("Relations", async () => { cardinality: undefined, relation_type: "m:n", }); - expect(relations[0].helper(categories.name)!.getMutationInfo()).toEqual({ + expect(relations[0]!.helper(categories.name)!.getMutationInfo()).toEqual({ reference: "posts", local_field: undefined, $set: false, diff --git a/app/__test__/data/specs/Entity.spec.ts b/app/__test__/data/specs/Entity.spec.ts index 033d10b5..064db2d2 100644 --- a/app/__test__/data/specs/Entity.spec.ts +++ b/app/__test__/data/specs/Entity.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test"; -import { Entity, NumberField, TextField } from "data"; -import * as p from "data/prototype"; +import { Entity } from "data/entities"; +import { NumberField, TextField } from "data/fields"; describe("[data] Entity", async () => { const entity = new Entity("test", [ diff --git a/app/__test__/data/specs/EntityManager.spec.ts b/app/__test__/data/specs/EntityManager.spec.ts index 64019959..52cd76ff 100644 --- a/app/__test__/data/specs/EntityManager.spec.ts +++ b/app/__test__/data/specs/EntityManager.spec.ts @@ -1,12 +1,8 @@ import { afterAll, describe, expect, test } from "bun:test"; -import { - Entity, - EntityManager, - ManyToManyRelation, - ManyToOneRelation, - SchemaManager, -} from "../../../src/data"; -import { UnableToConnectException } from "../../../src/data/errors"; +import { Entity, EntityManager } from "data/entities"; +import { ManyToManyRelation, ManyToOneRelation } from "data/relations"; +import { SchemaManager } from "data/schema/SchemaManager"; +import { UnableToConnectException } from "data/errors"; import { getDummyConnection } from "../helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/specs/JoinBuilder.spec.ts b/app/__test__/data/specs/JoinBuilder.spec.ts index 9260aeb8..16f8d306 100644 --- a/app/__test__/data/specs/JoinBuilder.spec.ts +++ b/app/__test__/data/specs/JoinBuilder.spec.ts @@ -1,6 +1,8 @@ import { afterAll, describe, expect, test } from "bun:test"; -import { Entity, EntityManager, ManyToOneRelation, TextField } from "../../../src/data"; -import { JoinBuilder } from "../../../src/data/entities/query/JoinBuilder"; +import { Entity, EntityManager } from "data/entities"; +import { ManyToOneRelation } from "data/relations"; +import { TextField } from "data/fields"; +import { JoinBuilder } from "data/entities/query/JoinBuilder"; import { getDummyConnection } from "../helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/specs/Mutator.spec.ts b/app/__test__/data/specs/Mutator.spec.ts index d7f09e02..45bbb282 100644 --- a/app/__test__/data/specs/Mutator.spec.ts +++ b/app/__test__/data/specs/Mutator.spec.ts @@ -1,18 +1,16 @@ import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import type { EventManager } from "../../../src/core/events"; +import { Entity, EntityManager } from "data/entities"; import { - Entity, - EntityManager, ManyToOneRelation, - MutatorEvents, - NumberField, OneToOneRelation, - type RelationField, + RelationField, RelationMutator, - TextField, -} from "../../../src/data"; -import * as proto from "../../../src/data/prototype"; +} from "data/relations"; +import { NumberField, TextField } from "data/fields"; +import * as proto from "data/prototype"; import { getDummyConnection, disableConsoleLog, enableConsoleLog } from "../../helper"; +import { MutatorEvents } from "data/events"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); afterAll(afterAllCleanup); diff --git a/app/__test__/data/specs/Repository.spec.ts b/app/__test__/data/specs/Repository.spec.ts index 46bbf7ba..35c4ec56 100644 --- a/app/__test__/data/specs/Repository.spec.ts +++ b/app/__test__/data/specs/Repository.spec.ts @@ -1,17 +1,10 @@ import { afterAll, describe, expect, test } from "bun:test"; import type { Kysely, Transaction } from "kysely"; -import { Perf } from "core/utils"; -import { - Entity, - EntityManager, - LibsqlConnection, - ManyToOneRelation, - RepositoryEvents, - TextField, - entity as $entity, - text as $text, - em as $em, -} from "data"; +import { TextField } from "data/fields"; +import { em as $em, entity as $entity, text as $text } from "data/prototype"; +import { Entity, EntityManager } from "data/entities"; +import { ManyToOneRelation } from "data/relations"; +import { RepositoryEvents } from "data/events"; import { getDummyConnection } from "../helper"; type E = Kysely | Transaction; diff --git a/app/__test__/data/specs/SchemaManager.spec.ts b/app/__test__/data/specs/SchemaManager.spec.ts index 7c2322b9..679010ba 100644 --- a/app/__test__/data/specs/SchemaManager.spec.ts +++ b/app/__test__/data/specs/SchemaManager.spec.ts @@ -1,7 +1,9 @@ // eslint-disable-next-line import/no-unresolved import { afterAll, describe, expect, test } from "bun:test"; -import { randomString } from "../../../src/core/utils"; -import { Entity, EntityIndex, EntityManager, SchemaManager, TextField } from "../../../src/data"; +import { randomString } from "core/utils"; +import { Entity, EntityManager } from "data/entities"; +import { TextField, EntityIndex } from "data/fields"; +import { SchemaManager } from "data/schema/SchemaManager"; import { getDummyConnection } from "../helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/specs/WhereBuilder.spec.ts b/app/__test__/data/specs/WhereBuilder.spec.ts index a477cbed..98b822c1 100644 --- a/app/__test__/data/specs/WhereBuilder.spec.ts +++ b/app/__test__/data/specs/WhereBuilder.spec.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from "bun:test"; import { getDummyConnection } from "../helper"; -import { type WhereQuery, WhereBuilder } from "data"; +import { WhereBuilder, type WhereQuery } from "data/entities/query/WhereBuilder"; function qb() { const c = getDummyConnection(); diff --git a/app/__test__/data/specs/WithBuilder.spec.ts b/app/__test__/data/specs/WithBuilder.spec.ts index 568cf1fb..31cfd969 100644 --- a/app/__test__/data/specs/WithBuilder.spec.ts +++ b/app/__test__/data/specs/WithBuilder.spec.ts @@ -1,14 +1,9 @@ import { describe, expect, test } from "bun:test"; -import { - Entity, - EntityManager, - ManyToManyRelation, - ManyToOneRelation, - PolymorphicRelation, - TextField, - WithBuilder, -} from "../../../src/data"; -import * as proto from "../../../src/data/prototype"; +import { Entity, EntityManager } from "data/entities"; +import { ManyToManyRelation, ManyToOneRelation, PolymorphicRelation } from "data/relations"; +import { TextField } from "data/fields"; +import * as proto from "data/prototype"; +import { WithBuilder } from "data/entities/query/WithBuilder"; import { schemaToEm } from "../../helper"; import { getDummyConnection } from "../helper"; diff --git a/app/__test__/data/specs/connection/Connection.spec.ts b/app/__test__/data/specs/connection/Connection.spec.ts index d3e8226c..85ed6679 100644 --- a/app/__test__/data/specs/connection/Connection.spec.ts +++ b/app/__test__/data/specs/connection/Connection.spec.ts @@ -1,5 +1,5 @@ import { afterAll, describe, expect, test } from "bun:test"; -import { EntityManager } from "../../../../src/data"; +import { EntityManager } from "data/entities/EntityManager"; import { getDummyConnection } from "../../helper"; const { dummyConnection, afterAllCleanup } = getDummyConnection(); diff --git a/app/__test__/data/specs/fields/BooleanField.spec.ts b/app/__test__/data/specs/fields/BooleanField.spec.ts index a061e1fd..10de95a4 100644 --- a/app/__test__/data/specs/fields/BooleanField.spec.ts +++ b/app/__test__/data/specs/fields/BooleanField.spec.ts @@ -1,9 +1,10 @@ +import { bunTestRunner } from "adapter/bun/test"; import { describe, expect, test } from "bun:test"; -import { BooleanField } from "../../../../src/data"; +import { BooleanField } from "data/fields"; import { fieldTestSuite, transformPersist } from "data/fields/field-test-suite"; describe("[data] BooleanField", async () => { - fieldTestSuite({ expect, test }, BooleanField, { defaultValue: true, schemaType: "boolean" }); + fieldTestSuite(bunTestRunner, BooleanField, { defaultValue: true, schemaType: "boolean" }); test("transformRetrieve", async () => { const field = new BooleanField("test"); diff --git a/app/__test__/data/specs/fields/DateField.spec.ts b/app/__test__/data/specs/fields/DateField.spec.ts index dc548468..142c6d3d 100644 --- a/app/__test__/data/specs/fields/DateField.spec.ts +++ b/app/__test__/data/specs/fields/DateField.spec.ts @@ -1,5 +1,5 @@ -import { describe, expect, test } from "bun:test"; -import { DateField, dateFieldConfigSchema } from "../../../../src/data"; +import { describe, test } from "bun:test"; +import { DateField } from "data/fields"; import { fieldTestSuite } from "data/fields/field-test-suite"; import { bunTestRunner } from "adapter/bun/test"; diff --git a/app/__test__/data/specs/fields/EnumField.spec.ts b/app/__test__/data/specs/fields/EnumField.spec.ts index 066dd882..3bce5e60 100644 --- a/app/__test__/data/specs/fields/EnumField.spec.ts +++ b/app/__test__/data/specs/fields/EnumField.spec.ts @@ -1,5 +1,6 @@ +import { bunTestRunner } from "adapter/bun/test"; import { describe, expect, test } from "bun:test"; -import { EnumField } from "../../../../src/data"; +import { EnumField } from "data/fields"; import { fieldTestSuite, transformPersist } from "data/fields/field-test-suite"; function options(strings: string[]) { @@ -8,7 +9,7 @@ function options(strings: string[]) { describe("[data] EnumField", async () => { fieldTestSuite( - { expect, test }, + bunTestRunner, // @ts-ignore EnumField, { defaultValue: "a", schemaType: "text" }, diff --git a/app/__test__/data/specs/fields/Field.spec.ts b/app/__test__/data/specs/fields/Field.spec.ts index 0a279ac2..6c8245b4 100644 --- a/app/__test__/data/specs/fields/Field.spec.ts +++ b/app/__test__/data/specs/fields/Field.spec.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test"; import { baseFieldConfigSchema, Field } from "../../../../src/data/fields/Field"; import { fieldTestSuite } from "data/fields/field-test-suite"; import { bunTestRunner } from "adapter/bun/test"; -import { stripMark } from "bknd/core"; +import { stripMark } from "core/utils/schema"; describe("[data] Field", async () => { class FieldSpec extends Field { diff --git a/app/__test__/data/specs/fields/FieldIndex.spec.ts b/app/__test__/data/specs/fields/FieldIndex.spec.ts index b6e15d32..ab942146 100644 --- a/app/__test__/data/specs/fields/FieldIndex.spec.ts +++ b/app/__test__/data/specs/fields/FieldIndex.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "bun:test"; -import { Entity, EntityIndex, Field } from "../../../../src/data"; -import { s } from "bknd/core"; +import { Entity } from "data/entities"; +import { Field, EntityIndex } from "data/fields"; +import { s } from "core/utils/schema"; class TestField extends Field { protected getSchema(): any { diff --git a/app/__test__/data/specs/fields/JsonField.spec.ts b/app/__test__/data/specs/fields/JsonField.spec.ts index 0bc0d3b1..ff94dc3b 100644 --- a/app/__test__/data/specs/fields/JsonField.spec.ts +++ b/app/__test__/data/specs/fields/JsonField.spec.ts @@ -1,10 +1,11 @@ +import { bunTestRunner } from "adapter/bun/test"; import { describe, expect, test } from "bun:test"; -import { JsonField } from "../../../../src/data"; +import { JsonField } from "data/fields"; import { fieldTestSuite, transformPersist } from "data/fields/field-test-suite"; describe("[data] JsonField", async () => { const field = new JsonField("test"); - fieldTestSuite({ expect, test }, JsonField, { + fieldTestSuite(bunTestRunner, JsonField, { defaultValue: { a: 1 }, sampleValues: ["string", { test: 1 }, 1], schemaType: "text", diff --git a/app/__test__/data/specs/fields/JsonSchemaField.spec.ts b/app/__test__/data/specs/fields/JsonSchemaField.spec.ts index 77700986..809cb5ea 100644 --- a/app/__test__/data/specs/fields/JsonSchemaField.spec.ts +++ b/app/__test__/data/specs/fields/JsonSchemaField.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { JsonSchemaField } from "../../../../src/data"; +import { JsonSchemaField } from "data/fields"; import { fieldTestSuite } from "data/fields/field-test-suite"; describe("[data] JsonSchemaField", async () => { diff --git a/app/__test__/data/specs/fields/NumberField.spec.ts b/app/__test__/data/specs/fields/NumberField.spec.ts index e46c075e..ae50c108 100644 --- a/app/__test__/data/specs/fields/NumberField.spec.ts +++ b/app/__test__/data/specs/fields/NumberField.spec.ts @@ -1,5 +1,6 @@ +import { bunTestRunner } from "adapter/bun/test"; import { describe, expect, test } from "bun:test"; -import { NumberField } from "../../../../src/data"; +import { NumberField } from "data/fields"; import { fieldTestSuite, transformPersist } from "data/fields/field-test-suite"; describe("[data] NumberField", async () => { @@ -15,5 +16,5 @@ describe("[data] NumberField", async () => { expect(transformPersist(field2, 10000)).resolves.toBe(10000); }); - fieldTestSuite({ expect, test }, NumberField, { defaultValue: 12, schemaType: "integer" }); + fieldTestSuite(bunTestRunner, NumberField, { defaultValue: 12, schemaType: "integer" }); }); diff --git a/app/__test__/data/specs/fields/PrimaryField.spec.ts b/app/__test__/data/specs/fields/PrimaryField.spec.ts index c40ee149..cd1aafc8 100644 --- a/app/__test__/data/specs/fields/PrimaryField.spec.ts +++ b/app/__test__/data/specs/fields/PrimaryField.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { PrimaryField } from "../../../../src/data"; +import { PrimaryField } from "data/fields"; describe("[data] PrimaryField", async () => { const field = new PrimaryField("primary"); diff --git a/app/__test__/data/specs/fields/TextField.spec.ts b/app/__test__/data/specs/fields/TextField.spec.ts index 6a1bb96a..ee69cef8 100644 --- a/app/__test__/data/specs/fields/TextField.spec.ts +++ b/app/__test__/data/specs/fields/TextField.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { TextField, textFieldConfigSchema } from "../../../../src/data"; +import { TextField } from "data/fields"; import { fieldTestSuite, transformPersist } from "data/fields/field-test-suite"; import { bunTestRunner } from "adapter/bun/test"; diff --git a/app/__test__/data/specs/relations/EntityRelation.spec.ts b/app/__test__/data/specs/relations/EntityRelation.spec.ts index 62561b6d..489a5be0 100644 --- a/app/__test__/data/specs/relations/EntityRelation.spec.ts +++ b/app/__test__/data/specs/relations/EntityRelation.spec.ts @@ -1,11 +1,11 @@ import { describe, expect, it, test } from "bun:test"; -import { Entity, type EntityManager } from "../../../../src/data"; +import { Entity, type EntityManager } from "data/entities"; import { type BaseRelationConfig, EntityRelation, EntityRelationAnchor, RelationTypes, -} from "../../../../src/data/relations"; +} from "data/relations"; class TestEntityRelation extends EntityRelation { constructor(config?: BaseRelationConfig) { @@ -24,11 +24,11 @@ class TestEntityRelation extends EntityRelation { return this; } - buildWith(a: any, b: any, c: any): any { + buildWith(): any { return; } - buildJoin(a: any, b: any): any { + buildJoin(): any { return; } } diff --git a/app/__test__/flows/SubWorkflowTask.spec.ts b/app/__test__/flows/SubWorkflowTask.spec.ts index f1849f1f..2c8924af 100644 --- a/app/__test__/flows/SubWorkflowTask.spec.ts +++ b/app/__test__/flows/SubWorkflowTask.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test"; import { Flow, LogTask, SubFlowTask, RenderTask, Task } from "../../src/flows"; -import { s } from "bknd/core"; +import { s } from "core/utils/schema"; export class StringifyTask extends Task< typeof StringifyTask.schema, diff --git a/app/__test__/flows/Task.spec.ts b/app/__test__/flows/Task.spec.ts index 88d0b2cb..3f7674aa 100644 --- a/app/__test__/flows/Task.spec.ts +++ b/app/__test__/flows/Task.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test"; import { Task } from "../../src/flows"; import { dynamic } from "../../src/flows/tasks/Task"; -import { s } from "bknd/core"; +import { s } from "core/utils/schema"; describe.skip("Task", async () => { test("resolveParams: template with parse", async () => { diff --git a/app/__test__/flows/inputs.test.ts b/app/__test__/flows/inputs.test.ts index 66effa37..575bbc41 100644 --- a/app/__test__/flows/inputs.test.ts +++ b/app/__test__/flows/inputs.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test"; import { Hono } from "hono"; import { Event, EventManager } from "../../src/core/events"; -import { s, parse } from "bknd/core"; +import { s, parse } from "core/utils/schema"; import { EventTrigger, Flow, HttpTrigger, type InputsMap, Task } from "../../src/flows"; import { dynamic } from "../../src/flows/tasks/Task"; diff --git a/app/__test__/flows/workflow-basic.test.ts b/app/__test__/flows/workflow-basic.test.ts index cc916bdc..b766ef8c 100644 --- a/app/__test__/flows/workflow-basic.test.ts +++ b/app/__test__/flows/workflow-basic.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test"; import { isEqual } from "lodash-es"; import { _jsonp, withDisabledConsole } from "../../src/core/utils"; -import { s } from "bknd/core"; +import { s } from "core/utils/schema"; import { Condition, ExecutionEvent, FetchTask, Flow, LogTask, Task } from "../../src/flows"; /*beforeAll(disableConsoleLog); diff --git a/app/__test__/helper.ts b/app/__test__/helper.ts index ba09d4cb..1760d324 100644 --- a/app/__test__/helper.ts +++ b/app/__test__/helper.ts @@ -2,11 +2,12 @@ import { unlink } from "node:fs/promises"; import type { SelectQueryBuilder, SqliteDatabase } from "kysely"; import Database from "libsql"; import { format as sqlFormat } from "sql-formatter"; -import { type Connection, EntityManager, SqliteLocalConnection } from "../src/data"; import type { em as protoEm } from "../src/data/prototype"; import { writeFile } from "node:fs/promises"; import { join } from "node:path"; import { slugify } from "core/utils/strings"; +import { type Connection, SqliteLocalConnection } from "data/connection"; +import { EntityManager } from "data/entities/EntityManager"; export function getDummyDatabase(memory: boolean = true): { dummyDb: SqliteDatabase; diff --git a/app/__test__/media/Storage.spec.ts b/app/__test__/media/Storage.spec.ts index 12341238..b055e11e 100644 --- a/app/__test__/media/Storage.spec.ts +++ b/app/__test__/media/Storage.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test"; import { type FileBody, Storage } from "../../src/media/storage/Storage"; import * as StorageEvents from "../../src/media/storage/events"; -import { StorageAdapter } from "media"; +import { StorageAdapter } from "media/storage/StorageAdapter"; class TestAdapter extends StorageAdapter { files: Record = {}; diff --git a/app/__test__/modules/AppAuth.spec.ts b/app/__test__/modules/AppAuth.spec.ts index db43f74a..e523fbc4 100644 --- a/app/__test__/modules/AppAuth.spec.ts +++ b/app/__test__/modules/AppAuth.spec.ts @@ -1,10 +1,9 @@ import { afterAll, beforeAll, beforeEach, describe, expect, spyOn, test } from "bun:test"; import { createApp } from "core/test/utils"; import { AuthController } from "../../src/auth/api/AuthController"; -import { em, entity, make, text } from "../../src/data"; -import { AppAuth, type ModuleBuildContext } from "../../src/modules"; +import { em, entity, make, text } from "data/prototype"; +import { AppAuth, type ModuleBuildContext } from "modules"; import { disableConsoleLog, enableConsoleLog } from "../helper"; -// @ts-ignore import { makeCtx, moduleTestSuite } from "./module-test-suite"; describe("AppAuth", () => { diff --git a/app/__test__/modules/AppData.spec.ts b/app/__test__/modules/AppData.spec.ts index 4cefb6a7..96225838 100644 --- a/app/__test__/modules/AppData.spec.ts +++ b/app/__test__/modules/AppData.spec.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, test } from "bun:test"; -import { parse } from "bknd/core"; +import { parse } from "core/utils/schema"; import { fieldsSchema } from "../../src/data/data-schema"; import { AppData, type ModuleBuildContext } from "../../src/modules"; import { makeCtx, moduleTestSuite } from "./module-test-suite"; diff --git a/app/__test__/modules/AppMedia.spec.ts b/app/__test__/modules/AppMedia.spec.ts index 8fc5ffba..d09041b0 100644 --- a/app/__test__/modules/AppMedia.spec.ts +++ b/app/__test__/modules/AppMedia.spec.ts @@ -1,10 +1,9 @@ import { describe, expect, test } from "bun:test"; -import { registries } from "../../src"; import { createApp } from "core/test/utils"; -import { em, entity, text } from "../../src/data"; +import { em, entity, text } from "data/prototype"; +import { registries } from "modules/registries"; import { StorageLocalAdapter } from "adapter/node/storage/StorageLocalAdapter"; import { AppMedia } from "../../src/media/AppMedia"; -import { mediaConfigSchema } from "../../src/media/media-schema"; import { moduleTestSuite } from "./module-test-suite"; describe("AppMedia", () => { diff --git a/app/__test__/modules/Module.spec.ts b/app/__test__/modules/Module.spec.ts index 91ddc5be..6033c5a6 100644 --- a/app/__test__/modules/Module.spec.ts +++ b/app/__test__/modules/Module.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "bun:test"; -import { s, stripMark } from "bknd/core"; -import { EntityManager, em, entity, index, text } from "../../src/data"; +import { s, stripMark } from "core/utils/schema"; +import { em, entity, index, text } from "data/prototype"; +import { EntityManager } from "data/entities/EntityManager"; import { DummyConnection } from "../../src/data/connection/DummyConnection"; import { Module } from "../../src/modules/Module"; import { ModuleHelper } from "modules/ModuleHelper"; diff --git a/app/__test__/modules/ModuleManager.spec.ts b/app/__test__/modules/ModuleManager.spec.ts index 58ef02d3..9c24de01 100644 --- a/app/__test__/modules/ModuleManager.spec.ts +++ b/app/__test__/modules/ModuleManager.spec.ts @@ -1,11 +1,13 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; -import { Connection, entity, text } from "data"; + import { Module } from "modules/Module"; import { type ConfigTable, getDefaultConfig, ModuleManager } from "modules/ModuleManager"; import { CURRENT_VERSION, TABLE_NAME } from "modules/migrations"; import { getDummyConnection } from "../helper"; -import { s, stripMark } from "bknd/core"; +import { s, stripMark } from "core/utils/schema"; +import { Connection } from "data/connection/Connection"; +import { entity, text } from "data/prototype"; describe("ModuleManager", async () => { test("s1: no config, no build", async () => { diff --git a/app/__test__/modules/module-test-suite.ts b/app/__test__/modules/module-test-suite.ts index 2a514fb0..99dfcf51 100644 --- a/app/__test__/modules/module-test-suite.ts +++ b/app/__test__/modules/module-test-suite.ts @@ -1,11 +1,11 @@ import { beforeEach, describe, expect, it } from "bun:test"; import { Hono } from "hono"; -import { Guard } from "../../src/auth"; -import { DebugLogger } from "../../src/core"; -import { EventManager } from "../../src/core/events"; -import { EntityManager } from "../../src/data"; -import { Module, type ModuleBuildContext } from "../../src/modules/Module"; +import { Guard } from "auth/authorize/Guard"; +import { DebugLogger } from "core/utils/DebugLogger"; +import { EventManager } from "core/events"; +import { EntityManager } from "data/entities/EntityManager"; +import { Module, type ModuleBuildContext } from "modules/Module"; import { getDummyConnection } from "../helper"; import { ModuleHelper } from "modules/ModuleHelper"; diff --git a/app/build.ts b/app/build.ts index ba3c11f4..9b2ba2ea 100644 --- a/app/build.ts +++ b/app/build.ts @@ -79,14 +79,7 @@ async function buildApi() { sourcemap, watch, define, - entry: [ - "src/index.ts", - "src/core/index.ts", - "src/core/utils/index.ts", - "src/data/index.ts", - "src/media/index.ts", - "src/plugins/index.ts", - ], + entry: ["src/index.ts", "src/core/utils/index.ts", "src/plugins/index.ts"], outDir: "dist", external: [...external], metafile: true, diff --git a/app/package.json b/app/package.json index cc8b5f83..dc2a4618 100644 --- a/app/package.json +++ b/app/package.json @@ -99,7 +99,7 @@ "dotenv": "^16.4.7", "jotai": "^2.12.2", "jsdom": "^26.0.0", - "jsonv-ts": "^0.3.1", + "jsonv-ts": "^0.3.2", "kysely-d1": "^0.3.0", "kysely-generic-sqlite": "^1.2.1", "libsql-stateless-easy": "^1.8.0", @@ -160,16 +160,6 @@ "import": "./dist/ui/client/index.js", "require": "./dist/ui/client/index.js" }, - "./data": { - "types": "./dist/types/data/index.d.ts", - "import": "./dist/data/index.js", - "require": "./dist/data/index.js" - }, - "./core": { - "types": "./dist/types/core/index.d.ts", - "import": "./dist/core/index.js", - "require": "./dist/core/index.js" - }, "./utils": { "types": "./dist/types/core/utils/index.d.ts", "import": "./dist/core/utils/index.js", @@ -180,11 +170,6 @@ "import": "./dist/cli/index.js", "require": "./dist/cli/index.js" }, - "./media": { - "types": "./dist/types/media/index.d.ts", - "import": "./dist/media/index.js", - "require": "./dist/media/index.js" - }, "./plugins": { "types": "./dist/types/plugins/index.d.ts", "import": "./dist/plugins/index.js", @@ -255,11 +240,8 @@ }, "typesVersions": { "*": { - "data": ["./dist/types/data/index.d.ts"], - "core": ["./dist/types/core/index.d.ts"], "utils": ["./dist/types/core/utils/index.d.ts"], "cli": ["./dist/types/cli/index.d.ts"], - "media": ["./dist/types/media/index.d.ts"], "plugins": ["./dist/types/plugins/index.d.ts"], "adapter": ["./dist/types/adapter/index.d.ts"], "adapter/cloudflare": ["./dist/types/adapter/cloudflare/index.d.ts"], diff --git a/app/src/Api.ts b/app/src/Api.ts index 8c93d972..cce91562 100644 --- a/app/src/Api.ts +++ b/app/src/Api.ts @@ -1,4 +1,4 @@ -import type { SafeUser } from "auth"; +import type { SafeUser } from "bknd"; import { AuthApi, type AuthApiOptions } from "auth/api/AuthApi"; import { DataApi, type DataApiOptions } from "data/api/DataApi"; import { decode } from "hono/jwt"; diff --git a/app/src/adapter/bun/bun.adapter.ts b/app/src/adapter/bun/bun.adapter.ts index f6177eca..c3d271bd 100644 --- a/app/src/adapter/bun/bun.adapter.ts +++ b/app/src/adapter/bun/bun.adapter.ts @@ -3,10 +3,9 @@ import path from "node:path"; import { type RuntimeBkndConfig, createRuntimeApp, type RuntimeOptions } from "bknd/adapter"; import { registerLocalMediaAdapter } from "."; -import { config } from "bknd/core"; +import { config, type App } from "bknd"; import type { ServeOptions } from "bun"; import { serveStatic } from "hono/bun"; -import type { App } from "App"; type BunEnv = Bun.Env; export type BunBkndConfig = RuntimeBkndConfig & Omit; diff --git a/app/src/adapter/bun/connection/BunSqliteConnection.ts b/app/src/adapter/bun/connection/BunSqliteConnection.ts index 900b01d0..08444c5e 100644 --- a/app/src/adapter/bun/connection/BunSqliteConnection.ts +++ b/app/src/adapter/bun/connection/BunSqliteConnection.ts @@ -1,5 +1,5 @@ import { Database } from "bun:sqlite"; -import { genericSqlite, type GenericSqliteConnection } from "bknd/data"; +import { genericSqlite, type GenericSqliteConnection } from "bknd"; export type BunSqliteConnection = GenericSqliteConnection; export type BunSqliteConnectionConfig = { diff --git a/app/src/adapter/cloudflare/config.ts b/app/src/adapter/cloudflare/config.ts index 8dbfff6c..da5af078 100644 --- a/app/src/adapter/cloudflare/config.ts +++ b/app/src/adapter/cloudflare/config.ts @@ -1,16 +1,16 @@ /// +import { Connection } from "bknd"; +import { sqlite } from "bknd/adapter/sqlite"; +import { makeConfig as makeAdapterConfig } from "bknd/adapter"; import { registerMedia } from "./storage/StorageR2Adapter"; import { getBinding } from "./bindings"; import { d1Sqlite } from "./connection/D1Connection"; -import { Connection } from "bknd/data"; import type { CloudflareBkndConfig, CloudflareEnv } from "."; import { App } from "bknd"; -import { makeConfig as makeAdapterConfig } from "bknd/adapter"; import type { Context, ExecutionContext } from "hono"; import { $console } from "core/utils"; import { setCookie } from "hono/cookie"; -import { sqlite } from "bknd/adapter/sqlite"; export const constants = { exec_async_event_id: "cf_register_waituntil", diff --git a/app/src/adapter/cloudflare/connection/D1Connection.ts b/app/src/adapter/cloudflare/connection/D1Connection.ts index 3462461c..f2c2b753 100644 --- a/app/src/adapter/cloudflare/connection/D1Connection.ts +++ b/app/src/adapter/cloudflare/connection/D1Connection.ts @@ -1,6 +1,6 @@ /// -import { genericSqlite, type GenericSqliteConnection } from "bknd/data"; +import { genericSqlite, type GenericSqliteConnection } from "bknd"; import type { QueryResult } from "kysely"; export type D1SqliteConnection = GenericSqliteConnection; diff --git a/app/src/adapter/cloudflare/connection/DoConnection.ts b/app/src/adapter/cloudflare/connection/DoConnection.ts index de7d2910..91ae5ec6 100644 --- a/app/src/adapter/cloudflare/connection/DoConnection.ts +++ b/app/src/adapter/cloudflare/connection/DoConnection.ts @@ -1,6 +1,6 @@ /// -import { genericSqlite, type GenericSqliteConnection } from "bknd/data"; +import { genericSqlite, type GenericSqliteConnection } from "bknd"; import type { QueryResult } from "kysely"; export type D1SqliteConnection = GenericSqliteConnection; diff --git a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts index 4f895368..a1edf58a 100644 --- a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts +++ b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts @@ -1,8 +1,7 @@ -import { registries } from "bknd"; -import { isDebug } from "bknd/core"; -import { guessMimeType as guess, StorageAdapter, type FileBody } from "bknd/media"; +import { registries, isDebug, guessMimeType } from "bknd"; import { getBindings } from "../bindings"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; +import { StorageAdapter, type FileBody } from "bknd"; export function makeSchema(bindings: string[] = []) { return s.object( @@ -90,7 +89,7 @@ export class StorageR2Adapter extends StorageAdapter { const responseHeaders = new Headers({ "Accept-Ranges": "bytes", - "Content-Type": guess(key), + "Content-Type": guessMimeType(key), }); const range = headers.has("range"); @@ -142,7 +141,7 @@ export class StorageR2Adapter extends StorageAdapter { if (!metadata || Object.keys(metadata).length === 0) { // guessing is especially required for dev environment (miniflare) metadata = { - contentType: guess(object.key), + contentType: guessMimeType(object.key), }; } @@ -159,7 +158,7 @@ export class StorageR2Adapter extends StorageAdapter { } return { - type: String(head.httpMetadata?.contentType ?? guess(key)), + type: String(head.httpMetadata?.contentType ?? guessMimeType(key)), size: head.size, }; } diff --git a/app/src/adapter/index.ts b/app/src/adapter/index.ts index 713fb0f6..3082d43f 100644 --- a/app/src/adapter/index.ts +++ b/app/src/adapter/index.ts @@ -1,13 +1,8 @@ -import { App, type CreateAppConfig } from "bknd"; -import { config as $config } from "bknd/core"; +import { config as $config, App, type CreateAppConfig, Connection, guessMimeType } from "bknd"; import { $console } from "bknd/utils"; import type { Context, MiddlewareHandler, Next } from "hono"; import type { AdminControllerOptions } from "modules/server/AdminController"; -import { Connection } from "bknd/data"; import type { Manifest } from "vite"; -import { guessMimeType } from "media"; - -export { Connection } from "bknd/data"; export type BkndConfig = CreateAppConfig & { app?: CreateAppConfig | ((args: Args) => CreateAppConfig); @@ -74,7 +69,7 @@ export async function createAdapterApp = RuntimeBkndConfig & { diff --git a/app/src/adapter/node/storage/StorageLocalAdapter.ts b/app/src/adapter/node/storage/StorageLocalAdapter.ts index dcac0b15..fa3e3361 100644 --- a/app/src/adapter/node/storage/StorageLocalAdapter.ts +++ b/app/src/adapter/node/storage/StorageLocalAdapter.ts @@ -1,8 +1,7 @@ import { readFile, readdir, stat, unlink, writeFile } from "node:fs/promises"; -import { isFile } from "bknd/utils"; -import type { FileBody, FileListObject, FileMeta, FileUploadPayload } from "bknd/media"; -import { StorageAdapter, guessMimeType as guess } from "bknd/media"; -import { parse, s } from "bknd/core"; +import type { FileBody, FileListObject, FileMeta, FileUploadPayload } from "bknd"; +import { StorageAdapter, guessMimeType } from "bknd"; +import { parse, s, isFile } from "bknd/utils"; export const localAdapterConfig = s.object( { @@ -84,7 +83,7 @@ export class StorageLocalAdapter extends StorageAdapter { async getObject(key: string, headers: Headers): Promise { try { const content = await readFile(`${this.config.path}/${key}`); - const mimeType = guess(key); + const mimeType = guessMimeType(key); return new Response(content, { status: 200, @@ -106,7 +105,7 @@ export class StorageLocalAdapter extends StorageAdapter { async getObjectMeta(key: string): Promise { const stats = await stat(`${this.config.path}/${key}`); return { - type: guess(key) || "application/octet-stream", + type: guessMimeType(key) || "application/octet-stream", size: stats.size, }; } diff --git a/app/src/adapter/sqlite/bun.ts b/app/src/adapter/sqlite/bun.ts index 6d549181..46cd5993 100644 --- a/app/src/adapter/sqlite/bun.ts +++ b/app/src/adapter/sqlite/bun.ts @@ -1,4 +1,4 @@ -import type { Connection } from "bknd/data"; +import type { Connection } from "bknd"; import { bunSqlite } from "../bun/connection/BunSqliteConnection"; export function sqlite(config?: { url: string }): Connection { diff --git a/app/src/adapter/sqlite/edge.ts b/app/src/adapter/sqlite/edge.ts index f5b584f2..6c0f041b 100644 --- a/app/src/adapter/sqlite/edge.ts +++ b/app/src/adapter/sqlite/edge.ts @@ -1,4 +1,4 @@ -import { type Connection, libsql } from "bknd/data"; +import { type Connection, libsql } from "bknd"; export function sqlite(config: { url: string }): Connection { return libsql(config); diff --git a/app/src/adapter/sqlite/node.ts b/app/src/adapter/sqlite/node.ts index f14a8569..cf0982da 100644 --- a/app/src/adapter/sqlite/node.ts +++ b/app/src/adapter/sqlite/node.ts @@ -1,4 +1,4 @@ -import type { Connection } from "bknd/data"; +import type { Connection } from "bknd"; import { nodeSqlite } from "../node/connection/NodeSqliteConnection"; export function sqlite(config?: { url: string }): Connection { diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index 992f8a4d..8ee54237 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -1,8 +1,9 @@ -import { Authenticator, AuthPermissions, Role, type Strategy } from "auth"; -import type { PasswordStrategy } from "auth/authenticate/strategies"; -import type { DB } from "core"; +import type { DB } from "bknd"; +import * as AuthPermissions from "auth/auth-permissions"; +import type { AuthStrategy } from "auth/authenticate/strategies/Strategy"; +import type { PasswordStrategy } from "auth/authenticate/strategies/PasswordStrategy"; import { $console, secureRandomString, transformObject } from "core/utils"; -import type { Entity, EntityManager } from "data"; +import type { Entity, EntityManager } from "data/entities"; import { em, entity, enumm, type FieldSchema } from "data/prototype"; import { Module } from "modules/Module"; import { AuthController } from "./api/AuthController"; @@ -10,9 +11,11 @@ import { type AppAuthSchema, authConfigSchema, STRATEGIES } from "./auth-schema" import { AppUserPool } from "auth/AppUserPool"; import type { AppEntity } from "core/config"; import { usersFields } from "./auth-entities"; +import { Authenticator } from "./authenticate/Authenticator"; +import { Role } from "./authorize/Role"; export type UserFieldSchema = FieldSchema; -declare module "core" { +declare module "bknd" { interface Users extends AppEntity, UserFieldSchema {} interface DB { users: Users; @@ -88,7 +91,7 @@ export class AppAuth extends Module { this.ctx.guard.registerPermissions(AuthPermissions); } - isStrategyEnabled(strategy: Strategy | string) { + isStrategyEnabled(strategy: AuthStrategy | string) { const name = typeof strategy === "string" ? strategy : strategy.getName(); // for now, password is always active if (name === "password") return true; diff --git a/app/src/auth/api/AuthApi.ts b/app/src/auth/api/AuthApi.ts index 91b3c176..cd22ada4 100644 --- a/app/src/auth/api/AuthApi.ts +++ b/app/src/auth/api/AuthApi.ts @@ -1,6 +1,6 @@ import type { AuthActionResponse } from "auth/api/AuthController"; import type { AppAuthSchema } from "auth/auth-schema"; -import type { AuthResponse, SafeUser, Strategy } from "auth/authenticate/Authenticator"; +import type { AuthResponse, SafeUser, AuthStrategy } from "bknd"; import { type BaseModuleApiOptions, ModuleApi } from "modules/ModuleApi"; export type AuthApiOptions = BaseModuleApiOptions & { @@ -39,7 +39,7 @@ export class AuthApi extends ModuleApi { } async actionSchema(strategy: string, action: string) { - return this.get([strategy, "actions", action, "schema.json"]); + return this.get([strategy, "actions", action, "schema.json"]); } async action(strategy: string, action: string, input: any) { diff --git a/app/src/auth/api/AuthController.ts b/app/src/auth/api/AuthController.ts index 332df980..b0396352 100644 --- a/app/src/auth/api/AuthController.ts +++ b/app/src/auth/api/AuthController.ts @@ -1,9 +1,11 @@ -import { type AppAuth, AuthPermissions, type SafeUser, type Strategy } from "auth"; -import { transformObject } from "core/utils"; -import { DataPermissions } from "data"; +import type { SafeUser } from "bknd"; +import type { AuthStrategy } from "auth/authenticate/strategies/Strategy"; +import type { AppAuth } from "auth/AppAuth"; +import * as AuthPermissions from "auth/auth-permissions"; +import * as DataPermissions from "data/permissions"; import type { Hono } from "hono"; import { Controller, type ServerEnv } from "modules/Controller"; -import { describeRoute, jsc, s, parse, InvalidSchemaError } from "bknd/core"; +import { describeRoute, jsc, s, parse, InvalidSchemaError, transformObject } from "bknd/utils"; export type AuthActionResponse = { success: boolean; @@ -30,7 +32,7 @@ export class AuthController extends Controller { return this.em.repo(entity_name as "users"); } - private registerStrategyActions(strategy: Strategy, mainHono: Hono) { + private registerStrategyActions(strategy: AuthStrategy, mainHono: Hono) { if (!this.auth.isStrategyEnabled(strategy)) { return; } diff --git a/app/src/auth/auth-permissions.ts b/app/src/auth/auth-permissions.ts index ed719925..ed57c505 100644 --- a/app/src/auth/auth-permissions.ts +++ b/app/src/auth/auth-permissions.ts @@ -1,4 +1,4 @@ -import { Permission } from "core"; +import { Permission } from "core/security/Permission"; export const createUser = new Permission("auth.user.create"); //export const updateUser = new Permission("auth.user.update"); diff --git a/app/src/auth/auth-schema.ts b/app/src/auth/auth-schema.ts index c9f08c1c..aedce2de 100644 --- a/app/src/auth/auth-schema.ts +++ b/app/src/auth/auth-schema.ts @@ -1,7 +1,6 @@ import { cookieConfig, jwtConfig } from "auth/authenticate/Authenticator"; import { CustomOAuthStrategy, OAuthStrategy, PasswordStrategy } from "auth/authenticate/strategies"; -import { objectTransform } from "core/utils"; -import { s } from "bknd/core"; +import { objectTransform, s } from "bknd/utils"; export const Strategies = { password: { diff --git a/app/src/auth/authenticate/Authenticator.ts b/app/src/auth/authenticate/Authenticator.ts index 5230a528..46dfc047 100644 --- a/app/src/auth/authenticate/Authenticator.ts +++ b/app/src/auth/authenticate/Authenticator.ts @@ -1,14 +1,15 @@ -import { type DB, Exception } from "core"; +import type { DB } from "bknd"; +import { Exception } from "core/errors"; import { addFlashMessage } from "core/server/flash"; -import { runtimeSupports, truncate, $console } from "core/utils"; -import type { Context, Hono } from "hono"; +import type { Context } from "hono"; import { deleteCookie, getSignedCookie, setSignedCookie } from "hono/cookie"; import { sign, verify } from "hono/jwt"; import { type CookieOptions, serializeSigned } from "hono/utils/cookie"; import type { ServerEnv } from "modules/Controller"; import { pick } from "lodash-es"; import { InvalidConditionsException } from "auth/errors"; -import { s, parse, secret } from "bknd/core"; +import { s, parse, secret, runtimeSupports, truncate, $console } from "bknd/utils"; +import type { AuthStrategy } from "./strategies/Strategy"; type Input = any; // workaround export type JWTPayload = Parameters[0]; @@ -21,17 +22,6 @@ export type StrategyAction = { }; export type StrategyActions = Partial>; -// @todo: add schema to interface to ensure proper inference -// @todo: add tests (e.g. invalid strategy_value) -export interface Strategy { - getController: (auth: Authenticator) => Hono; - getType: () => string; - getMode: () => "form" | "external"; - getName: () => string; - toJSON: (secrets?: boolean) => any; - getActions?: () => StrategyActions; -} - export type User = DB["users"]; export type ProfileExchange = { @@ -98,7 +88,7 @@ export type AuthResolveOptions = { }; export type AuthUserResolver = ( action: AuthAction, - strategy: Strategy, + strategy: AuthStrategy, profile: ProfileExchange, opts?: AuthResolveOptions, ) => Promise; @@ -108,7 +98,9 @@ type AuthClaims = SafeUser & { exp?: number; }; -export class Authenticator = Record> { +export class Authenticator< + Strategies extends Record = Record, +> { private readonly config: AuthConfig; constructor( @@ -121,7 +113,7 @@ export class Authenticator = Record< async resolveLogin( c: Context, - strategy: Strategy, + strategy: AuthStrategy, profile: Partial, verify: (user: User) => Promise, opts?: AuthResolveOptions, @@ -159,7 +151,7 @@ export class Authenticator = Record< async resolveRegister( c: Context, - strategy: Strategy, + strategy: AuthStrategy, profile: CreateUser, verify: (user: User) => Promise, opts?: AuthResolveOptions, @@ -228,7 +220,7 @@ export class Authenticator = Record< strategy< StrategyName extends keyof Strategies, - Strat extends Strategy = Strategies[StrategyName], + Strat extends AuthStrategy = Strategies[StrategyName], >(strategy: StrategyName): Strat { try { return this.strategies[strategy] as unknown as Strat; diff --git a/app/src/auth/authenticate/strategies/PasswordStrategy.ts b/app/src/auth/authenticate/strategies/PasswordStrategy.ts index a3c61611..1ee6d36c 100644 --- a/app/src/auth/authenticate/strategies/PasswordStrategy.ts +++ b/app/src/auth/authenticate/strategies/PasswordStrategy.ts @@ -1,9 +1,11 @@ -import { type Authenticator, InvalidCredentialsException, type User } from "auth"; +import type { User } from "bknd"; +import type { Authenticator } from "auth/authenticate/Authenticator"; +import { InvalidCredentialsException } from "auth/errors"; import { hash, $console } from "core/utils"; import { Hono } from "hono"; import { compare as bcryptCompare, genSalt as bcryptGenSalt, hash as bcryptHash } from "bcryptjs"; -import { Strategy } from "./Strategy"; -import { s, parse, jsc } from "bknd/core"; +import { AuthStrategy } from "./Strategy"; +import { s, parse, jsc } from "bknd/utils"; const schema = s .object({ @@ -14,7 +16,7 @@ const schema = s export type PasswordStrategyOptions = s.Static; -export class PasswordStrategy extends Strategy { +export class PasswordStrategy extends AuthStrategy { constructor(config: Partial = {}) { super(config as any, "password", "password", "form"); diff --git a/app/src/auth/authenticate/strategies/Strategy.ts b/app/src/auth/authenticate/strategies/Strategy.ts index 2ddc4e69..bb72d856 100644 --- a/app/src/auth/authenticate/strategies/Strategy.ts +++ b/app/src/auth/authenticate/strategies/Strategy.ts @@ -5,11 +5,11 @@ import type { StrategyActions, } from "../Authenticator"; import type { Hono } from "hono"; -import { type s, parse } from "bknd/core"; +import { type s, parse } from "bknd/utils"; export type StrategyMode = "form" | "external"; -export abstract class Strategy { +export abstract class AuthStrategy { protected actions: StrategyActions = {}; constructor( diff --git a/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts b/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts index 9c69812b..a9d6911e 100644 --- a/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts +++ b/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts @@ -1,6 +1,6 @@ import type * as oauth from "oauth4webapi"; import { OAuthStrategy } from "./OAuthStrategy"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; type SupportedTypes = "oauth2" | "oidc"; diff --git a/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts b/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts index 2845f7d3..641c9b75 100644 --- a/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts +++ b/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts @@ -1,12 +1,12 @@ -import type { AuthAction, Authenticator } from "auth"; -import { Exception, isDebug } from "core"; -import { filterKeys } from "core/utils"; +import type { Authenticator, AuthAction } from "auth/authenticate/Authenticator"; import { type Context, Hono } from "hono"; import { getSignedCookie, setSignedCookie } from "hono/cookie"; import * as oauth from "oauth4webapi"; import * as issuers from "./issuers"; -import { Strategy } from "auth/authenticate/strategies/Strategy"; -import { s } from "bknd/core"; +import { s, filterKeys } from "bknd/utils"; +import { Exception } from "core/errors"; +import { isDebug } from "core/env"; +import { AuthStrategy } from "../Strategy"; type ConfiguredIssuers = keyof typeof issuers; type SupportedTypes = "oauth2" | "oidc"; @@ -70,7 +70,7 @@ export class OAuthCallbackException extends Exception { } } -export class OAuthStrategy extends Strategy { +export class OAuthStrategy extends AuthStrategy { constructor(config: ProvidedOAuthConfig) { super(config, "oauth", config.name, "external"); } diff --git a/app/src/auth/authorize/Guard.ts b/app/src/auth/authorize/Guard.ts index 81280db2..09d36fb1 100644 --- a/app/src/auth/authorize/Guard.ts +++ b/app/src/auth/authorize/Guard.ts @@ -1,5 +1,6 @@ -import { Exception, Permission } from "core"; +import { Exception } from "core/errors"; import { $console, objectTransform } from "core/utils"; +import { Permission } from "core/security/Permission"; import type { Context } from "hono"; import type { ServerEnv } from "modules/Controller"; import { Role } from "./Role"; diff --git a/app/src/auth/authorize/Role.ts b/app/src/auth/authorize/Role.ts index b5b09b28..54efaf12 100644 --- a/app/src/auth/authorize/Role.ts +++ b/app/src/auth/authorize/Role.ts @@ -1,4 +1,4 @@ -import { Permission } from "core"; +import { Permission } from "core/security/Permission"; export class RolePermission { constructor( diff --git a/app/src/auth/errors.ts b/app/src/auth/errors.ts index 7b725af8..5333b6a7 100644 --- a/app/src/auth/errors.ts +++ b/app/src/auth/errors.ts @@ -1,5 +1,6 @@ -import { Exception, isDebug } from "core"; -import { HttpStatus } from "core/utils"; +import { Exception } from "core/errors"; +import { isDebug } from "core/env"; +import { HttpStatus } from "bknd/utils"; export class AuthException extends Exception { getSafeErrorAndCode() { diff --git a/app/src/auth/index.ts b/app/src/auth/index.ts deleted file mode 100644 index 513eb9ac..00000000 --- a/app/src/auth/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -export { UserExistsException, UserNotFoundException, InvalidCredentialsException } from "./errors"; -export { - type ProfileExchange, - type Strategy, - type User, - type SafeUser, - type CreateUser, - type AuthResponse, - type UserPool, - type AuthAction, - type AuthUserResolver, - Authenticator, - authenticatorConfig, - jwtConfig, -} from "./authenticate/Authenticator"; - -export { AppAuth, type UserFieldSchema } from "./AppAuth"; - -export { Guard, type GuardUserContext, type GuardConfig } from "./authorize/Guard"; -export { Role } from "./authorize/Role"; - -export * as AuthPermissions from "./auth-permissions"; diff --git a/app/src/auth/middlewares.ts b/app/src/auth/middlewares.ts index b58b540a..702023b9 100644 --- a/app/src/auth/middlewares.ts +++ b/app/src/auth/middlewares.ts @@ -1,5 +1,5 @@ -import type { Permission } from "core"; -import { $console, patternMatch } from "core/utils"; +import type { Permission } from "core/security/Permission"; +import { $console, patternMatch } from "bknd/utils"; import type { Context } from "hono"; import { createMiddleware } from "hono/factory"; import type { ServerEnv } from "modules/Controller"; diff --git a/app/src/cli/commands/create/create.ts b/app/src/cli/commands/create/create.ts index e3d7fc48..217b07dc 100644 --- a/app/src/cli/commands/create/create.ts +++ b/app/src/cli/commands/create/create.ts @@ -5,7 +5,7 @@ import type { CliCommand } from "cli/types"; import { typewriter, wait } from "cli/utils/cli"; import { execAsync, getVersion } from "cli/utils/sys"; import { Option } from "commander"; -import { env } from "core"; +import { env } from "bknd"; import color from "picocolors"; import { overridePackageJson, updateBkndPackages } from "./npm"; import { type Template, templates, type TemplateSetupCtx } from "./templates"; diff --git a/app/src/cli/commands/run/run.ts b/app/src/cli/commands/run/run.ts index 0830bc69..24c14b58 100644 --- a/app/src/cli/commands/run/run.ts +++ b/app/src/cli/commands/run/run.ts @@ -1,9 +1,8 @@ import type { Config } from "@libsql/client/node"; -import type { App, CreateAppConfig } from "App"; import { StorageLocalAdapter } from "adapter/node/storage"; import type { CliBkndConfig, CliCommand } from "cli/types"; import { Option } from "commander"; -import { config } from "core"; +import { config, type App, type CreateAppConfig } from "bknd"; import dotenv from "dotenv"; import { registries } from "modules/registries"; import c from "picocolors"; @@ -16,8 +15,8 @@ import { serveStatic, startServer, } from "./platform"; -import { createRuntimeApp, makeConfig } from "adapter"; -import { colorizeConsole, isBun } from "core/utils"; +import { createRuntimeApp, makeConfig } from "bknd/adapter"; +import { colorizeConsole, isBun } from "bknd/utils"; const env_files = [".env", ".dev.vars"]; dotenv.config({ diff --git a/app/src/cli/utils/telemetry.ts b/app/src/cli/utils/telemetry.ts index 6673e0e4..9c9fec13 100644 --- a/app/src/cli/utils/telemetry.ts +++ b/app/src/cli/utils/telemetry.ts @@ -1,7 +1,7 @@ import { PostHog } from "posthog-js-lite"; import { getVersion } from "cli/utils/sys"; -import { env, isDebug } from "core"; -import { $console } from "core/utils"; +import { env, isDebug } from "bknd"; +import { $console } from "bknd/utils"; type Properties = { [p: string]: any }; diff --git a/app/src/core/drivers/email/index.ts b/app/src/core/drivers/email/index.ts index 494276df..94f9d388 100644 --- a/app/src/core/drivers/email/index.ts +++ b/app/src/core/drivers/email/index.ts @@ -6,23 +6,3 @@ export interface IEmailDriver { options?: Options, ): Promise; } - -import type { BkndConfig } from "bknd"; -import { resendEmail, memoryCache } from "bknd/core"; - -export default { - onBuilt: async (app) => { - app.server.get("/send-email", async (c) => { - if (await app.drivers?.email?.send("test@test.com", "Test", "Test")) { - return c.text("success"); - } - return c.text("failed"); - }); - }, - options: { - drivers: { - email: resendEmail({ apiKey: "..." }), - cache: memoryCache(), - }, - }, -} as const satisfies BkndConfig; diff --git a/app/src/core/index.ts b/app/src/core/index.ts deleted file mode 100644 index 0e0d917b..00000000 --- a/app/src/core/index.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { Hono, MiddlewareHandler } from "hono"; - -export { Exception, BkndError } from "./errors"; -export { isDebug, env } from "./env"; -export { type PrimaryFieldType, config, type DB, type AppEntity } from "./config"; -export { AwsClient } from "./clients/aws/AwsClient"; -export { - SimpleRenderer, - type TemplateObject, - type TemplateTypes, - type SimpleRendererOptions, -} from "./template/SimpleRenderer"; -export { SchemaObject } from "./object/SchemaObject"; -export { DebugLogger } from "./utils/DebugLogger"; -export { Permission } from "./security/Permission"; -export { - exp, - makeValidator, - type FilterQuery, - type Primitive, - isPrimitive, - type TExpression, - type BooleanLike, - isBooleanLike, -} from "./object/query/query"; -export { Registry, type Constructor } from "./registry/Registry"; -export { getFlashMessage } from "./server/flash"; -export { - s, - stripMark, - mark, - stringIdentifier, - secret, - parse, - jsc, - describeRoute, - schemaToSpec, - openAPISpecs, - type ParseOptions, - InvalidSchemaError, -} from "./object/schema"; - -export * from "./drivers"; -export * from "./events"; - -// compatibility -export type Middleware = MiddlewareHandler; -export interface ClassController { - getController: () => Hono; - getMiddleware?: MiddlewareHandler; -} diff --git a/app/src/core/object/SchemaObject.ts b/app/src/core/object/SchemaObject.ts index 3d408d8d..e16e51aa 100644 --- a/app/src/core/object/SchemaObject.ts +++ b/app/src/core/object/SchemaObject.ts @@ -1,6 +1,5 @@ import { get, has, omit, set } from "lodash-es"; -import { getFullPathKeys, mergeObjectWith } from "../utils"; -import { type s, parse, stripMark } from "bknd/core"; +import { type s, parse, stripMark, getFullPathKeys, mergeObjectWith, deepFreeze } from "bknd/utils"; export type SchemaObjectOptions = { onUpdate?: (config: s.Static) => void | Promise; @@ -26,14 +25,16 @@ export class SchemaObject { initial?: Partial>, private options?: SchemaObjectOptions, ) { - this._default = _schema.template({}, { withOptional: true }) as any; - this._value = parse(_schema, structuredClone(initial ?? {}), { - withDefaults: true, - withExtendedDefaults: true, - forceParse: this.isForceParse(), - skipMark: this.isForceParse(), - }); - this._config = Object.freeze(this._value); + this._default = deepFreeze(_schema.template({}, { withOptional: true }) as any); + this._value = deepFreeze( + parse(_schema, structuredClone(initial ?? {}), { + withDefaults: true, + withExtendedDefaults: true, + forceParse: this.isForceParse(), + skipMark: this.isForceParse(), + }), + ); + this._config = deepFreeze(this._value); } protected isForceParse(): boolean { @@ -76,8 +77,8 @@ export class SchemaObject { // regardless of "noEmit" – this should always be triggered const updatedConfig = await this.onBeforeUpdate(this._config, valid); - this._value = updatedConfig; - this._config = Object.freeze(updatedConfig); + this._value = deepFreeze(updatedConfig); + this._config = deepFreeze(updatedConfig); if (noEmit !== true) { await this.options?.onUpdate?.(this._config); diff --git a/app/src/core/object/query/query.ts b/app/src/core/object/query/query.ts index 27180ee5..e90921d2 100644 --- a/app/src/core/object/query/query.ts +++ b/app/src/core/object/query/query.ts @@ -1,4 +1,4 @@ -import type { PrimaryFieldType } from "core"; +import type { PrimaryFieldType } from "core/config"; export type Primitive = PrimaryFieldType | string | number | boolean; export function isPrimitive(value: any): value is Primitive { diff --git a/app/src/core/template/SimpleRenderer.spec.ts b/app/src/core/template/SimpleRenderer.spec.ts index 6f922f36..66eb423e 100644 --- a/app/src/core/template/SimpleRenderer.spec.ts +++ b/app/src/core/template/SimpleRenderer.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { SimpleRenderer } from "core"; +import { SimpleRenderer } from "./SimpleRenderer"; describe(SimpleRenderer, () => { const renderer = new SimpleRenderer( diff --git a/app/src/core/utils/console.ts b/app/src/core/utils/console.ts index 756d97b9..b07fa2cd 100644 --- a/app/src/core/utils/console.ts +++ b/app/src/core/utils/console.ts @@ -1,6 +1,6 @@ -import { datetimeStringLocal } from "core/utils"; +import { datetimeStringLocal } from "./dates"; import colors from "picocolors"; -import { env } from "core"; +import { env } from "core/env"; function hasColors() { try { diff --git a/app/src/core/utils/index.ts b/app/src/core/utils/index.ts index e60d272e..36928c5b 100644 --- a/app/src/core/utils/index.ts +++ b/app/src/core/utils/index.ts @@ -13,3 +13,18 @@ export * from "./uuid"; export * from "./test"; export * from "./runtime"; export * from "./numbers"; +export { + s, + stripMark, + mark, + stringIdentifier, + SecretSchema, + secret, + parse, + jsc, + describeRoute, + schemaToSpec, + openAPISpecs, + type ParseOptions, + InvalidSchemaError, +} from "./schema"; diff --git a/app/src/core/utils/objects.ts b/app/src/core/utils/objects.ts index a14f1c3c..2bf1e60c 100644 --- a/app/src/core/utils/objects.ts +++ b/app/src/core/utils/objects.ts @@ -94,16 +94,14 @@ export function transformObject, U>( object: T, transform: (value: T[keyof T], key: keyof T) => U | undefined, ): { [K in keyof T]: U } { - return Object.entries(object).reduce( - (acc, [key, value]) => { - const t = transform(value, key as keyof T); - if (typeof t !== "undefined") { - acc[key as keyof T] = t; - } - return acc; - }, - {} as { [K in keyof T]: U }, - ); + const result = {} as { [K in keyof T]: U }; + for (const [key, value] of Object.entries(object) as [keyof T, T[keyof T]][]) { + const t = transform(value, key); + if (typeof t !== "undefined") { + result[key] = t; + } + } + return result; } export const objectTransform = transformObject; @@ -419,3 +417,21 @@ export function pick(obj: T, keys: K[]): Pi {} as Pick, ); } + +export function deepFreeze(object: T): T { + if (Object.isFrozen(object)) return object; + + // Retrieve the property names defined on object + const propNames = Reflect.ownKeys(object); + + // Freeze properties before freezing self + for (const name of propNames) { + const value = object[name]; + + if ((value && typeof value === "object") || typeof value === "function") { + deepFreeze(value); + } + } + + return Object.freeze(object); +} diff --git a/app/src/core/object/schema/index.ts b/app/src/core/utils/schema/index.ts similarity index 97% rename from app/src/core/object/schema/index.ts rename to app/src/core/utils/schema/index.ts index 0f497449..03827008 100644 --- a/app/src/core/object/schema/index.ts +++ b/app/src/core/utils/schema/index.ts @@ -3,7 +3,7 @@ import * as s from "jsonv-ts"; export { validator as jsc, type Options } from "jsonv-ts/hono"; export { describeRoute, schemaToSpec, openAPISpecs } from "jsonv-ts/hono"; -export { secret } from "./secret"; +export { secret, SecretSchema } from "./secret"; export { s }; diff --git a/app/src/core/object/schema/secret.ts b/app/src/core/utils/schema/secret.ts similarity index 100% rename from app/src/core/object/schema/secret.ts rename to app/src/core/utils/schema/secret.ts diff --git a/app/src/data/AppData.ts b/app/src/data/AppData.ts index 1f0b7b34..0b4e4641 100644 --- a/app/src/data/AppData.ts +++ b/app/src/data/AppData.ts @@ -1,15 +1,12 @@ import { transformObject } from "core/utils"; -import { - DataPermissions, - type Entity, - EntityIndex, - type EntityManager, - constructEntity, - constructRelation, -} from "data"; + import { Module } from "modules/Module"; import { DataController } from "./api/DataController"; import { type AppDataConfig, dataConfigSchema } from "./data-schema"; +import { constructEntity, constructRelation } from "./schema/constructor"; +import type { Entity, EntityManager } from "data/entities"; +import { EntityIndex } from "data/fields"; +import * as DataPermissions from "data/permissions"; export class AppData extends Module { override async build() { diff --git a/app/src/data/api/DataApi.ts b/app/src/data/api/DataApi.ts index bd670e86..b4deb5d9 100644 --- a/app/src/data/api/DataApi.ts +++ b/app/src/data/api/DataApi.ts @@ -1,8 +1,9 @@ -import type { DB } from "core"; -import type { EntityData, RepoQueryIn, RepositoryResultJSON } from "data"; +import type { DB, EntityData, RepoQueryIn } from "bknd"; + import type { Insertable, Selectable, Updateable } from "kysely"; import { type BaseModuleApiOptions, ModuleApi, type PrimaryFieldType } from "modules"; import type { FetchPromise, ResponseObject } from "modules/ModuleApi"; +import type { RepositoryResultJSON } from "data/entities/query/RepositoryResult"; export type DataApiOptions = BaseModuleApiOptions & { queryLengthLimit: number; diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index ddce7efa..b468a080 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -1,17 +1,12 @@ -import { - DataPermissions, - type EntityData, - type EntityManager, - type RepoQuery, - repoQuery, -} from "data"; import type { Handler } from "hono/types"; import type { ModuleBuildContext } from "modules"; import { Controller } from "modules/Controller"; -import { jsc, s, describeRoute, schemaToSpec } from "bknd/core"; +import { jsc, s, describeRoute, schemaToSpec, omitKeys } from "bknd/utils"; import * as SystemPermissions from "modules/permissions"; import type { AppDataConfig } from "../data-schema"; -import { omitKeys } from "core/utils"; +import type { EntityManager, EntityData } from "data/entities"; +import * as DataPermissions from "data/permissions"; +import { repoQuery, type RepoQuery } from "data/server/query"; export class DataController extends Controller { constructor( diff --git a/app/src/data/connection/Connection.ts b/app/src/data/connection/Connection.ts index 5b39d6d9..7db92274 100644 --- a/app/src/data/connection/Connection.ts +++ b/app/src/data/connection/Connection.ts @@ -18,7 +18,8 @@ import { sql, } from "kysely"; import type { BaseIntrospector, BaseIntrospectorConfig } from "./BaseIntrospector"; -import type { Constructor, DB } from "core"; +import type { DB } from "bknd"; +import type { Constructor } from "core/registry/Registry"; import { KyselyPluginRunner } from "data/plugins/KyselyPluginRunner"; import type { Field } from "data/fields/Field"; diff --git a/app/src/data/connection/sqlite/SqliteConnection.ts b/app/src/data/connection/sqlite/SqliteConnection.ts index 523a8244..afecc383 100644 --- a/app/src/data/connection/sqlite/SqliteConnection.ts +++ b/app/src/data/connection/sqlite/SqliteConnection.ts @@ -8,7 +8,7 @@ import { } from "kysely"; import { jsonArrayFrom, jsonBuildObject, jsonObjectFrom } from "kysely/helpers/sqlite"; import { Connection, type DbFunctions, type FieldSpec, type SchemaResponse } from "../Connection"; -import type { Constructor } from "core"; +import type { Constructor } from "core/registry/Registry"; import { customIntrospector } from "../Connection"; import { SqliteIntrospector } from "./SqliteIntrospector"; import type { Field } from "data/fields/Field"; diff --git a/app/src/data/data-schema.ts b/app/src/data/data-schema.ts index 57ff4b03..7b5c0d8d 100644 --- a/app/src/data/data-schema.ts +++ b/app/src/data/data-schema.ts @@ -4,7 +4,7 @@ import { FieldClassMap } from "data/fields"; import { RelationClassMap, RelationFieldClassMap } from "data/relations"; import { entityConfigSchema, entityTypes } from "data/entities"; import { primaryFieldTypes } from "./fields"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const FIELDS = { ...FieldClassMap, diff --git a/app/src/data/entities/Entity.ts b/app/src/data/entities/Entity.ts index 9ce153f9..10612b58 100644 --- a/app/src/data/entities/Entity.ts +++ b/app/src/data/entities/Entity.ts @@ -1,5 +1,5 @@ -import { config } from "core"; -import { snakeToPascalWithSpaces, transformObject, $console } from "core/utils"; +import { config } from "core/config"; +import { snakeToPascalWithSpaces, transformObject, $console, s, parse } from "bknd/utils"; import { type Field, PrimaryField, @@ -7,7 +7,6 @@ import { type TActionContext, type TRenderContext, } from "../fields"; -import { s, parse } from "bknd/core"; // @todo: entity must be migrated to typebox export const entityConfigSchema = s diff --git a/app/src/data/entities/EntityManager.ts b/app/src/data/entities/EntityManager.ts index 654c77d6..ad8c7aac 100644 --- a/app/src/data/entities/EntityManager.ts +++ b/app/src/data/entities/EntityManager.ts @@ -1,5 +1,5 @@ -import type { DB as DefaultDB } from "core"; -import { $console } from "core/utils"; +import type { DB as DefaultDB } from "bknd"; +import { $console } from "bknd/utils"; import { EventManager } from "core/events"; import { sql } from "kysely"; import { Connection } from "../connection/Connection"; diff --git a/app/src/data/entities/EntityTypescript.ts b/app/src/data/entities/EntityTypescript.ts index 197c22df..79968fc7 100644 --- a/app/src/data/entities/EntityTypescript.ts +++ b/app/src/data/entities/EntityTypescript.ts @@ -1,4 +1,5 @@ -import type { Entity, EntityManager, EntityRelation, TEntityType } from "data"; +import type { Entity, EntityManager, TEntityType } from "data/entities"; +import type { EntityRelation } from "data/relations"; import { autoFormatString } from "core/utils"; import { usersFields } from "auth/auth-entities"; import { mediaFields } from "media/media-entities"; diff --git a/app/src/data/entities/Result.ts b/app/src/data/entities/Result.ts index a37cbd77..0570aa6c 100644 --- a/app/src/data/entities/Result.ts +++ b/app/src/data/entities/Result.ts @@ -1,4 +1,4 @@ -import { isDebug } from "core"; +import { isDebug } from "core/env"; import { pick } from "core/utils"; import type { Connection } from "data/connection"; import type { diff --git a/app/src/data/entities/mutation/Mutator.ts b/app/src/data/entities/mutation/Mutator.ts index 2e01cfe1..84389c3d 100644 --- a/app/src/data/entities/mutation/Mutator.ts +++ b/app/src/data/entities/mutation/Mutator.ts @@ -1,7 +1,7 @@ -import type { DB as DefaultDB, PrimaryFieldType } from "core"; +import type { DB as DefaultDB, PrimaryFieldType } from "bknd"; import { type EmitsEvents, EventManager } from "core/events"; import type { DeleteQueryBuilder, InsertQueryBuilder, UpdateQueryBuilder } from "kysely"; -import type { TActionContext } from "../.."; +import type { TActionContext } from "data/fields"; import { WhereBuilder } from "../query/WhereBuilder"; import type { Entity, EntityData, EntityManager } from "../../entities"; import { InvalidSearchParamsException } from "../../errors"; @@ -9,7 +9,6 @@ import { MutatorEvents } from "../../events"; import { RelationMutator } from "../../relations"; import type { RepoQuery } from "../../server/query"; import { MutatorResult, type MutatorResultOptions } from "./MutatorResult"; -import { transformObject } from "core/utils"; type MutatorQB = | InsertQueryBuilder diff --git a/app/src/data/entities/mutation/MutatorResult.ts b/app/src/data/entities/mutation/MutatorResult.ts index a0fe3075..551bd61f 100644 --- a/app/src/data/entities/mutation/MutatorResult.ts +++ b/app/src/data/entities/mutation/MutatorResult.ts @@ -2,7 +2,7 @@ import { $console } from "core/utils"; import type { Entity, EntityData } from "../Entity"; import type { EntityManager } from "../EntityManager"; import { Result, type ResultJSON, type ResultOptions } from "../Result"; -import { isDebug } from "core"; +import { isDebug } from "core/env"; export type MutatorResultOptions = ResultOptions & { silent?: boolean; diff --git a/app/src/data/entities/query/Repository.ts b/app/src/data/entities/query/Repository.ts index 8c2e2ca5..5f85d808 100644 --- a/app/src/data/entities/query/Repository.ts +++ b/app/src/data/entities/query/Repository.ts @@ -1,4 +1,4 @@ -import type { DB as DefaultDB, PrimaryFieldType } from "core"; +import type { DB as DefaultDB, PrimaryFieldType } from "bknd"; import { $console } from "core/utils"; import { type EmitsEvents, EventManager } from "core/events"; import { type SelectQueryBuilder, sql } from "kysely"; @@ -14,7 +14,6 @@ import { } from "../index"; import { JoinBuilder } from "./JoinBuilder"; import { RepositoryResult, type RepositoryResultOptions } from "./RepositoryResult"; -import type { ResultOptions } from "../Result"; export type RepositoryQB = SelectQueryBuilder; diff --git a/app/src/data/entities/query/WhereBuilder.ts b/app/src/data/entities/query/WhereBuilder.ts index 90d7b365..26bf0417 100644 --- a/app/src/data/entities/query/WhereBuilder.ts +++ b/app/src/data/entities/query/WhereBuilder.ts @@ -6,7 +6,7 @@ import { isBooleanLike, isPrimitive, makeValidator, -} from "core"; +} from "core/object/query/query"; import type { DeleteQueryBuilder, ExpressionBuilder, diff --git a/app/src/data/entities/query/WithBuilder.ts b/app/src/data/entities/query/WithBuilder.ts index 84eebb4b..3f6dde3e 100644 --- a/app/src/data/entities/query/WithBuilder.ts +++ b/app/src/data/entities/query/WithBuilder.ts @@ -1,7 +1,9 @@ import { isObject } from "core/utils"; -import type { KyselyJsonFrom, RepoQuery } from "data"; + +import type { KyselyJsonFrom } from "data/relations/EntityRelation"; +import type { RepoQuery } from "data/server/query"; import { InvalidSearchParamsException } from "data/errors"; -import type { Entity, EntityManager, RepositoryQB } from "../../entities"; +import type { Entity, EntityManager, RepositoryQB } from "data/entities"; export class WithBuilder { static addClause( diff --git a/app/src/data/errors.ts b/app/src/data/errors.ts index 0435a05b..ca530c66 100644 --- a/app/src/data/errors.ts +++ b/app/src/data/errors.ts @@ -1,6 +1,5 @@ -import { Exception } from "core"; -import { HttpStatus } from "core/utils"; -import type { InvalidSchemaError } from "bknd/core"; +import { Exception } from "core/errors"; +import { type InvalidSchemaError, HttpStatus } from "bknd/utils"; import type { Entity } from "./entities"; import type { Field } from "./fields"; diff --git a/app/src/data/events/index.ts b/app/src/data/events/index.ts index 246a39d3..beb44938 100644 --- a/app/src/data/events/index.ts +++ b/app/src/data/events/index.ts @@ -1,5 +1,5 @@ -import type { PrimaryFieldType } from "core"; -import { $console } from "core/utils"; +import type { PrimaryFieldType } from "bknd"; +import { $console } from "bknd/utils"; import { Event, InvalidEventReturn } from "core/events"; import type { Entity, EntityData } from "../entities"; import type { RepoQuery } from "data/server/query"; diff --git a/app/src/data/fields/BooleanField.ts b/app/src/data/fields/BooleanField.ts index a4826852..1655a895 100644 --- a/app/src/data/fields/BooleanField.ts +++ b/app/src/data/fields/BooleanField.ts @@ -1,8 +1,8 @@ import { omitKeys } from "core/utils"; -import type { EntityManager } from "data"; +import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const booleanFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/DateField.ts b/app/src/data/fields/DateField.ts index 127f00b4..06249866 100644 --- a/app/src/data/fields/DateField.ts +++ b/app/src/data/fields/DateField.ts @@ -3,7 +3,7 @@ import type { EntityManager } from "../entities"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import { $console } from "core/utils"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const dateFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/EnumField.ts b/app/src/data/fields/EnumField.ts index 07348e8e..306674c4 100644 --- a/app/src/data/fields/EnumField.ts +++ b/app/src/data/fields/EnumField.ts @@ -1,9 +1,9 @@ import { omitKeys } from "core/utils"; -import type { EntityManager } from "data"; +import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { baseFieldConfigSchema, Field, type TActionContext, type TRenderContext } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const enumFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/Field.ts b/app/src/data/fields/Field.ts index bb971186..98a1f45d 100644 --- a/app/src/data/fields/Field.ts +++ b/app/src/data/fields/Field.ts @@ -1,10 +1,9 @@ -import { snakeToPascalWithSpaces } from "core/utils"; import type { HTMLInputTypeAttribute, InputHTMLAttributes } from "react"; import type { EntityManager } from "../entities"; import { InvalidFieldConfigException, TransformPersistFailedException } from "../errors"; import type { FieldSpec } from "data/connection/Connection"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s, parse, InvalidSchemaError } from "bknd/core"; +import { s, parse, InvalidSchemaError, snakeToPascalWithSpaces } from "bknd/utils"; // @todo: contexts need to be reworked // e.g. "table" is irrelevant, because if read is not given, it fails diff --git a/app/src/data/fields/JsonField.ts b/app/src/data/fields/JsonField.ts index 5e13e81c..711767f9 100644 --- a/app/src/data/fields/JsonField.ts +++ b/app/src/data/fields/JsonField.ts @@ -1,9 +1,9 @@ import { omitKeys } from "core/utils"; -import type { EntityManager } from "data"; +import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const jsonFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/JsonSchemaField.ts b/app/src/data/fields/JsonSchemaField.ts index fd541fc9..76ad00ad 100644 --- a/app/src/data/fields/JsonSchemaField.ts +++ b/app/src/data/fields/JsonSchemaField.ts @@ -1,10 +1,10 @@ import { type Schema as JsonSchema, Validator } from "@cfworker/json-schema"; import { objectToJsLiteral } from "core/utils"; -import type { EntityManager } from "data"; +import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const jsonSchemaFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/NumberField.ts b/app/src/data/fields/NumberField.ts index 5803cba0..4f6e53c0 100644 --- a/app/src/data/fields/NumberField.ts +++ b/app/src/data/fields/NumberField.ts @@ -1,8 +1,8 @@ -import type { EntityManager } from "data"; +import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; import { omitKeys } from "core/utils"; export const numberFieldConfigSchema = s diff --git a/app/src/data/fields/PrimaryField.ts b/app/src/data/fields/PrimaryField.ts index d7006a3d..3e1743e5 100644 --- a/app/src/data/fields/PrimaryField.ts +++ b/app/src/data/fields/PrimaryField.ts @@ -1,8 +1,7 @@ -import { config } from "core"; -import { omitKeys, uuidv7 } from "core/utils"; +import { config } from "core/config"; +import { omitKeys, uuidv7, s } from "bknd/utils"; import { Field, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/core"; export const primaryFieldTypes = ["integer", "uuid"] as const; export type TPrimaryFieldFormat = (typeof primaryFieldTypes)[number]; diff --git a/app/src/data/fields/TextField.ts b/app/src/data/fields/TextField.ts index 378d3548..94674fb7 100644 --- a/app/src/data/fields/TextField.ts +++ b/app/src/data/fields/TextField.ts @@ -1,8 +1,8 @@ -import type { EntityManager } from "data"; +import type { EntityManager } from "data/entities"; import { omitKeys } from "core/utils"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, baseFieldConfigSchema } from "./Field"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const textFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/VirtualField.ts b/app/src/data/fields/VirtualField.ts index 02e1c0d3..93dac52a 100644 --- a/app/src/data/fields/VirtualField.ts +++ b/app/src/data/fields/VirtualField.ts @@ -1,5 +1,5 @@ import { Field, baseFieldConfigSchema } from "./Field"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const virtualFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/field-test-suite.ts b/app/src/data/fields/field-test-suite.ts index 5d24e125..369d41ba 100644 --- a/app/src/data/fields/field-test-suite.ts +++ b/app/src/data/fields/field-test-suite.ts @@ -1,4 +1,4 @@ -import type { BaseFieldConfig, Field, TActionContext } from "data"; +import type { BaseFieldConfig, Field, TActionContext } from "data/fields"; import type { ColumnDataType } from "kysely"; import { omit } from "lodash-es"; import type { TestRunner } from "core/test"; diff --git a/app/src/data/helper.ts b/app/src/data/helper.ts index 79dfeb0b..12c531bb 100644 --- a/app/src/data/helper.ts +++ b/app/src/data/helper.ts @@ -1,4 +1,5 @@ -import type { EntityData, EntityManager, Field } from "data"; +import type { EntityData, EntityManager } from "data/entities"; +import type { Field } from "data/fields"; import { transform } from "lodash-es"; export function getDefaultValues(fields: Field[], data: EntityData): EntityData { diff --git a/app/src/data/index.ts b/app/src/data/index.ts deleted file mode 100644 index 5db48962..00000000 --- a/app/src/data/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { MutatorEvents, RepositoryEvents } from "./events"; - -export * from "./fields"; -export * from "./entities"; -export * from "./relations"; -export * from "./schema/SchemaManager"; -export * from "./prototype"; -export * from "./connection"; - -export { - type RepoQuery, - type RepoQueryIn, - getRepoQueryTemplate, - repoQuery, -} from "./server/query"; - -export type { WhereQuery } from "./entities/query/WhereBuilder"; - -export { KyselyPluginRunner } from "./plugins/KyselyPluginRunner"; - -export { constructEntity, constructRelation } from "./schema/constructor"; - -export const DatabaseEvents = { - ...MutatorEvents, - ...RepositoryEvents, -}; -export { MutatorEvents, RepositoryEvents }; - -export * as DataPermissions from "./permissions"; - -export { MediaField, type MediaFieldConfig, type MediaItem } from "media/MediaField"; - -export { libsql } from "./connection/sqlite/libsql/LibsqlConnection"; -export { - genericSqlite, - genericSqliteUtils, - type GenericSqliteConnection, -} from "./connection/sqlite/GenericSqliteConnection"; - -export { - EntityTypescript, - type EntityTypescriptOptions, - type TEntityTSType, - type TFieldTSType, -} from "./entities/EntityTypescript"; diff --git a/app/src/data/permissions/index.ts b/app/src/data/permissions/index.ts index 47a57b38..3db75edc 100644 --- a/app/src/data/permissions/index.ts +++ b/app/src/data/permissions/index.ts @@ -1,4 +1,4 @@ -import { Permission } from "core"; +import { Permission } from "core/security/Permission"; export const entityRead = new Permission("data.entity.read"); export const entityCreate = new Permission("data.entity.create"); diff --git a/app/src/data/relations/EntityRelation.ts b/app/src/data/relations/EntityRelation.ts index 342aba79..b0c3cc44 100644 --- a/app/src/data/relations/EntityRelation.ts +++ b/app/src/data/relations/EntityRelation.ts @@ -1,4 +1,5 @@ -import { parse } from "bknd/core"; +import type { PrimaryFieldType } from "bknd"; +import { s, parse } from "bknd/utils"; import type { ExpressionBuilder, SelectQueryBuilder } from "kysely"; import type { Entity, EntityData, EntityManager } from "../entities"; import { @@ -8,8 +9,6 @@ import { } from "../relations"; import type { RepoQuery } from "../server/query"; import type { RelationType } from "./relation-types"; -import type { PrimaryFieldType } from "core"; -import { s } from "bknd/core"; const directions = ["source", "target"] as const; export type TDirection = (typeof directions)[number]; diff --git a/app/src/data/relations/ManyToManyRelation.ts b/app/src/data/relations/ManyToManyRelation.ts index 591235e1..99b57401 100644 --- a/app/src/data/relations/ManyToManyRelation.ts +++ b/app/src/data/relations/ManyToManyRelation.ts @@ -6,7 +6,7 @@ import { EntityRelation, type KyselyQueryBuilder } from "./EntityRelation"; import { EntityRelationAnchor } from "./EntityRelationAnchor"; import { RelationField } from "./RelationField"; import { type RelationType, RelationTypes } from "./relation-types"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export type ManyToManyRelationConfig = s.Static; diff --git a/app/src/data/relations/ManyToOneRelation.ts b/app/src/data/relations/ManyToOneRelation.ts index deaa31b2..c5ab4049 100644 --- a/app/src/data/relations/ManyToOneRelation.ts +++ b/app/src/data/relations/ManyToOneRelation.ts @@ -1,5 +1,5 @@ -import type { PrimaryFieldType } from "core"; -import { snakeToPascalWithSpaces } from "core/utils"; +import type { PrimaryFieldType } from "bknd"; +import { snakeToPascalWithSpaces, s } from "bknd/utils"; import type { ExpressionBuilder } from "kysely"; import type { Entity, EntityManager } from "../entities"; import type { RepoQuery } from "../server/query"; @@ -8,7 +8,6 @@ import { EntityRelationAnchor } from "./EntityRelationAnchor"; import { RelationField, type RelationFieldBaseConfig } from "./RelationField"; import type { MutationInstructionResponse } from "./RelationMutator"; import { type RelationType, RelationTypes } from "./relation-types"; -import { s } from "bknd/core"; /** * Source entity receives the mapping field diff --git a/app/src/data/relations/PolymorphicRelation.ts b/app/src/data/relations/PolymorphicRelation.ts index a9be82ab..acb4a8c4 100644 --- a/app/src/data/relations/PolymorphicRelation.ts +++ b/app/src/data/relations/PolymorphicRelation.ts @@ -5,7 +5,7 @@ import type { RepoQuery } from "../server/query"; import { EntityRelation, type KyselyJsonFrom, type KyselyQueryBuilder } from "./EntityRelation"; import { EntityRelationAnchor } from "./EntityRelationAnchor"; import { type RelationType, RelationTypes } from "./relation-types"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export type PolymorphicRelationConfig = s.Static; diff --git a/app/src/data/relations/RelationField.ts b/app/src/data/relations/RelationField.ts index 1cd72cfd..3a2ab075 100644 --- a/app/src/data/relations/RelationField.ts +++ b/app/src/data/relations/RelationField.ts @@ -3,7 +3,7 @@ import { Field, baseFieldConfigSchema } from "../fields"; import type { EntityRelation } from "./EntityRelation"; import type { EntityRelationAnchor } from "./EntityRelationAnchor"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; const CASCADES = ["cascade", "set null", "set default", "restrict", "no action"] as const; diff --git a/app/src/data/relations/RelationMutator.ts b/app/src/data/relations/RelationMutator.ts index e8944a5e..48bfb538 100644 --- a/app/src/data/relations/RelationMutator.ts +++ b/app/src/data/relations/RelationMutator.ts @@ -1,4 +1,4 @@ -import type { PrimaryFieldType } from "core"; +import type { PrimaryFieldType } from "bknd"; import type { Entity, EntityManager } from "../entities"; import { type EntityRelation, diff --git a/app/src/data/schema/SchemaManager.ts b/app/src/data/schema/SchemaManager.ts index dafd616f..ab2d15fa 100644 --- a/app/src/data/schema/SchemaManager.ts +++ b/app/src/data/schema/SchemaManager.ts @@ -1,8 +1,8 @@ import type { CompiledQuery, TableMetadata } from "kysely"; -import type { IndexMetadata, SchemaResponse } from "../connection/Connection"; -import type { Entity, EntityManager } from "../entities"; -import { PrimaryField } from "../fields"; -import { $console } from "core/utils"; +import type { IndexMetadata, SchemaResponse } from "data/connection/Connection"; +import type { Entity, EntityManager } from "data/entities"; +import { PrimaryField } from "data/fields"; +import { $console } from "bknd/utils"; type IntrospectedTable = TableMetadata & { indices: IndexMetadata[]; diff --git a/app/src/data/schema/constructor.ts b/app/src/data/schema/constructor.ts index 1da566c5..7742812b 100644 --- a/app/src/data/schema/constructor.ts +++ b/app/src/data/schema/constructor.ts @@ -1,5 +1,6 @@ import { transformObject } from "core/utils"; -import { Entity, type Field } from "data"; +import { Entity } from "data/entities"; +import type { Field } from "data/fields"; import { FIELDS, RELATIONS, type TAppDataEntity, type TAppDataRelation } from "data/data-schema"; export function constructEntity(name: string, entityConfig: TAppDataEntity) { diff --git a/app/src/data/server/query.spec.ts b/app/src/data/server/query.spec.ts index 536d15da..39925991 100644 --- a/app/src/data/server/query.spec.ts +++ b/app/src/data/server/query.spec.ts @@ -1,6 +1,6 @@ import { test, describe, expect } from "bun:test"; import * as q from "./query"; -import { s as schema, parse as $parse, type ParseOptions } from "bknd/core"; +import { parse as $parse, type ParseOptions } from "bknd/utils"; const parse = (v: unknown, o: ParseOptions = {}) => $parse(q.repoQuery, v, { diff --git a/app/src/data/server/query.ts b/app/src/data/server/query.ts index cb740e7e..f8ba0c07 100644 --- a/app/src/data/server/query.ts +++ b/app/src/data/server/query.ts @@ -1,4 +1,4 @@ -import { s } from "bknd/core"; +import { s } from "bknd/utils"; import { WhereBuilder, type WhereQuery } from "data/entities/query/WhereBuilder"; import { isObject, $console } from "core/utils"; import type { anyOf, CoercionOptions, Schema } from "jsonv-ts"; diff --git a/app/src/flows/AppFlows.ts b/app/src/flows/AppFlows.ts index 230b924c..eec33658 100644 --- a/app/src/flows/AppFlows.ts +++ b/app/src/flows/AppFlows.ts @@ -1,9 +1,8 @@ -import { transformObject } from "core/utils"; import { Flow, HttpTrigger } from "flows"; import { Hono } from "hono"; import { Module } from "modules/Module"; import { TASKS, flowsConfigSchema } from "./flows-schema"; -import type { s } from "bknd/core"; +import { type s, transformObject } from "bknd/utils"; export type AppFlowsSchema = s.Static; export type TAppFlowSchema = AppFlowsSchema["flows"][number]; diff --git a/app/src/flows/flows-schema.ts b/app/src/flows/flows-schema.ts index 9caef769..f430c6c4 100644 --- a/app/src/flows/flows-schema.ts +++ b/app/src/flows/flows-schema.ts @@ -1,6 +1,6 @@ import { transformObject } from "core/utils"; import { TaskMap, TriggerMap } from "flows"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const TASKS = { ...TaskMap, diff --git a/app/src/flows/flows/triggers/EventTrigger.ts b/app/src/flows/flows/triggers/EventTrigger.ts index 40cbeef7..f17fd693 100644 --- a/app/src/flows/flows/triggers/EventTrigger.ts +++ b/app/src/flows/flows/triggers/EventTrigger.ts @@ -2,7 +2,7 @@ import type { EventManager } from "core/events"; import type { Flow } from "../Flow"; import { Trigger } from "./Trigger"; import { $console } from "core/utils"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export class EventTrigger extends Trigger { override type = "event"; diff --git a/app/src/flows/flows/triggers/HttpTrigger.ts b/app/src/flows/flows/triggers/HttpTrigger.ts index b36da675..e263682d 100644 --- a/app/src/flows/flows/triggers/HttpTrigger.ts +++ b/app/src/flows/flows/triggers/HttpTrigger.ts @@ -1,7 +1,7 @@ import type { Context, Hono } from "hono"; import type { Flow } from "../Flow"; import { Trigger } from "./Trigger"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; const httpMethods = ["GET", "POST", "PUT", "PATCH", "DELETE"] as const; diff --git a/app/src/flows/flows/triggers/Trigger.ts b/app/src/flows/flows/triggers/Trigger.ts index 8140de16..bd830321 100644 --- a/app/src/flows/flows/triggers/Trigger.ts +++ b/app/src/flows/flows/triggers/Trigger.ts @@ -1,6 +1,6 @@ import type { Execution } from "../Execution"; import type { Flow } from "../Flow"; -import { s, parse } from "bknd/core"; +import { s, parse } from "bknd/utils"; export class Trigger { // @todo: remove this diff --git a/app/src/flows/tasks/Task.tsx b/app/src/flows/tasks/Task.tsx index 0c00ecd8..e72458b0 100644 --- a/app/src/flows/tasks/Task.tsx +++ b/app/src/flows/tasks/Task.tsx @@ -1,7 +1,7 @@ //import { BkndError, SimpleRenderer } from "core"; import { BkndError } from "core/errors"; -import { s, parse } from "bknd/core"; +import { s, parse } from "bknd/utils"; import type { InputsMap } from "../flows/Execution"; import { SimpleRenderer } from "core/template/SimpleRenderer"; diff --git a/app/src/flows/tasks/presets/FetchTask.ts b/app/src/flows/tasks/presets/FetchTask.ts index 3e945138..251d7d55 100644 --- a/app/src/flows/tasks/presets/FetchTask.ts +++ b/app/src/flows/tasks/presets/FetchTask.ts @@ -1,5 +1,5 @@ import { Task, dynamic } from "../Task"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; const FetchMethods = ["GET", "POST", "PUT", "PATCH", "DELETE"]; diff --git a/app/src/flows/tasks/presets/LogTask.ts b/app/src/flows/tasks/presets/LogTask.ts index 73a9a7c4..63b9677a 100644 --- a/app/src/flows/tasks/presets/LogTask.ts +++ b/app/src/flows/tasks/presets/LogTask.ts @@ -1,6 +1,6 @@ import { Task } from "../Task"; import { $console } from "core/utils"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export class LogTask extends Task { type = "log"; diff --git a/app/src/flows/tasks/presets/RenderTask.ts b/app/src/flows/tasks/presets/RenderTask.ts index ccadf92d..fe2ed648 100644 --- a/app/src/flows/tasks/presets/RenderTask.ts +++ b/app/src/flows/tasks/presets/RenderTask.ts @@ -1,5 +1,5 @@ import { Task } from "../Task"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export class RenderTask> extends Task< typeof RenderTask.schema, diff --git a/app/src/flows/tasks/presets/SubFlowTask.ts b/app/src/flows/tasks/presets/SubFlowTask.ts index 38b749c6..1526d691 100644 --- a/app/src/flows/tasks/presets/SubFlowTask.ts +++ b/app/src/flows/tasks/presets/SubFlowTask.ts @@ -1,6 +1,6 @@ import { Flow } from "../../flows/Flow"; import { Task, dynamic } from "../Task"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export class SubFlowTask> extends Task< typeof SubFlowTask.schema, diff --git a/app/src/index.ts b/app/src/index.ts index ed12dbb9..27061743 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -36,5 +36,127 @@ export type { BkndConfig } from "bknd/adapter"; export * as middlewares from "modules/middlewares"; export { registries } from "modules/registries"; -export type { MediaFieldSchema } from "media/AppMedia"; -export type { UserFieldSchema } from "auth/AppAuth"; +/** + * Core + */ +export { Exception, BkndError } from "core/errors"; +export { isDebug, env } from "core/env"; +export { type PrimaryFieldType, config, type DB, type AppEntity } from "core/config"; +export { Permission } from "core/security/Permission"; +export { getFlashMessage } from "core/server/flash"; +export * from "core/drivers"; +export { Event, InvalidEventReturn } from "core/events/Event"; +export type { + ListenerMode, + ListenerHandler, +} from "core/events/EventListener"; +export { EventManager, type EmitsEvents, type EventClass } from "core/events/EventManager"; + +/** + * Auth + */ +export { + UserExistsException, + UserNotFoundException, + InvalidCredentialsException, +} from "auth/errors"; +export type { + ProfileExchange, + User, + SafeUser, + CreateUser, + AuthResponse, + UserPool, + AuthAction, + AuthUserResolver, +} from "auth/authenticate/Authenticator"; +export { AuthStrategy } from "auth/authenticate/strategies/Strategy"; +export * as AuthPermissions from "auth/auth-permissions"; + +/** + * Media + */ +export { getExtensionFromName, getRandomizedFilename } from "media/utils"; +export * as StorageEvents from "media/storage/events"; +export * as MediaPermissions from "media/media-permissions"; +export type { FileUploadedEventData } from "media/storage/events"; +export { guess as guessMimeType } from "media/storage/mime-types-tiny"; +export { + Storage, + type FileMeta, + type FileListObject, + type StorageConfig, + type FileBody, + type FileUploadPayload, +} from "media/storage/Storage"; +export { StorageAdapter } from "media/storage/StorageAdapter"; + +/** + * Data + */ +import { MutatorEvents, RepositoryEvents } from "data/events"; +export const DataEvents = { ...MutatorEvents, ...RepositoryEvents }; +export type { + RepoQuery, + RepoQueryIn, +} from "data/server/query"; +export type { WhereQuery } from "data/entities/query/WhereBuilder"; +export { KyselyPluginRunner } from "data/plugins/KyselyPluginRunner"; +export * as DataPermissions from "data/permissions"; +export { libsql } from "data/connection/sqlite/libsql/LibsqlConnection"; +export { + genericSqlite, + genericSqliteUtils, + type GenericSqliteConnection, +} from "data/connection/sqlite/GenericSqliteConnection"; +export { + EntityTypescript, + type EntityTypescriptOptions, + type TEntityTSType, + type TFieldTSType, +} from "data/entities/EntityTypescript"; +export * from "data/fields/Field"; +export * from "data/errors"; +export type { EntityRelation } from "data/relations"; +export type * from "data/entities/Entity"; +export type { EntityManager } from "data/entities/EntityManager"; +export type { SchemaManager } from "data/schema/SchemaManager"; +export { + BaseIntrospector, + Connection, + customIntrospector, + type FieldSpec, + type IndexSpec, + type DbFunctions, + type SchemaResponse, + type ConnQuery, + type ConnQueryResults, +} from "data/connection"; +export { SqliteConnection } from "data/connection/sqlite/SqliteConnection"; +export { SqliteIntrospector } from "data/connection/sqlite/SqliteIntrospector"; +export { SqliteLocalConnection } from "data/connection/sqlite/SqliteLocalConnection"; +export { + text, + number, + date, + datetime, + week, + boolean, + enumm, + json, + jsonSchema, + media, + medium, + make, + entity, + relation, + index, + em, + type InferEntityFields, + type InferFields, + type Simplify, + type InferField, + type InsertSchema, + type Schema, + type FieldSchema, +} from "data/prototype"; diff --git a/app/src/media/AppMedia.ts b/app/src/media/AppMedia.ts index aaf31db1..a699d251 100644 --- a/app/src/media/AppMedia.ts +++ b/app/src/media/AppMedia.ts @@ -1,15 +1,16 @@ -import type { AppEntity } from "core"; +import type { AppEntity, FileUploadedEventData, StorageAdapter } from "bknd"; import { $console } from "core/utils"; -import type { Entity, EntityManager } from "data"; -import { type FileUploadedEventData, Storage, type StorageAdapter, MediaPermissions } from "media"; +import type { Entity, EntityManager } from "data/entities"; +import { Storage } from "media/storage/Storage"; import { Module } from "modules/Module"; import { type FieldSchema, em, entity } from "../data/prototype"; import { MediaController } from "./api/MediaController"; -import { buildMediaSchema, type mediaConfigSchema, registry, type TAppMediaConfig } from "./media-schema"; +import { buildMediaSchema, registry, type TAppMediaConfig } from "./media-schema"; import { mediaFields } from "./media-entities"; +import * as MediaPermissions from "media/media-permissions"; export type MediaFieldSchema = FieldSchema; -declare module "core" { +declare module "bknd" { interface Media extends AppEntity, MediaFieldSchema {} interface DB { media: Media; diff --git a/app/src/media/MediaField.ts b/app/src/media/MediaField.ts index 47729e64..5f005bc7 100644 --- a/app/src/media/MediaField.ts +++ b/app/src/media/MediaField.ts @@ -1,5 +1,5 @@ import { Field, baseFieldConfigSchema } from "data/fields"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export const mediaFieldConfigSchema = s .strictObject({ diff --git a/app/src/media/api/MediaApi.ts b/app/src/media/api/MediaApi.ts index 5cb79b63..70cf746a 100644 --- a/app/src/media/api/MediaApi.ts +++ b/app/src/media/api/MediaApi.ts @@ -1,11 +1,10 @@ -import type { FileListObject } from "media"; +import type { FileListObject } from "media/storage/Storage"; import { type BaseModuleApiOptions, ModuleApi, type PrimaryFieldType, type TInput, } from "modules/ModuleApi"; -import type { FileWithPath } from "ui/elements/media/file-selector"; import type { ApiFetcher } from "Api"; export type MediaApiOptions = BaseModuleApiOptions & { diff --git a/app/src/media/api/MediaController.ts b/app/src/media/api/MediaController.ts index 784448ac..5be44fd9 100644 --- a/app/src/media/api/MediaController.ts +++ b/app/src/media/api/MediaController.ts @@ -1,12 +1,13 @@ -import { isDebug } from "core"; -import { HttpStatus, getFileFromContext } from "core/utils"; -import type { StorageAdapter } from "media"; -import { StorageEvents, getRandomizedFilename, MediaPermissions } from "media"; -import { DataPermissions } from "data"; +import { isDebug } from "core/env"; +import type { StorageAdapter } from "media/storage/StorageAdapter"; +import * as DataPermissions from "data/permissions"; import { Controller } from "modules/Controller"; import type { AppMedia } from "../AppMedia"; import { MediaField } from "../MediaField"; -import { jsc, s, describeRoute } from "bknd/core"; +import * as MediaPermissions from "media/media-permissions"; +import * as StorageEvents from "media/storage/events"; +import { jsc, s, describeRoute, HttpStatus, getFileFromContext } from "bknd/utils"; +import { getRandomizedFilename } from "media/utils"; export class MediaController extends Controller { constructor(private readonly media: AppMedia) { diff --git a/app/src/media/index.ts b/app/src/media/index.ts deleted file mode 100644 index 5f4a0369..00000000 --- a/app/src/media/index.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { type Constructor, Registry } from "core"; - -export { guess as guessMimeType } from "./storage/mime-types-tiny"; -export { - Storage, - type FileMeta, - type FileListObject, - type StorageConfig, - type FileBody, - type FileUploadPayload, -} from "./storage/Storage"; -import { StorageAdapter } from "./storage/StorageAdapter"; -import { - type CloudinaryConfig, - StorageCloudinaryAdapter, -} from "./storage/adapters/cloudinary/StorageCloudinaryAdapter"; -import { type S3AdapterConfig, StorageS3Adapter } from "./storage/adapters/s3/StorageS3Adapter"; -import type { s } from "bknd/core"; - -export { StorageAdapter }; -export { StorageS3Adapter, type S3AdapterConfig, StorageCloudinaryAdapter, type CloudinaryConfig }; - -export * as StorageEvents from "./storage/events"; -export * as MediaPermissions from "./media-permissions"; -export type { FileUploadedEventData } from "./storage/events"; -export * from "./utils"; - -type ClassThatImplements = Constructor & { prototype: T }; - -export const MediaAdapterRegistry = new Registry<{ - cls: ClassThatImplements; - schema: s.Schema; -}>((cls: ClassThatImplements) => ({ - cls, - schema: cls.prototype.getSchema() as s.Schema, -})) - .register("s3", StorageS3Adapter) - .register("cloudinary", StorageCloudinaryAdapter); - -export const Adapters = { - s3: { - cls: StorageS3Adapter, - schema: StorageS3Adapter.prototype.getSchema(), - }, - cloudinary: { - cls: StorageCloudinaryAdapter, - schema: StorageCloudinaryAdapter.prototype.getSchema(), - }, -} as const; - -export { adapterTestSuite } from "./storage/adapters/adapter-test-suite"; diff --git a/app/src/media/media-permissions.ts b/app/src/media/media-permissions.ts index 714cc2df..527ce28c 100644 --- a/app/src/media/media-permissions.ts +++ b/app/src/media/media-permissions.ts @@ -1,4 +1,4 @@ -import { Permission } from "core"; +import { Permission } from "core/security/Permission"; export const readFile = new Permission("media.file.read"); export const listFiles = new Permission("media.file.list"); diff --git a/app/src/media/media-registry.ts b/app/src/media/media-registry.ts new file mode 100644 index 00000000..483652d1 --- /dev/null +++ b/app/src/media/media-registry.ts @@ -0,0 +1,28 @@ +import { type Constructor, Registry } from "core/registry/Registry"; +import type { StorageAdapter } from "./storage/StorageAdapter"; +import type { s } from "bknd/utils"; +import { StorageS3Adapter } from "./storage/adapters/s3/StorageS3Adapter"; +import { StorageCloudinaryAdapter } from "./storage/adapters/cloudinary/StorageCloudinaryAdapter"; + +type ClassThatImplements = Constructor & { prototype: T }; + +export const MediaAdapterRegistry = new Registry<{ + cls: ClassThatImplements; + schema: s.Schema; +}>((cls: ClassThatImplements) => ({ + cls, + schema: cls.prototype.getSchema() as s.Schema, +})) + .register("s3", StorageS3Adapter) + .register("cloudinary", StorageCloudinaryAdapter); + +export const MediaAdapters = { + s3: { + cls: StorageS3Adapter, + schema: StorageS3Adapter.prototype.getSchema(), + }, + cloudinary: { + cls: StorageCloudinaryAdapter, + schema: StorageCloudinaryAdapter.prototype.getSchema(), + }, +} as const; diff --git a/app/src/media/media-schema.ts b/app/src/media/media-schema.ts index 0717a803..a287d0ad 100644 --- a/app/src/media/media-schema.ts +++ b/app/src/media/media-schema.ts @@ -1,10 +1,9 @@ -import { objectTransform } from "core/utils"; -import { Adapters } from "media"; +import { MediaAdapters } from "media/media-registry"; import { registries } from "modules/registries"; -import { s } from "bknd/core"; +import { s, objectTransform } from "bknd/utils"; export const ADAPTERS = { - ...Adapters, + ...MediaAdapters, } as const; export const registry = registries.media; diff --git a/app/src/media/storage/StorageAdapter.ts b/app/src/media/storage/StorageAdapter.ts index 0d013a3e..ee00c670 100644 --- a/app/src/media/storage/StorageAdapter.ts +++ b/app/src/media/storage/StorageAdapter.ts @@ -1,6 +1,5 @@ -import type { FileListObject, FileMeta } from "media"; -import type { FileBody, FileUploadPayload } from "media/storage/Storage"; -import type { s } from "bknd/core"; +import type { FileListObject, FileMeta, FileBody, FileUploadPayload } from "media/storage/Storage"; +import type { s } from "bknd/utils"; const SYMBOL = Symbol.for("bknd:storage"); diff --git a/app/src/media/storage/adapters/adapter-test-suite.ts b/app/src/media/storage/adapters/adapter-test-suite.ts index 88aa7f7f..1a92d346 100644 --- a/app/src/media/storage/adapters/adapter-test-suite.ts +++ b/app/src/media/storage/adapters/adapter-test-suite.ts @@ -1,6 +1,6 @@ import { retry, type TestRunner } from "core/test"; -import type { StorageAdapter } from "media"; -import { randomString } from "core/utils"; +import type { StorageAdapter } from "media/storage/StorageAdapter"; +import { randomString } from "bknd/utils"; import type { BunFile } from "bun"; export async function adapterTestSuite( diff --git a/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts b/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts index 54b44ad6..96ec7916 100644 --- a/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts +++ b/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts @@ -1,7 +1,7 @@ import { hash, pickHeaders } from "core/utils"; import type { FileBody, FileListObject, FileMeta } from "../../Storage"; import { StorageAdapter } from "../../StorageAdapter"; -import { s, parse } from "bknd/core"; +import { s, parse } from "bknd/utils"; export const cloudinaryAdapterConfig = s.object( { diff --git a/app/src/media/storage/adapters/s3/StorageS3Adapter.spec.ts b/app/src/media/storage/adapters/s3/StorageS3Adapter.spec.ts index f0b1b521..5a2fe89d 100644 --- a/app/src/media/storage/adapters/s3/StorageS3Adapter.spec.ts +++ b/app/src/media/storage/adapters/s3/StorageS3Adapter.spec.ts @@ -2,7 +2,7 @@ import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { StorageS3Adapter } from "./StorageS3Adapter"; import { config } from "dotenv"; -import { adapterTestSuite } from "media"; +import { adapterTestSuite } from "media/storage/adapters/adapter-test-suite"; import { assetsPath } from "../../../../../__test__/helper"; import { bunTestRunner } from "adapter/bun/test"; //import { enableFetchLogging } from "../../helper"; diff --git a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts index 60d233d5..7f3da6e6 100644 --- a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts +++ b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts @@ -6,12 +6,12 @@ import type { ListObjectsV2Request, PutObjectRequest, } from "@aws-sdk/client-s3"; -import { AwsClient, isDebug } from "core"; -import { isFile, pickHeaders2 } from "core/utils"; +import { AwsClient } from "core/clients/aws/AwsClient"; +import { isDebug } from "core/env"; +import { isFile, pickHeaders2, parse, s } from "bknd/utils"; import { transform } from "lodash-es"; import type { FileBody, FileListObject } from "../../Storage"; import { StorageAdapter } from "../../StorageAdapter"; -import { parse, s } from "bknd/core"; export const s3AdapterConfig = s.object( { diff --git a/app/src/media/utils/index.ts b/app/src/media/utils/index.ts index d9867dbd..61f48f21 100644 --- a/app/src/media/utils/index.ts +++ b/app/src/media/utils/index.ts @@ -1,4 +1,4 @@ -import { isFile, randomString } from "core/utils"; +import { isFile, randomString } from "bknd/utils"; import { extension } from "media/storage/mime-types-tiny"; export function getExtensionFromName(filename: string): string | undefined { diff --git a/app/src/modules/Controller.ts b/app/src/modules/Controller.ts index b83f3898..51ae0260 100644 --- a/app/src/modules/Controller.ts +++ b/app/src/modules/Controller.ts @@ -1,9 +1,8 @@ -import type { App } from "App"; +import type { App, SafeUser } from "bknd"; import { type Context, type Env, Hono } from "hono"; import * as middlewares from "modules/middlewares"; -import type { SafeUser } from "auth"; -import type { EntityManager } from "data"; -import { s } from "bknd/core"; +import type { EntityManager } from "data/entities"; +import { s } from "bknd/utils"; export interface ServerEnv extends Env { Variables: { diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index 21010952..126a15ed 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -1,11 +1,12 @@ -import type { Guard } from "auth"; -import { type DebugLogger, SchemaObject } from "core"; import type { EventManager } from "core/events"; -import type { Connection, EntityManager } from "data"; +import type { Connection } from "data/connection"; +import type { EntityManager } from "data/entities"; import type { Hono } from "hono"; import type { ServerEnv } from "modules/Controller"; import type { ModuleHelper } from "./ModuleHelper"; -import type { s } from "bknd/core"; +import { SchemaObject } from "core/object/SchemaObject"; +import type { DebugLogger } from "core/utils/DebugLogger"; +import type { Guard } from "auth/authorize/Guard"; type PartialRec = { [P in keyof T]?: PartialRec }; diff --git a/app/src/modules/ModuleApi.ts b/app/src/modules/ModuleApi.ts index d8955b8c..f89fb999 100644 --- a/app/src/modules/ModuleApi.ts +++ b/app/src/modules/ModuleApi.ts @@ -1,7 +1,6 @@ -import type { PrimaryFieldType } from "core"; -import { $console, isPlainObject } from "core/utils"; +import type { PrimaryFieldType } from "bknd"; +import { $console, isPlainObject, encodeSearch } from "bknd/utils"; import { isDebug } from "core/env"; -import { encodeSearch } from "core/utils/reqres"; import type { ApiFetcher } from "Api"; export type { PrimaryFieldType }; diff --git a/app/src/modules/ModuleHelper.ts b/app/src/modules/ModuleHelper.ts index 8561ebe3..5bfd30d6 100644 --- a/app/src/modules/ModuleHelper.ts +++ b/app/src/modules/ModuleHelper.ts @@ -1,15 +1,10 @@ -import { - type EntityIndex, - type EntityRelation, - type Field, - type em as prototypeEm, - FieldPrototype, - make, - Entity, - entityTypes, -} from "data"; +import { type em as prototypeEm, FieldPrototype, make } from "data/prototype"; +import { Entity } from "data/entities"; +import type { EntityIndex, Field } from "data/fields"; +import { entityTypes } from "data/entities/Entity"; import { isEqual } from "lodash-es"; import type { ModuleBuildContext } from "./Module"; +import type { EntityRelation } from "data/relations"; export class ModuleHelper { constructor(protected ctx: Omit) {} diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index 059caced..cd189ab7 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -1,10 +1,11 @@ -import { Guard } from "auth"; -import { BkndError, DebugLogger, env } from "core"; -import { $console } from "core/utils"; +import { mark, stripMark, $console, s, objectEach, transformObject } from "bknd/utils"; +import { Guard } from "auth/authorize/Guard"; +import { env } from "core/env"; +import { BkndError } from "core/errors"; +import { DebugLogger } from "core/utils/DebugLogger"; import { EventManager, Event } from "core/events"; import * as $diff from "core/object/diff"; -import { objectEach, transformObject } from "core/utils"; -import type { Connection, Schema } from "data"; +import type { Connection } from "data/connection"; import { EntityManager } from "data/entities/EntityManager"; import * as proto from "data/prototype"; import { TransformPersistFailedException } from "data/errors"; @@ -20,8 +21,6 @@ import { AppMedia } from "../media/AppMedia"; import type { ServerEnv } from "./Controller"; import { Module, type ModuleBuildContext } from "./Module"; import { ModuleHelper } from "./ModuleHelper"; -import { s } from "bknd/core"; -import { mark, stripMark } from "bknd/core"; export type { ModuleBuildContext }; @@ -108,11 +107,11 @@ const configJsonSchema = s.anyOf([ export const __bknd = proto.entity(TABLE_NAME, { version: proto.number().required(), type: proto.enumm({ enum: ["config", "diff", "backup"] }).required(), - json: proto.jsonSchema({ schema: configJsonSchema }).required(), + json: proto.jsonSchema({ schema: configJsonSchema.toJSON() }).required(), created_at: proto.datetime(), updated_at: proto.datetime(), }); -type ConfigTable2 = Schema; +type ConfigTable2 = proto.Schema; interface T_INTERNAL_EM { __bknd: ConfigTable2; } @@ -732,9 +731,14 @@ export function getDefaultSchema() { export function getDefaultConfig(): ModuleConfigs { const config = transformObject(MODULES, (module) => { - return module.prototype.getSchema().template(); - //return Default(module.prototype.getSchema(), {}); + return module.prototype.getSchema().template( + {}, + { + withOptional: true, + withExtendedOptional: true, + }, + ); }); - return config as any; + return structuredClone(config) as any; } diff --git a/app/src/modules/permissions/index.ts b/app/src/modules/permissions/index.ts index a2d891db..cc54754c 100644 --- a/app/src/modules/permissions/index.ts +++ b/app/src/modules/permissions/index.ts @@ -1,4 +1,4 @@ -import { Permission } from "core"; +import { Permission } from "core/security/Permission"; export const accessAdmin = new Permission("system.access.admin"); export const accessApi = new Permission("system.access.api"); diff --git a/app/src/modules/registries.ts b/app/src/modules/registries.ts index fdd29aa0..31538427 100644 --- a/app/src/modules/registries.ts +++ b/app/src/modules/registries.ts @@ -1,4 +1,4 @@ -import { MediaAdapterRegistry } from "media"; +import { MediaAdapterRegistry } from "media/media-registry"; const registries = { media: MediaAdapterRegistry, diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index 5cb66d6c..d7140988 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -1,8 +1,9 @@ /** @jsxImportSource hono/jsx */ import type { App } from "App"; -import { config, isDebug } from "core"; -import { $console } from "core/utils"; +import { isDebug } from "core/env"; +import { config } from "core/config"; +import { $console } from "bknd/utils"; import { addFlashMessage } from "core/server/flash"; import { html } from "hono/html"; import { Fragment } from "hono/jsx"; diff --git a/app/src/modules/server/AppServer.ts b/app/src/modules/server/AppServer.ts index a17dcf07..6a2f851d 100644 --- a/app/src/modules/server/AppServer.ts +++ b/app/src/modules/server/AppServer.ts @@ -1,9 +1,9 @@ -import { Exception, isDebug } from "core"; -import { $console } from "core/utils"; +import { Exception } from "core/errors"; +import { isDebug } from "core/env"; +import { $console, s } from "bknd/utils"; import { cors } from "hono/cors"; import { Module } from "modules/Module"; import { AuthException } from "auth/errors"; -import { s } from "bknd/core"; const serverMethods = ["GET", "POST", "PATCH", "PUT", "DELETE"] as const; diff --git a/app/src/modules/server/SystemController.ts b/app/src/modules/server/SystemController.ts index 7b0f9ca9..704da55e 100644 --- a/app/src/modules/server/SystemController.ts +++ b/app/src/modules/server/SystemController.ts @@ -7,8 +7,13 @@ import { getTimezone, getTimezoneOffset, $console, -} from "core/utils"; -import { getRuntimeKey } from "core/utils"; + getRuntimeKey, + SecretSchema, + jsc, + s, + describeRoute, + InvalidSchemaError, +} from "bknd/utils"; import type { Context, Hono } from "hono"; import { Controller } from "modules/Controller"; import { openAPISpecs } from "jsonv-ts/hono"; @@ -20,9 +25,7 @@ import { type ModuleKey, } from "modules/ModuleManager"; import * as SystemPermissions from "modules/permissions"; -import { jsc, s, describeRoute, InvalidSchemaError } from "bknd/core"; import { getVersion } from "core/env"; -import { SecretSchema } from "core/object/schema/secret"; export type ConfigUpdate = { success: true; diff --git a/app/src/plugins/cloudflare/image-optimization.plugin.ts b/app/src/plugins/cloudflare/image-optimization.plugin.ts index a3261685..ab88161b 100644 --- a/app/src/plugins/cloudflare/image-optimization.plugin.ts +++ b/app/src/plugins/cloudflare/image-optimization.plugin.ts @@ -1,6 +1,5 @@ import type { App, AppPlugin } from "bknd"; -import { s, jsc } from "bknd/core"; -import { mergeObject, pickHeaders2 } from "core/utils"; +import { s, jsc, mergeObject, pickHeaders2 } from "bknd/utils"; /** * check RequestInitCfPropertiesImage diff --git a/app/src/plugins/dev/sync-types.plugin.ts b/app/src/plugins/dev/sync-types.plugin.ts index aa6756a2..c632e63e 100644 --- a/app/src/plugins/dev/sync-types.plugin.ts +++ b/app/src/plugins/dev/sync-types.plugin.ts @@ -1,5 +1,4 @@ -import { App, type AppPlugin } from "bknd"; -import { EntityTypescript } from "bknd/data"; +import { App, type AppPlugin, EntityTypescript } from "bknd"; export type SyncTypesOptions = { enabled?: boolean; diff --git a/app/src/ui/client/ClientProvider.tsx b/app/src/ui/client/ClientProvider.tsx index 37fe5348..13352d14 100644 --- a/app/src/ui/client/ClientProvider.tsx +++ b/app/src/ui/client/ClientProvider.tsx @@ -1,5 +1,5 @@ import { Api, type ApiOptions, type AuthState } from "Api"; -import { isDebug } from "core"; +import { isDebug } from "core/env"; import { createContext, type ReactNode, useContext, useMemo, useState } from "react"; import type { AdminBkndWindowContext } from "modules/server/AdminController"; diff --git a/app/src/ui/client/api/use-entity.ts b/app/src/ui/client/api/use-entity.ts index 4219c412..907bc332 100644 --- a/app/src/ui/client/api/use-entity.ts +++ b/app/src/ui/client/api/use-entity.ts @@ -1,7 +1,6 @@ -import type { DB, PrimaryFieldType } from "core"; -import { objectTransform } from "core/utils/objects"; -import { encodeSearch } from "core/utils/reqres"; -import type { EntityData, RepoQueryIn, RepositoryResult } from "data"; +import type { DB, PrimaryFieldType, EntityData, RepoQueryIn } from "bknd"; +import { objectTransform, encodeSearch } from "bknd/utils"; +import type { RepositoryResult } from "data/entities"; import type { Insertable, Selectable, Updateable } from "kysely"; import type { FetchPromise, ModuleApi, ResponseObject } from "modules/ModuleApi"; import useSWR, { type SWRConfiguration, type SWRResponse, mutate } from "swr"; diff --git a/app/src/ui/client/index.ts b/app/src/ui/client/index.ts index 500c9bef..2fb520eb 100644 --- a/app/src/ui/client/index.ts +++ b/app/src/ui/client/index.ts @@ -11,4 +11,4 @@ export * from "./api/use-entity"; export { useAuth } from "./schema/auth/use-auth"; export { Api, type TApiUser, type AuthState, type ApiOptions } from "../../Api"; export { FetchPromise } from "modules/ModuleApi"; -export type { RepoQueryIn } from "data"; +export type { RepoQueryIn } from "bknd"; diff --git a/app/src/ui/client/schema/auth/use-auth.ts b/app/src/ui/client/schema/auth/use-auth.ts index e932d782..e3fb4a6f 100644 --- a/app/src/ui/client/schema/auth/use-auth.ts +++ b/app/src/ui/client/schema/auth/use-auth.ts @@ -1,5 +1,5 @@ import type { AuthState } from "Api"; -import type { AuthResponse } from "auth"; +import type { AuthResponse } from "bknd"; import { useApi, useInvalidate } from "ui/client"; import { useClientContext } from "ui/client/ClientProvider"; diff --git a/app/src/ui/client/schema/data/use-bknd-data.ts b/app/src/ui/client/schema/data/use-bknd-data.ts index 7ed2a7db..98ee85ab 100644 --- a/app/src/ui/client/schema/data/use-bknd-data.ts +++ b/app/src/ui/client/schema/data/use-bknd-data.ts @@ -1,5 +1,4 @@ -import { transformObject } from "core/utils"; -import { constructEntity } from "data"; +import { constructEntity } from "data/schema/constructor"; import { type TAppDataEntity, type TAppDataEntityFields, @@ -13,7 +12,7 @@ import { import { useBknd } from "ui/client/bknd"; import type { TSchemaActions } from "ui/client/schema/actions"; import { bkndModals } from "ui/modals"; -import { s, parse, InvalidSchemaError } from "bknd/core"; +import { s, parse, InvalidSchemaError, transformObject } from "bknd/utils"; export function useBkndData() { const { config, app, schema, actions: bkndActions } = useBknd(); diff --git a/app/src/ui/client/schema/flows/use-flows.ts b/app/src/ui/client/schema/flows/use-flows.ts index a4d049de..2e3dcd5f 100644 --- a/app/src/ui/client/schema/flows/use-flows.ts +++ b/app/src/ui/client/schema/flows/use-flows.ts @@ -1,4 +1,4 @@ -import { parse } from "bknd/core"; +import { parse } from "bknd/utils"; import { type TAppFlowSchema, flowSchema } from "flows/flows-schema"; import { useBknd } from "../../BkndProvider"; diff --git a/app/src/ui/client/utils/AppReduced.ts b/app/src/ui/client/utils/AppReduced.ts index 4da7b0d9..2085d99c 100644 --- a/app/src/ui/client/utils/AppReduced.ts +++ b/app/src/ui/client/utils/AppReduced.ts @@ -1,5 +1,7 @@ import type { App } from "App"; -import { type Entity, type EntityRelation, constructEntity, constructRelation } from "data"; +import type { Entity } from "data/entities"; +import type { EntityRelation } from "data/relations"; +import { constructEntity, constructRelation } from "data/schema/constructor"; import { RelationAccessor } from "data/relations/RelationAccessor"; import { Flow, TaskMap } from "flows"; import type { BkndAdminOptions } from "ui/client/BkndProvider"; diff --git a/app/src/ui/components/form/Formy/components.tsx b/app/src/ui/components/form/Formy/components.tsx index 4eb8cb43..64d0f7ae 100644 --- a/app/src/ui/components/form/Formy/components.tsx +++ b/app/src/ui/components/form/Formy/components.tsx @@ -1,6 +1,6 @@ import clsx from "clsx"; import { getBrowser } from "core/utils"; -import type { Field } from "data"; +import type { Field } from "data/fields"; import { Switch as RadixSwitch } from "radix-ui"; import { type ComponentPropsWithoutRef, diff --git a/app/src/ui/elements/media/Dropzone.tsx b/app/src/ui/elements/media/Dropzone.tsx index bc2cb080..b1e4e974 100644 --- a/app/src/ui/elements/media/Dropzone.tsx +++ b/app/src/ui/elements/media/Dropzone.tsx @@ -1,4 +1,4 @@ -import type { DB } from "core"; +import type { DB } from "bknd"; import { type ComponentPropsWithRef, createContext, diff --git a/app/src/ui/elements/media/DropzoneContainer.tsx b/app/src/ui/elements/media/DropzoneContainer.tsx index 1ecd4f23..2f695a94 100644 --- a/app/src/ui/elements/media/DropzoneContainer.tsx +++ b/app/src/ui/elements/media/DropzoneContainer.tsx @@ -1,6 +1,5 @@ import type { Api } from "bknd/client"; -import type { PrimaryFieldType } from "core"; -import type { RepoQueryIn } from "data"; +import type { PrimaryFieldType, RepoQueryIn } from "bknd"; import type { MediaFieldSchema } from "media/AppMedia"; import type { TAppMediaConfig } from "media/media-schema"; import { useId, useEffect, useRef, useState } from "react"; diff --git a/app/src/ui/hooks/use-event.ts b/app/src/ui/hooks/use-event.ts index e55baca5..d68e0308 100644 --- a/app/src/ui/hooks/use-event.ts +++ b/app/src/ui/hooks/use-event.ts @@ -5,7 +5,7 @@ // .current at the right timing." // So we will have to make do with this "close enough" approach for now. import { useLayoutEffect, useRef } from "react"; -import { isDebug } from "core"; +import { isDebug } from "core/env"; export const useEvent = (fn: Fn): Fn => { if (isDebug()) { diff --git a/app/src/ui/hooks/use-search.ts b/app/src/ui/hooks/use-search.ts index e58928a8..40967c15 100644 --- a/app/src/ui/hooks/use-search.ts +++ b/app/src/ui/hooks/use-search.ts @@ -1,7 +1,6 @@ -import { decodeSearch, encodeSearch, mergeObject } from "core/utils"; +import { decodeSearch, encodeSearch, mergeObject, type s, parse } from "bknd/utils"; import { isEqual, transform } from "lodash-es"; import { useLocation, useSearch as useWouterSearch } from "wouter"; -import { type s, parse } from "bknd/core"; import { useEffect, useMemo, useState } from "react"; export type UseSearchOptions = { diff --git a/app/src/ui/lib/routes.ts b/app/src/ui/lib/routes.ts index 42b896ba..7243099a 100644 --- a/app/src/ui/lib/routes.ts +++ b/app/src/ui/lib/routes.ts @@ -1,5 +1,5 @@ -import type { PrimaryFieldType } from "core"; -import { encodeSearch } from "core/utils"; +import type { PrimaryFieldType } from "bknd"; +import { encodeSearch } from "bknd/utils"; import { useLocation, useRouter } from "wouter"; import { useBknd } from "../client/BkndProvider"; diff --git a/app/src/ui/modules/data/components/EntityForm.tsx b/app/src/ui/modules/data/components/EntityForm.tsx index 50c9febc..c82a0c3a 100644 --- a/app/src/ui/modules/data/components/EntityForm.tsx +++ b/app/src/ui/modules/data/components/EntityForm.tsx @@ -1,14 +1,6 @@ +import type { PrimaryFieldType, Entity, EntityData, Field } from "bknd"; import type { FieldApi, ReactFormExtendedApi } from "@tanstack/react-form"; import type { JSX } from "react"; -import { - type Entity, - type EntityData, - EnumField, - type Field, - JsonField, - JsonSchemaField, - RelationField, -} from "data"; import { useStore } from "@tanstack/react-store"; import { MediaField } from "media/MediaField"; import { type ComponentProps, Suspense } from "react"; @@ -22,7 +14,8 @@ import { EntityRelationalFormField } from "./fields/EntityRelationalFormField"; import ErrorBoundary from "ui/components/display/ErrorBoundary"; import { Alert } from "ui/components/display/Alert"; import { bkndModals } from "ui/modals"; -import type { PrimaryFieldType } from "core"; +import type { EnumField, JsonField, JsonSchemaField } from "data/fields"; +import type { RelationField } from "data/relations"; // simplify react form types 🤦 export type FormApi = ReactFormExtendedApi; @@ -162,11 +155,11 @@ function EntityFormField({ fieldApi, field, action, data, ...props }: EntityForm //const required = field.isRequired(); //const customFieldProps = { ...props, action, required }; - if (field instanceof RelationField) { + if (field.type === "relation") { return ( ; + if (field.type === "json") { + return ; } - if (field instanceof JsonSchemaField) { + if (field.type === "jsonschema") { return ( ; + if (field.type === "enum") { + return ; } const fieldElement = field.getHtmlConfig().element; diff --git a/app/src/ui/modules/data/components/EntityTable.tsx b/app/src/ui/modules/data/components/EntityTable.tsx index a45e07b5..87c2bf10 100644 --- a/app/src/ui/modules/data/components/EntityTable.tsx +++ b/app/src/ui/modules/data/components/EntityTable.tsx @@ -1,5 +1,5 @@ import { useToggle } from "@mantine/hooks"; -import type { Entity, EntityData } from "data"; +import type { Entity, EntityData } from "bknd"; import { TbArrowDown, TbArrowUp, diff --git a/app/src/ui/modules/data/components/EntityTable2.tsx b/app/src/ui/modules/data/components/EntityTable2.tsx index c94f2e9d..6b03d6a6 100644 --- a/app/src/ui/modules/data/components/EntityTable2.tsx +++ b/app/src/ui/modules/data/components/EntityTable2.tsx @@ -1,4 +1,4 @@ -import type { Entity, EntityData } from "data"; +import type { Entity, EntityData } from "bknd"; import { CellValue, DataTable, type DataTableProps } from "ui/components/table/DataTable"; import ErrorBoundary from "ui/components/display/ErrorBoundary"; diff --git a/app/src/ui/modules/data/components/fields/EntityJsonSchemaFormField.tsx b/app/src/ui/modules/data/components/fields/EntityJsonSchemaFormField.tsx index 6fb3ee38..6752a978 100644 --- a/app/src/ui/modules/data/components/fields/EntityJsonSchemaFormField.tsx +++ b/app/src/ui/modules/data/components/fields/EntityJsonSchemaFormField.tsx @@ -1,4 +1,5 @@ -import type { EntityData, JsonSchemaField } from "data"; +import type { EntityData } from "bknd"; +import type { JsonSchemaField } from "data/fields"; import * as Formy from "ui/components/form/Formy"; import { FieldLabel } from "ui/components/form/Formy"; import { JsonSchemaForm } from "ui/components/form/json-schema"; diff --git a/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx b/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx index 5de71bdc..941f8992 100644 --- a/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx +++ b/app/src/ui/modules/data/components/fields/EntityRelationalFormField.tsx @@ -1,6 +1,7 @@ import { getHotkeyHandler, useHotkeys } from "@mantine/hooks"; import { ucFirst } from "core/utils"; -import type { EntityData, RelationField } from "data"; +import type { EntityData } from "bknd"; +import type { RelationField } from "data/relations"; import { useEffect, useRef, useState } from "react"; import { TbEye } from "react-icons/tb"; import { useEntityQuery } from "ui/client"; diff --git a/app/src/ui/modules/data/components/schema/create-modal/schema.ts b/app/src/ui/modules/data/components/schema/create-modal/schema.ts index cc9fe8c8..295b4986 100644 --- a/app/src/ui/modules/data/components/schema/create-modal/schema.ts +++ b/app/src/ui/modules/data/components/schema/create-modal/schema.ts @@ -1,4 +1,4 @@ -import { s } from "bknd/core"; +import { s } from "bknd/utils"; import { entitiesSchema, fieldsSchema, relationsSchema } from "data/data-schema"; export const ModalActions = ["entity", "relation", "media"] as const; diff --git a/app/src/ui/modules/data/components/schema/create-modal/step.entity.fields.tsx b/app/src/ui/modules/data/components/schema/create-modal/step.entity.fields.tsx index 7a45e057..b066dd1b 100644 --- a/app/src/ui/modules/data/components/schema/create-modal/step.entity.fields.tsx +++ b/app/src/ui/modules/data/components/schema/create-modal/step.entity.fields.tsx @@ -1,4 +1,4 @@ -import { objectCleanEmpty } from "core/utils"; +import { objectCleanEmpty, type s } from "bknd/utils"; import { type TAppDataEntityFields, entitiesSchema } from "data/data-schema"; import { mergeWith } from "lodash-es"; import { useRef } from "react"; @@ -11,7 +11,6 @@ import { } from "ui/routes/data/forms/entity.fields.form"; import { ModalBody, ModalFooter, useStepContext } from "./CreateModal"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; -import type { s } from "bknd/core"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; import { entitySchema, type TCreateModalSchema } from "./schema"; diff --git a/app/src/ui/modules/data/components/schema/create-modal/step.entity.tsx b/app/src/ui/modules/data/components/schema/create-modal/step.entity.tsx index 6ac1e9ef..4384c3ad 100644 --- a/app/src/ui/modules/data/components/schema/create-modal/step.entity.tsx +++ b/app/src/ui/modules/data/components/schema/create-modal/step.entity.tsx @@ -4,8 +4,8 @@ import { useFocusTrap } from "@mantine/hooks"; import { useForm } from "react-hook-form"; import { ModalBody, ModalFooter, useStepContext } from "./CreateModal"; import { entitySchema, type TCreateModalSchema } from "./schema"; -import { s } from "bknd/core"; -import { cloneSchema } from "core/object/schema"; +import { s } from "bknd/utils"; +import { cloneSchema } from "core/utils/schema"; const schema = s.object({ name: entitySchema.properties.name, diff --git a/app/src/ui/modules/data/components/schema/create-modal/step.relation.tsx b/app/src/ui/modules/data/components/schema/create-modal/step.relation.tsx index 73ef8df3..6685d98c 100644 --- a/app/src/ui/modules/data/components/schema/create-modal/step.relation.tsx +++ b/app/src/ui/modules/data/components/schema/create-modal/step.relation.tsx @@ -1,6 +1,6 @@ import { Switch, TextInput } from "@mantine/core"; import { IconDatabase } from "@tabler/icons-react"; -import { ManyToOneRelation, type RelationType, RelationTypes } from "data"; +import { ManyToOneRelation, type RelationType, RelationTypes } from "data/relations"; import type { ReactNode } from "react"; import { type Control, type FieldValues, type UseFormRegister, useForm } from "react-hook-form"; import { TbRefresh } from "react-icons/tb"; @@ -12,7 +12,7 @@ import { useStepContext } from "ui/components/steps/Steps"; import { useEvent } from "ui/hooks/use-event"; import { ModalBody, ModalFooter } from "./CreateModal"; import type { TCreateModalSchema } from "./schema"; -import { s, stringIdentifier } from "bknd/core"; +import { s, stringIdentifier } from "bknd/utils"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; const Relations: { diff --git a/app/src/ui/modules/data/components/schema/create-modal/templates/media/template.media.component.tsx b/app/src/ui/modules/data/components/schema/create-modal/templates/media/template.media.component.tsx index f4f581b5..9f710066 100644 --- a/app/src/ui/modules/data/components/schema/create-modal/templates/media/template.media.component.tsx +++ b/app/src/ui/modules/data/components/schema/create-modal/templates/media/template.media.component.tsx @@ -1,5 +1,5 @@ import { Radio, TextInput } from "@mantine/core"; -import { transformObject } from "core/utils"; +import { transformObject, s, stringIdentifier } from "bknd/utils"; import type { MediaFieldConfig } from "media/MediaField"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; @@ -9,7 +9,6 @@ import { MantineRadio } from "ui/components/form/hook-form-mantine/MantineRadio" import { MantineSelect } from "ui/components/form/hook-form-mantine/MantineSelect"; import { ModalBody, ModalFooter, useStepContext } from "../../CreateModal"; import type { TCreateModalSchema, TFieldCreate } from "../../schema"; -import { s, stringIdentifier } from "bknd/core"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; const schema = s.object({ diff --git a/app/src/ui/modules/data/hooks/useEntityForm.tsx b/app/src/ui/modules/data/hooks/useEntityForm.tsx index f13d1bc6..1d9411c4 100644 --- a/app/src/ui/modules/data/hooks/useEntityForm.tsx +++ b/app/src/ui/modules/data/hooks/useEntityForm.tsx @@ -1,5 +1,5 @@ import { useForm } from "@tanstack/react-form"; -import type { Entity, EntityData } from "data"; +import type { Entity, EntityData } from "bknd"; import { getChangeSet, getDefaultValues } from "data/helper"; type EntityFormProps = { diff --git a/app/src/ui/modules/flows/components/TriggerComponent.tsx b/app/src/ui/modules/flows/components/TriggerComponent.tsx index 218a4c83..18875882 100644 --- a/app/src/ui/modules/flows/components/TriggerComponent.tsx +++ b/app/src/ui/modules/flows/components/TriggerComponent.tsx @@ -4,7 +4,7 @@ import { type Trigger, TriggerMap } from "flows"; import type { IconType } from "react-icons"; import { TbCircleLetterT } from "react-icons/tb"; import { JsonSchemaForm } from "ui/components/form/json-schema"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export type TaskComponentProps = NodeProps> & { Icon?: IconType; diff --git a/app/src/ui/modules/flows/components/form/TemplateField.tsx b/app/src/ui/modules/flows/components/form/TemplateField.tsx index 6e2506b4..a7de5dc0 100644 --- a/app/src/ui/modules/flows/components/form/TemplateField.tsx +++ b/app/src/ui/modules/flows/components/form/TemplateField.tsx @@ -1,6 +1,6 @@ import type { FieldProps, FormContextType, RJSFSchema, StrictRJSFSchema } from "@rjsf/utils"; -import { SimpleRenderer } from "core"; -import { ucFirst, ucFirstAll } from "core/utils"; +import { SimpleRenderer } from "core/template/SimpleRenderer"; +import { ucFirst, ucFirstAll } from "bknd/utils"; import { useState } from "react"; const modes = ["field", "code"] as const; diff --git a/app/src/ui/modules/flows/components2/nodes/tasks/FetchTaskNode.tsx b/app/src/ui/modules/flows/components2/nodes/tasks/FetchTaskNode.tsx index 2f1a3b7f..1cde928a 100644 --- a/app/src/ui/modules/flows/components2/nodes/tasks/FetchTaskNode.tsx +++ b/app/src/ui/modules/flows/components2/nodes/tasks/FetchTaskNode.tsx @@ -2,7 +2,7 @@ import { Input, TextInput } from "@mantine/core"; import { useToggle } from "@mantine/hooks"; import { IconMinus, IconPlus, IconWorld } from "@tabler/icons-react"; import type { Node, NodeProps } from "@xyflow/react"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; import { FetchTask } from "flows"; import { useState } from "react"; import { useForm } from "react-hook-form"; diff --git a/app/src/ui/modules/flows/components2/nodes/triggers/TriggerNode.tsx b/app/src/ui/modules/flows/components2/nodes/triggers/TriggerNode.tsx index 4d95d4a4..4bce7a71 100644 --- a/app/src/ui/modules/flows/components2/nodes/triggers/TriggerNode.tsx +++ b/app/src/ui/modules/flows/components2/nodes/triggers/TriggerNode.tsx @@ -10,7 +10,7 @@ import { MantineSelect } from "ui/components/form/hook-form-mantine/MantineSelec import { useFlowCanvas, useFlowSelector } from "../../../hooks/use-flow"; import { BaseNode } from "../BaseNode"; import { Handle } from "../Handle"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; const schema = s.object({ diff --git a/app/src/ui/routes/auth/auth.roles.tsx b/app/src/ui/routes/auth/auth.roles.tsx index 711a90b5..fa0e521c 100644 --- a/app/src/ui/routes/auth/auth.roles.tsx +++ b/app/src/ui/routes/auth/auth.roles.tsx @@ -1,4 +1,9 @@ -import { transformObject, ucFirstAllSnakeToPascalWithSpaces } from "core/utils"; +import { + transformObject, + ucFirstAllSnakeToPascalWithSpaces, + s, + stringIdentifier, +} from "bknd/utils"; import { useBkndAuth } from "ui/client/schema/auth/use-bknd-auth"; import { Alert } from "ui/components/display/Alert"; import { bkndModals } from "ui/modals"; @@ -6,7 +11,6 @@ import { Button } from "../../components/buttons/Button"; import { CellValue, DataTable } from "../../components/table/DataTable"; import * as AppShell from "../../layouts/AppShell/AppShell"; import { routes, useNavigate } from "../../lib/routes"; -import { s, stringIdentifier } from "bknd/core"; export function AuthRolesList() { const [navigate] = useNavigate(); diff --git a/app/src/ui/routes/auth/auth.settings.tsx b/app/src/ui/routes/auth/auth.settings.tsx index 4a3cced5..1ec1403e 100644 --- a/app/src/ui/routes/auth/auth.settings.tsx +++ b/app/src/ui/routes/auth/auth.settings.tsx @@ -1,5 +1,5 @@ import clsx from "clsx"; -import { isDebug } from "core"; +import { isDebug } from "core/env"; import { TbChevronDown, TbChevronUp } from "react-icons/tb"; import { useBknd } from "ui/client/BkndProvider"; import { useBkndAuth } from "ui/client/schema/auth/use-bknd-auth"; diff --git a/app/src/ui/routes/auth/auth.strategies.tsx b/app/src/ui/routes/auth/auth.strategies.tsx index f4b03620..e7d18d0a 100644 --- a/app/src/ui/routes/auth/auth.strategies.tsx +++ b/app/src/ui/routes/auth/auth.strategies.tsx @@ -1,4 +1,4 @@ -import { isDebug } from "core"; +import { isDebug } from "core/env"; import { autoFormatString } from "core/utils"; import { type ChangeEvent, useState } from "react"; import { diff --git a/app/src/ui/routes/auth/forms/role.form.tsx b/app/src/ui/routes/auth/forms/role.form.tsx index 1bd44670..0a16d2de 100644 --- a/app/src/ui/routes/auth/forms/role.form.tsx +++ b/app/src/ui/routes/auth/forms/role.form.tsx @@ -1,12 +1,11 @@ import { Input, Switch, Tooltip } from "@mantine/core"; import { guardRoleSchema } from "auth/auth-schema"; -import { ucFirst } from "core/utils"; +import { ucFirst, type s } from "bknd/utils"; import { forwardRef, useImperativeHandle } from "react"; import { type UseControllerProps, useController, useForm } from "react-hook-form"; import { useBknd } from "ui/client/bknd"; import { Button } from "ui/components/buttons/Button"; import { MantineSwitch } from "ui/components/form/hook-form-mantine/MantineSwitch"; -import type { s } from "bknd/core"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; const schema = guardRoleSchema; diff --git a/app/src/ui/routes/data/_data.root.tsx b/app/src/ui/routes/data/_data.root.tsx index a72be123..344ef695 100644 --- a/app/src/ui/routes/data/_data.root.tsx +++ b/app/src/ui/routes/data/_data.root.tsx @@ -9,7 +9,7 @@ import { IconSettings, IconSwitchHorizontal, } from "@tabler/icons-react"; -import type { Entity, TEntityType } from "data"; +import type { Entity, TEntityType } from "bknd"; import { TbDatabasePlus } from "react-icons/tb"; import { twMerge } from "tailwind-merge"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; diff --git a/app/src/ui/routes/data/data.$entity.$id.tsx b/app/src/ui/routes/data/data.$entity.$id.tsx index e531452d..f4f5cd6f 100644 --- a/app/src/ui/routes/data/data.$entity.$id.tsx +++ b/app/src/ui/routes/data/data.$entity.$id.tsx @@ -1,6 +1,6 @@ -import type { PrimaryFieldType } from "core"; -import { ucFirst } from "core/utils"; -import type { Entity, EntityData, EntityRelation } from "data"; +import type { PrimaryFieldType } from "bknd"; +import { ucFirst } from "bknd/utils"; +import type { Entity, EntityData, EntityRelation } from "bknd"; import { Fragment, useState } from "react"; import { TbDots } from "react-icons/tb"; import { useApiQuery, useEntityQuery } from "ui/client"; diff --git a/app/src/ui/routes/data/data.$entity.create.tsx b/app/src/ui/routes/data/data.$entity.create.tsx index df21081b..62ba3dfc 100644 --- a/app/src/ui/routes/data/data.$entity.create.tsx +++ b/app/src/ui/routes/data/data.$entity.create.tsx @@ -1,4 +1,4 @@ -import type { EntityData } from "data"; +import type { EntityData } from "bknd"; import { useState } from "react"; import { useEntityMutate } from "ui/client"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; @@ -11,7 +11,7 @@ import { Breadcrumbs2 } from "ui/layouts/AppShell/Breadcrumbs2"; import { routes, useNavigate } from "ui/lib/routes"; import { EntityForm } from "ui/modules/data/components/EntityForm"; import { useEntityForm } from "ui/modules/data/hooks/useEntityForm"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; export function DataEntityCreate({ params }) { const { $data } = useBkndData(); diff --git a/app/src/ui/routes/data/data.$entity.index.tsx b/app/src/ui/routes/data/data.$entity.index.tsx index 93b77429..09a604e7 100644 --- a/app/src/ui/routes/data/data.$entity.index.tsx +++ b/app/src/ui/routes/data/data.$entity.index.tsx @@ -1,4 +1,5 @@ -import { type Entity, repoQuery } from "data"; +import type { Entity } from "bknd"; +import { repoQuery } from "data/server/query"; import { Fragment } from "react"; import { TbDots } from "react-icons/tb"; import { useApiQuery } from "ui/client"; @@ -14,7 +15,7 @@ import * as AppShell from "ui/layouts/AppShell/AppShell"; import { routes, useNavigate } from "ui/lib/routes"; import { useCreateUserModal } from "ui/modules/auth/hooks/use-create-user-modal"; import { EntityTable2 } from "ui/modules/data/components/EntityTable2"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; import { pick } from "core/utils/objects"; const searchSchema = s.partialObject({ diff --git a/app/src/ui/routes/data/data.schema.$entity.tsx b/app/src/ui/routes/data/data.schema.$entity.tsx index 3125a349..99f2d135 100644 --- a/app/src/ui/routes/data/data.schema.$entity.tsx +++ b/app/src/ui/routes/data/data.schema.$entity.tsx @@ -4,8 +4,8 @@ import { IconCirclesRelation, IconSettings, } from "@tabler/icons-react"; -import { isDebug } from "core"; -import type { Entity } from "data"; +import { isDebug } from "core/env"; +import type { Entity } from "bknd"; import { cloneDeep } from "lodash-es"; import { useRef, useState } from "react"; import { diff --git a/app/src/ui/routes/data/forms/entity.fields.form.tsx b/app/src/ui/routes/data/forms/entity.fields.form.tsx index ee8bf76e..d8f7d53b 100644 --- a/app/src/ui/routes/data/forms/entity.fields.form.tsx +++ b/app/src/ui/routes/data/forms/entity.fields.form.tsx @@ -1,5 +1,11 @@ import { Tabs, TextInput, Textarea, Tooltip, Switch } from "@mantine/core"; -import { objectCleanEmpty, omitKeys, ucFirstAllSnakeToPascalWithSpaces } from "core/utils"; +import { + objectCleanEmpty, + omitKeys, + ucFirstAllSnakeToPascalWithSpaces, + s, + stringIdentifier, +} from "bknd/utils"; import { type TAppDataEntityFields, fieldsSchemaObject as originalFieldsSchemaObject, @@ -21,7 +27,6 @@ import { dataFieldsUiSchema } from "../../settings/routes/data.settings"; import { useRoutePathState } from "ui/hooks/use-route-path-state"; import { MantineSelect } from "ui/components/form/hook-form-mantine/MantineSelect"; import type { TPrimaryFieldFormat } from "data/fields/PrimaryField"; -import { s, stringIdentifier } from "bknd/core"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; import ErrorBoundary from "ui/components/display/ErrorBoundary"; diff --git a/app/src/ui/routes/flows/_flows.root.tsx b/app/src/ui/routes/flows/_flows.root.tsx index bb1e7a80..681a6e26 100644 --- a/app/src/ui/routes/flows/_flows.root.tsx +++ b/app/src/ui/routes/flows/_flows.root.tsx @@ -1,5 +1,5 @@ import { IconHierarchy2 } from "@tabler/icons-react"; -import { isDebug } from "core"; +import { isDebug } from "core/env"; import { TbSettings } from "react-icons/tb"; import { useBknd } from "../../client/BkndProvider"; import { IconButton } from "../../components/buttons/IconButton"; diff --git a/app/src/ui/routes/flows/components/FlowCreateModal.tsx b/app/src/ui/routes/flows/components/FlowCreateModal.tsx index 35b7afd3..955e2157 100644 --- a/app/src/ui/routes/flows/components/FlowCreateModal.tsx +++ b/app/src/ui/routes/flows/components/FlowCreateModal.tsx @@ -13,7 +13,7 @@ import { ModalTitle, } from "../../../components/modal/Modal2"; import { Step, Steps, useStepContext } from "../../../components/steps/Steps"; -import { s, stringIdentifier } from "bknd/core"; +import { s, stringIdentifier } from "bknd/utils"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; export type TCreateFlowModalSchema = any; diff --git a/app/src/ui/routes/media/media.settings.tsx b/app/src/ui/routes/media/media.settings.tsx index e8a7cd7e..3a904e26 100644 --- a/app/src/ui/routes/media/media.settings.tsx +++ b/app/src/ui/routes/media/media.settings.tsx @@ -1,5 +1,5 @@ import { IconBrandAws, IconBrandCloudflare, IconCloud, IconServer } from "@tabler/icons-react"; -import { isDebug } from "core"; +import { isDebug } from "core/env"; import { autoFormatString } from "core/utils"; import { twMerge } from "tailwind-merge"; import { useBknd } from "ui/client/BkndProvider"; diff --git a/app/src/ui/routes/settings/components/Setting.tsx b/app/src/ui/routes/settings/components/Setting.tsx index 461237e1..7dcccc35 100644 --- a/app/src/ui/routes/settings/components/Setting.tsx +++ b/app/src/ui/routes/settings/components/Setting.tsx @@ -1,5 +1,5 @@ import { useHotkeys } from "@mantine/hooks"; -import { ucFirst } from "core/utils"; +import { ucFirst, type s } from "bknd/utils"; import { omit } from "lodash-es"; import { type ReactNode, useMemo, useRef, useState } from "react"; import { TbSettings } from "react-icons/tb"; @@ -18,7 +18,6 @@ import { Link, Route, useLocation } from "wouter"; import { extractSchema } from "../utils/schema"; import { SettingNewModal, type SettingsNewModalProps } from "./SettingNewModal"; import { SettingSchemaModal, type SettingsSchemaModalRef } from "./SettingSchemaModal"; -import type { s } from "bknd/core"; export type SettingProps< Schema extends s.ObjectSchema = s.ObjectSchema, diff --git a/app/src/ui/routes/settings/components/SettingNewModal.tsx b/app/src/ui/routes/settings/components/SettingNewModal.tsx index 59e8c1bf..07cf9227 100644 --- a/app/src/ui/routes/settings/components/SettingNewModal.tsx +++ b/app/src/ui/routes/settings/components/SettingNewModal.tsx @@ -8,7 +8,7 @@ import { JsonSchemaForm, type JsonSchemaFormRef } from "ui/components/form/json- import { Dropdown } from "ui/components/overlay/Dropdown"; import { Modal } from "ui/components/overlay/Modal"; import { useLocation } from "wouter"; -import type { s } from "bknd/core"; +import type { s } from "bknd/utils"; export type SettingsNewModalProps = { schema: s.ObjectSchema; diff --git a/app/src/ui/routes/settings/utils/schema.ts b/app/src/ui/routes/settings/utils/schema.ts index 016125c0..1c5e88dc 100644 --- a/app/src/ui/routes/settings/utils/schema.ts +++ b/app/src/ui/routes/settings/utils/schema.ts @@ -1,6 +1,5 @@ import type { JSONSchema7 } from "json-schema"; -import type { s } from "bknd/core"; -import { omitKeys } from "core/utils"; +import { omitKeys, type s } from "bknd/utils"; export function extractSchema< Schema extends s.ObjectSchema, diff --git a/app/src/ui/routes/test/tests/flow-create-schema-test.tsx b/app/src/ui/routes/test/tests/flow-create-schema-test.tsx index c8adfd1b..0aacc7cc 100644 --- a/app/src/ui/routes/test/tests/flow-create-schema-test.tsx +++ b/app/src/ui/routes/test/tests/flow-create-schema-test.tsx @@ -3,7 +3,7 @@ import { useState } from "react"; import { JsonViewer } from "../../../components/code/JsonViewer"; import { JsonSchemaForm } from "../../../components/form/json-schema"; import { Scrollable } from "../../../layouts/AppShell/AppShell"; -import { parse } from "bknd/core"; +import { parse } from "bknd/utils"; export default function FlowCreateSchemaTest() { //const schema = flowsConfigSchema; diff --git a/app/src/ui/routes/test/tests/react-hook-errors.tsx b/app/src/ui/routes/test/tests/react-hook-errors.tsx index 169b2d07..774f4ded 100644 --- a/app/src/ui/routes/test/tests/react-hook-errors.tsx +++ b/app/src/ui/routes/test/tests/react-hook-errors.tsx @@ -1,7 +1,7 @@ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; import { TextInput } from "@mantine/core"; import { useForm } from "react-hook-form"; -import { s } from "bknd/core"; +import { s } from "bknd/utils"; const schema = s.object({ example: s.string().optional(), diff --git a/bun.lock b/bun.lock index 4712d827..d88b74cb 100644 --- a/bun.lock +++ b/bun.lock @@ -71,7 +71,7 @@ "dotenv": "^16.4.7", "jotai": "^2.12.2", "jsdom": "^26.0.0", - "jsonv-ts": "^0.3.1", + "jsonv-ts": "^0.3.2", "kysely-d1": "^0.3.0", "kysely-generic-sqlite": "^1.2.1", "libsql-stateless-easy": "^1.8.0", @@ -2496,7 +2496,7 @@ "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], - "jsonv-ts": ["jsonv-ts@0.3.1", "", { "optionalDependencies": { "hono": "*" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-MayDgM0+WprZsf0BaJjMPlp4Pk7WWlhzid0dMFSFsZ4p9Ax1I4m0wL+H5FdRiaVuSz5TfMlCQm/TzwiLx4DWBQ=="], + "jsonv-ts": ["jsonv-ts@0.3.2", "", { "optionalDependencies": { "hono": "*" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-wGKLo0naUzgOCa2BgtlKZlF47po7hPjGXqDZK2lOoJ/4sE1lb4fMvf0YJrRghqfwg9QNtWz01xALr+F0QECYag=="], "jsonwebtoken": ["jsonwebtoken@9.0.2", "", { "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ=="],