From 88ec3432a06b9f0913edf5cde05240c0dbb64bf1 Mon Sep 17 00:00:00 2001 From: dswbx Date: Mon, 7 Jul 2025 16:09:29 +0200 Subject: [PATCH] fix schema import path --- app/__test__/api/DataApi.spec.ts | 2 +- app/__test__/auth/Authenticator.spec.ts | 2 +- app/__test__/core/Registry.spec.ts | 2 +- app/__test__/core/object/SchemaObject.spec.ts | 2 +- app/__test__/data/DataController.spec.ts | 2 +- app/__test__/data/polymorphic.test.ts | 2 +- app/__test__/data/specs/fields/Field.spec.ts | 2 +- .../data/specs/fields/FieldIndex.spec.ts | 2 +- 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__/modules/AppData.spec.ts | 2 +- app/__test__/modules/Module.spec.ts | 2 +- app/__test__/modules/ModuleManager.spec.ts | 2 +- app/src/adapter/cloudflare/bindings.ts | 5 +- app/src/adapter/cloudflare/index.ts | 2 +- .../cloudflare/storage/StorageR2Adapter.ts | 2 +- .../node/storage/StorageLocalAdapter.ts | 2 +- app/src/auth/api/AuthController.ts | 2 +- app/src/auth/auth-schema.ts | 2 +- app/src/auth/authenticate/Authenticator.ts | 2 +- .../strategies/PasswordStrategy.ts | 2 +- .../auth/authenticate/strategies/Strategy.ts | 2 +- .../strategies/oauth/CustomOAuthStrategy.ts | 2 +- .../strategies/oauth/OAuthStrategy.ts | 2 +- app/src/core/index.ts | 8 +++- app/src/core/object/SchemaObject.ts | 2 +- app/src/data/api/DataController.ts | 2 +- app/src/data/data-schema.ts | 10 ++-- app/src/data/entities/Entity.ts | 2 +- app/src/data/errors.ts | 2 +- app/src/data/fields/BooleanField.ts | 2 +- app/src/data/fields/DateField.ts | 2 +- app/src/data/fields/EnumField.ts | 2 +- app/src/data/fields/Field.ts | 2 +- app/src/data/fields/JsonField.ts | 2 +- app/src/data/fields/JsonSchemaField.ts | 2 +- app/src/data/fields/NumberField.ts | 2 +- app/src/data/fields/PrimaryField.ts | 2 +- app/src/data/fields/TextField.ts | 2 +- app/src/data/fields/VirtualField.ts | 2 +- app/src/data/relations/EntityRelation.ts | 4 +- app/src/data/relations/ManyToManyRelation.ts | 2 +- app/src/data/relations/ManyToOneRelation.ts | 2 +- app/src/data/relations/PolymorphicRelation.ts | 2 +- app/src/data/relations/RelationField.ts | 2 +- app/src/data/server/query.spec.ts | 2 +- app/src/data/server/query.ts | 2 +- app/src/flows/AppFlows.ts | 2 +- 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/media/MediaField.ts | 2 +- app/src/media/api/MediaController.ts | 2 +- app/src/media/index.ts | 2 +- app/src/media/media-schema.ts | 2 +- app/src/media/storage/StorageAdapter.ts | 2 +- .../cloudinary/StorageCloudinaryAdapter.ts | 2 +- .../storage/adapters/s3/StorageS3Adapter.ts | 2 +- app/src/modules/Controller.ts | 2 +- app/src/modules/Module.ts | 2 +- app/src/modules/ModuleManager.ts | 3 +- app/src/modules/server/AppServer.ts | 2 +- app/src/modules/server/SystemController.ts | 2 +- .../ui/client/schema/data/use-bknd-data.ts | 2 +- app/src/ui/client/schema/flows/use-flows.ts | 2 +- app/src/ui/elements/auth/AuthForm.tsx | 2 +- app/src/ui/hooks/use-search.ts | 2 +- .../schema/create-modal/CreateModal.tsx | 47 +------------------ .../components/schema/create-modal/schema.ts | 44 +++++++++++++++++ .../schema/create-modal/step.create.tsx | 7 ++- .../create-modal/step.entity.fields.tsx | 8 ++-- .../schema/create-modal/step.entity.tsx | 30 ++++++------ .../schema/create-modal/step.relation.tsx | 5 +- .../schema/create-modal/step.select.tsx | 10 +--- .../media/template.media.component.tsx | 11 ++--- .../flows/components/TriggerComponent.tsx | 2 +- .../components2/nodes/tasks/FetchTaskNode.tsx | 2 +- .../nodes/triggers/TriggerNode.tsx | 2 +- app/src/ui/routes/auth/auth.roles.tsx | 2 +- app/src/ui/routes/auth/forms/role.form.tsx | 2 +- .../ui/routes/data/data.$entity.create.tsx | 2 +- app/src/ui/routes/data/data.$entity.index.tsx | 2 +- .../routes/data/forms/entity.fields.form.tsx | 2 +- .../flows/components/FlowCreateModal.tsx | 2 +- .../ui/routes/settings/components/Setting.tsx | 2 +- .../settings/components/SettingNewModal.tsx | 2 +- app/src/ui/routes/settings/utils/schema.ts | 2 +- .../test/tests/flow-create-schema-test.tsx | 2 +- .../routes/test/tests/react-hook-errors.tsx | 2 +- 97 files changed, 180 insertions(+), 180 deletions(-) create mode 100644 app/src/ui/modules/data/components/schema/create-modal/schema.ts diff --git a/app/__test__/api/DataApi.spec.ts b/app/__test__/api/DataApi.spec.ts index cb48d7c3..f574974f 100644 --- a/app/__test__/api/DataApi.spec.ts +++ b/app/__test__/api/DataApi.spec.ts @@ -6,7 +6,7 @@ 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 "core/object/schema"; +import { parse } from "bknd/core"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); diff --git a/app/__test__/auth/Authenticator.spec.ts b/app/__test__/auth/Authenticator.spec.ts index b415cd0a..bb45f1d9 100644 --- a/app/__test__/auth/Authenticator.spec.ts +++ b/app/__test__/auth/Authenticator.spec.ts @@ -2,7 +2,7 @@ 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 "core/object/schema"; +import { parse } from "bknd/core"; /*class MemoryUserPool implements UserPool { constructor(private users: User[] = []) {} diff --git a/app/__test__/core/Registry.spec.ts b/app/__test__/core/Registry.spec.ts index ee608b0d..30f8cf87 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 "core/object/schema"; +import { s } from "bknd/core"; 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 bedcb817..687f450c 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 "core/object/schema"; +import { s } from "bknd/core"; describe("SchemaObject", async () => { test("basic", async () => { diff --git a/app/__test__/data/DataController.spec.ts b/app/__test__/data/DataController.spec.ts index da014ac6..be24ae12 100644 --- a/app/__test__/data/DataController.spec.ts +++ b/app/__test__/data/DataController.spec.ts @@ -1,7 +1,7 @@ import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { Guard } from "../../src/auth"; -import { parse } from "core/object/schema"; +import { parse } from "bknd/core"; import { Entity, type EntityData, diff --git a/app/__test__/data/polymorphic.test.ts b/app/__test__/data/polymorphic.test.ts index 9b51f8c7..ddc093b5 100644 --- a/app/__test__/data/polymorphic.test.ts +++ b/app/__test__/data/polymorphic.test.ts @@ -1,5 +1,5 @@ import { afterAll, expect as bunExpect, describe, test } from "bun:test"; -import { stripMark } from "core/object/schema"; +import { stripMark } from "bknd/core"; import { Entity, EntityManager, PolymorphicRelation, TextField } from "../../src/data"; import { getDummyConnection } from "./helper"; diff --git a/app/__test__/data/specs/fields/Field.spec.ts b/app/__test__/data/specs/fields/Field.spec.ts index 41707a84..0a279ac2 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 "core/object/schema"; +import { stripMark } from "bknd/core"; 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 ecc5e0c1..b6e15d32 100644 --- a/app/__test__/data/specs/fields/FieldIndex.spec.ts +++ b/app/__test__/data/specs/fields/FieldIndex.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test"; import { Entity, EntityIndex, Field } from "../../../../src/data"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; class TestField extends Field { protected getSchema(): any { diff --git a/app/__test__/flows/SubWorkflowTask.spec.ts b/app/__test__/flows/SubWorkflowTask.spec.ts index 7d70ebf6..f1849f1f 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 "core/object/schema"; +import { s } from "bknd/core"; 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 b8e451cf..88d0b2cb 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 "core/object/schema"; +import { s } from "bknd/core"; 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 5e8bb5d2..66effa37 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 "core/object/schema"; +import { s, parse } from "bknd/core"; 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 48c0b9e6..cc916bdc 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 "core/object/schema"; +import { s } from "bknd/core"; import { Condition, ExecutionEvent, FetchTask, Flow, LogTask, Task } from "../../src/flows"; /*beforeAll(disableConsoleLog); diff --git a/app/__test__/modules/AppData.spec.ts b/app/__test__/modules/AppData.spec.ts index 8eca77b5..4cefb6a7 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 "core/object/schema"; +import { parse } from "bknd/core"; 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/Module.spec.ts b/app/__test__/modules/Module.spec.ts index 224da909..91ddc5be 100644 --- a/app/__test__/modules/Module.spec.ts +++ b/app/__test__/modules/Module.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { s, stripMark } from "core/object/schema"; +import { s, stripMark } from "bknd/core"; import { EntityManager, em, entity, index, text } from "../../src/data"; import { DummyConnection } from "../../src/data/connection/DummyConnection"; import { Module } from "../../src/modules/Module"; diff --git a/app/__test__/modules/ModuleManager.spec.ts b/app/__test__/modules/ModuleManager.spec.ts index 876c5827..58ef02d3 100644 --- a/app/__test__/modules/ModuleManager.spec.ts +++ b/app/__test__/modules/ModuleManager.spec.ts @@ -5,7 +5,7 @@ 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 "core/object/schema"; +import { s, stripMark } from "bknd/core"; describe("ModuleManager", async () => { test("s1: no config, no build", async () => { diff --git a/app/src/adapter/cloudflare/bindings.ts b/app/src/adapter/cloudflare/bindings.ts index 82eca2ae..0b685248 100644 --- a/app/src/adapter/cloudflare/bindings.ts +++ b/app/src/adapter/cloudflare/bindings.ts @@ -12,7 +12,10 @@ export function getBindings(env: any, type: T): Bindin const bindings: BindingMap[] = []; for (const key in env) { try { - if (env[key] && (env[key] as any).constructor.name === type) { + if ( + env[key] && + ((env[key] as any).constructor.name === type || String(env[key]) === `[object ${type}]`) + ) { bindings.push({ key, value: env[key] as BindingTypeMap[T], diff --git a/app/src/adapter/cloudflare/index.ts b/app/src/adapter/cloudflare/index.ts index b8b3c4e8..bc4e294f 100644 --- a/app/src/adapter/cloudflare/index.ts +++ b/app/src/adapter/cloudflare/index.ts @@ -13,7 +13,7 @@ export { type BindingMap, } from "./bindings"; export { constants } from "./config"; -export { StorageR2Adapter } from "./storage/StorageR2Adapter"; +export { StorageR2Adapter, registerMedia } from "./storage/StorageR2Adapter"; export { registries } from "bknd"; // for compatibility with old code diff --git a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts index 9fc41d41..4f895368 100644 --- a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts +++ b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts @@ -2,7 +2,7 @@ import { registries } from "bknd"; import { isDebug } from "bknd/core"; import { guessMimeType as guess, StorageAdapter, type FileBody } from "bknd/media"; import { getBindings } from "../bindings"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export function makeSchema(bindings: string[] = []) { return s.object( diff --git a/app/src/adapter/node/storage/StorageLocalAdapter.ts b/app/src/adapter/node/storage/StorageLocalAdapter.ts index 9f624e85..dcac0b15 100644 --- a/app/src/adapter/node/storage/StorageLocalAdapter.ts +++ b/app/src/adapter/node/storage/StorageLocalAdapter.ts @@ -2,7 +2,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 "core/object/schema"; +import { parse, s } from "bknd/core"; export const localAdapterConfig = s.object( { diff --git a/app/src/auth/api/AuthController.ts b/app/src/auth/api/AuthController.ts index f7dca82f..332df980 100644 --- a/app/src/auth/api/AuthController.ts +++ b/app/src/auth/api/AuthController.ts @@ -3,7 +3,7 @@ import { transformObject } from "core/utils"; import { DataPermissions } from "data"; import type { Hono } from "hono"; import { Controller, type ServerEnv } from "modules/Controller"; -import { describeRoute, jsc, s, parse, InvalidSchemaError } from "core/object/schema"; +import { describeRoute, jsc, s, parse, InvalidSchemaError } from "bknd/core"; export type AuthActionResponse = { success: boolean; diff --git a/app/src/auth/auth-schema.ts b/app/src/auth/auth-schema.ts index 940d0e83..c9f08c1c 100644 --- a/app/src/auth/auth-schema.ts +++ b/app/src/auth/auth-schema.ts @@ -1,7 +1,7 @@ import { cookieConfig, jwtConfig } from "auth/authenticate/Authenticator"; import { CustomOAuthStrategy, OAuthStrategy, PasswordStrategy } from "auth/authenticate/strategies"; import { objectTransform } from "core/utils"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export const Strategies = { password: { diff --git a/app/src/auth/authenticate/Authenticator.ts b/app/src/auth/authenticate/Authenticator.ts index f7a3e401..b11478b1 100644 --- a/app/src/auth/authenticate/Authenticator.ts +++ b/app/src/auth/authenticate/Authenticator.ts @@ -8,7 +8,7 @@ import type { CookieOptions } 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 "core/object/schema"; +import { s, parse, secret } from "bknd/core"; type Input = any; // workaround export type JWTPayload = Parameters[0]; diff --git a/app/src/auth/authenticate/strategies/PasswordStrategy.ts b/app/src/auth/authenticate/strategies/PasswordStrategy.ts index d510431f..49880c77 100644 --- a/app/src/auth/authenticate/strategies/PasswordStrategy.ts +++ b/app/src/auth/authenticate/strategies/PasswordStrategy.ts @@ -3,7 +3,7 @@ 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 "core/object/schema"; +import { s, parse, jsc } from "bknd/core"; const schema = s .object({ diff --git a/app/src/auth/authenticate/strategies/Strategy.ts b/app/src/auth/authenticate/strategies/Strategy.ts index 41e0770d..2ddc4e69 100644 --- a/app/src/auth/authenticate/strategies/Strategy.ts +++ b/app/src/auth/authenticate/strategies/Strategy.ts @@ -5,7 +5,7 @@ import type { StrategyActions, } from "../Authenticator"; import type { Hono } from "hono"; -import { type s, parse } from "core/object/schema"; +import { type s, parse } from "bknd/core"; export type StrategyMode = "form" | "external"; diff --git a/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts b/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts index fcb2f7cf..9c69812b 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 "core/object/schema"; +import { s } from "bknd/core"; 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 af09e877..2845f7d3 100644 --- a/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts +++ b/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts @@ -6,7 +6,7 @@ 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 "core/object/schema"; +import { s } from "bknd/core"; type ConfiguredIssuers = keyof typeof issuers; type SupportedTypes = "oauth2" | "oidc"; diff --git a/app/src/core/index.ts b/app/src/core/index.ts index fae1eb2b..0e0d917b 100644 --- a/app/src/core/index.ts +++ b/app/src/core/index.ts @@ -25,8 +25,12 @@ export { } from "./object/query/query"; export { Registry, type Constructor } from "./registry/Registry"; export { getFlashMessage } from "./server/flash"; -/* export { +export { s, + stripMark, + mark, + stringIdentifier, + secret, parse, jsc, describeRoute, @@ -34,7 +38,7 @@ export { getFlashMessage } from "./server/flash"; openAPISpecs, type ParseOptions, InvalidSchemaError, -} from "./object/schema"; */ +} from "./object/schema"; export * from "./drivers"; export * from "./events"; diff --git a/app/src/core/object/SchemaObject.ts b/app/src/core/object/SchemaObject.ts index 3117758c..3d408d8d 100644 --- a/app/src/core/object/SchemaObject.ts +++ b/app/src/core/object/SchemaObject.ts @@ -1,6 +1,6 @@ import { get, has, omit, set } from "lodash-es"; import { getFullPathKeys, mergeObjectWith } from "../utils"; -import { type s, parse, stripMark } from "core/object/schema"; +import { type s, parse, stripMark } from "bknd/core"; export type SchemaObjectOptions = { onUpdate?: (config: s.Static) => void | Promise; diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index a8c5e319..5b63d8bc 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -8,7 +8,7 @@ import { import type { Handler } from "hono/types"; import type { ModuleBuildContext } from "modules"; import { Controller } from "modules/Controller"; -import { jsc, s, describeRoute, schemaToSpec } from "core/object/schema"; +import { jsc, s, describeRoute, schemaToSpec } from "bknd/core"; import * as SystemPermissions from "modules/permissions"; import type { AppDataConfig } from "../data-schema"; import { omitKeys } from "core/utils"; diff --git a/app/src/data/data-schema.ts b/app/src/data/data-schema.ts index dab2cc63..57ff4b03 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 "core/object/schema"; +import { s } from "bknd/core"; export const FIELDS = { ...FieldClassMap, @@ -18,6 +18,7 @@ export const RELATIONS = RelationClassMap; export const fieldsSchemaObject = objectTransform(FIELDS, (field, name) => { return s.strictObject( { + name: s.string().optional(), // @todo: verify, old schema wasn't strict (req in UI) type: s.literal(name), config: field.schema.optional(), }, @@ -32,9 +33,10 @@ export type TAppDataField = s.Static; export type TAppDataEntityFields = s.Static; export const entitiesSchema = s.strictObject({ - type: s.string({ enum: entityTypes, default: "regular", readOnly: true }), - config: entityConfigSchema.optional(), - fields: entityFields.optional(), + name: s.string().optional(), // @todo: verify, old schema wasn't strict (req in UI) + type: s.string({ enum: entityTypes, default: "regular" }), + config: entityConfigSchema, + fields: entityFields, }); export type TAppDataEntity = s.Static; diff --git a/app/src/data/entities/Entity.ts b/app/src/data/entities/Entity.ts index 0222b93b..9ce153f9 100644 --- a/app/src/data/entities/Entity.ts +++ b/app/src/data/entities/Entity.ts @@ -7,7 +7,7 @@ import { type TActionContext, type TRenderContext, } from "../fields"; -import { s, parse } from "core/object/schema"; +import { s, parse } from "bknd/core"; // @todo: entity must be migrated to typebox export const entityConfigSchema = s diff --git a/app/src/data/errors.ts b/app/src/data/errors.ts index 35830892..0435a05b 100644 --- a/app/src/data/errors.ts +++ b/app/src/data/errors.ts @@ -1,6 +1,6 @@ import { Exception } from "core"; import { HttpStatus } from "core/utils"; -import type { InvalidSchemaError } from "core/object/schema"; +import type { InvalidSchemaError } from "bknd/core"; import type { Entity } from "./entities"; import type { Field } from "./fields"; diff --git a/app/src/data/fields/BooleanField.ts b/app/src/data/fields/BooleanField.ts index ec14380f..a4826852 100644 --- a/app/src/data/fields/BooleanField.ts +++ b/app/src/data/fields/BooleanField.ts @@ -2,7 +2,7 @@ import { omitKeys } from "core/utils"; import type { EntityManager } from "data"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export const booleanFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/DateField.ts b/app/src/data/fields/DateField.ts index a8de5c7a..127f00b4 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 "core/object/schema"; +import { s } from "bknd/core"; export const dateFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/EnumField.ts b/app/src/data/fields/EnumField.ts index d9d36534..07348e8e 100644 --- a/app/src/data/fields/EnumField.ts +++ b/app/src/data/fields/EnumField.ts @@ -3,7 +3,7 @@ import type { EntityManager } from "data"; import { TransformPersistFailedException } from "../errors"; import { baseFieldConfigSchema, Field, type TActionContext, type TRenderContext } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export const enumFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/Field.ts b/app/src/data/fields/Field.ts index 77756a95..bb971186 100644 --- a/app/src/data/fields/Field.ts +++ b/app/src/data/fields/Field.ts @@ -4,7 +4,7 @@ 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 "core/object/schema"; +import { s, parse, InvalidSchemaError } from "bknd/core"; // @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 c75124a7..5e13e81c 100644 --- a/app/src/data/fields/JsonField.ts +++ b/app/src/data/fields/JsonField.ts @@ -3,7 +3,7 @@ import type { EntityManager } from "data"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export const jsonFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/JsonSchemaField.ts b/app/src/data/fields/JsonSchemaField.ts index 002eb4ce..fd541fc9 100644 --- a/app/src/data/fields/JsonSchemaField.ts +++ b/app/src/data/fields/JsonSchemaField.ts @@ -4,7 +4,7 @@ import type { EntityManager } from "data"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export const jsonSchemaFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/NumberField.ts b/app/src/data/fields/NumberField.ts index 48c9c80e..5803cba0 100644 --- a/app/src/data/fields/NumberField.ts +++ b/app/src/data/fields/NumberField.ts @@ -2,7 +2,7 @@ import type { EntityManager } from "data"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; 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 5bdbeef0..d7006a3d 100644 --- a/app/src/data/fields/PrimaryField.ts +++ b/app/src/data/fields/PrimaryField.ts @@ -2,7 +2,7 @@ import { config } from "core"; import { omitKeys, uuidv7 } from "core/utils"; import { Field, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "core/object/schema"; +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 df947c63..378d3548 100644 --- a/app/src/data/fields/TextField.ts +++ b/app/src/data/fields/TextField.ts @@ -2,7 +2,7 @@ import type { EntityManager } from "data"; import { omitKeys } from "core/utils"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, baseFieldConfigSchema } from "./Field"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export const textFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/VirtualField.ts b/app/src/data/fields/VirtualField.ts index 9d160275..02e1c0d3 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 "core/object/schema"; +import { s } from "bknd/core"; export const virtualFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/relations/EntityRelation.ts b/app/src/data/relations/EntityRelation.ts index f7f01d14..342aba79 100644 --- a/app/src/data/relations/EntityRelation.ts +++ b/app/src/data/relations/EntityRelation.ts @@ -1,4 +1,4 @@ -import { parse } from "core/object/schema"; +import { parse } from "bknd/core"; import type { ExpressionBuilder, SelectQueryBuilder } from "kysely"; import type { Entity, EntityData, EntityManager } from "../entities"; import { @@ -9,7 +9,7 @@ import { import type { RepoQuery } from "../server/query"; import type { RelationType } from "./relation-types"; import type { PrimaryFieldType } from "core"; -import { s } from "core/object/schema"; +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 81bc6a35..591235e1 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 "core/object/schema"; +import { s } from "bknd/core"; export type ManyToManyRelationConfig = s.Static; diff --git a/app/src/data/relations/ManyToOneRelation.ts b/app/src/data/relations/ManyToOneRelation.ts index 77a5a7f4..deaa31b2 100644 --- a/app/src/data/relations/ManyToOneRelation.ts +++ b/app/src/data/relations/ManyToOneRelation.ts @@ -8,7 +8,7 @@ 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 "core/object/schema"; +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 3a3d6364..a9be82ab 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 "core/object/schema"; +import { s } from "bknd/core"; export type PolymorphicRelationConfig = s.Static; diff --git a/app/src/data/relations/RelationField.ts b/app/src/data/relations/RelationField.ts index 1f7ad8b3..1cd72cfd 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 "core/object/schema"; +import { s } from "bknd/core"; const CASCADES = ["cascade", "set null", "set default", "restrict", "no action"] as const; diff --git a/app/src/data/server/query.spec.ts b/app/src/data/server/query.spec.ts index 388b72c8..536d15da 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 "core/object/schema"; +import { s as schema, parse as $parse, type ParseOptions } from "bknd/core"; 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 2b629c79..cb740e7e 100644 --- a/app/src/data/server/query.ts +++ b/app/src/data/server/query.ts @@ -1,4 +1,4 @@ -import { s } from "core/object/schema"; +import { s } from "bknd/core"; 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 657ad537..230b924c 100644 --- a/app/src/flows/AppFlows.ts +++ b/app/src/flows/AppFlows.ts @@ -3,7 +3,7 @@ import { Flow, HttpTrigger } from "flows"; import { Hono } from "hono"; import { Module } from "modules/Module"; import { TASKS, flowsConfigSchema } from "./flows-schema"; -import type { s } from "core/object/schema"; +import type { s } from "bknd/core"; 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 46e14450..9caef769 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 "core/object/schema"; +import { s } from "bknd/core"; export const TASKS = { ...TaskMap, diff --git a/app/src/flows/flows/triggers/EventTrigger.ts b/app/src/flows/flows/triggers/EventTrigger.ts index c14215b0..40cbeef7 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 "core/object/schema"; +import { s } from "bknd/core"; 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 19403456..b36da675 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 "core/object/schema"; +import { s } from "bknd/core"; 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 3414bbc8..8140de16 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 "core/object/schema"; +import { s, parse } from "bknd/core"; export class Trigger { // @todo: remove this diff --git a/app/src/flows/tasks/Task.tsx b/app/src/flows/tasks/Task.tsx index fa9f44bc..0c00ecd8 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 "core/object/schema"; +import { s, parse } from "bknd/core"; 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 0108b0ce..3e945138 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 "core/object/schema"; +import { s } from "bknd/core"; 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 b3b96b67..73a9a7c4 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 "core/object/schema"; +import { s } from "bknd/core"; 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 e57b01f3..ccadf92d 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 "core/object/schema"; +import { s } from "bknd/core"; 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 e3a19f3f..38b749c6 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 "core/object/schema"; +import { s } from "bknd/core"; export class SubFlowTask> extends Task< typeof SubFlowTask.schema, diff --git a/app/src/media/MediaField.ts b/app/src/media/MediaField.ts index 5c2dcc82..47729e64 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 "core/object/schema"; +import { s } from "bknd/core"; export const mediaFieldConfigSchema = s .strictObject({ diff --git a/app/src/media/api/MediaController.ts b/app/src/media/api/MediaController.ts index 2caf74a4..784448ac 100644 --- a/app/src/media/api/MediaController.ts +++ b/app/src/media/api/MediaController.ts @@ -6,7 +6,7 @@ import { DataPermissions } from "data"; import { Controller } from "modules/Controller"; import type { AppMedia } from "../AppMedia"; import { MediaField } from "../MediaField"; -import { jsc, s, describeRoute } from "core/object/schema"; +import { jsc, s, describeRoute } from "bknd/core"; export class MediaController extends Controller { constructor(private readonly media: AppMedia) { diff --git a/app/src/media/index.ts b/app/src/media/index.ts index ce3d9b00..5f4a0369 100644 --- a/app/src/media/index.ts +++ b/app/src/media/index.ts @@ -15,7 +15,7 @@ import { StorageCloudinaryAdapter, } from "./storage/adapters/cloudinary/StorageCloudinaryAdapter"; import { type S3AdapterConfig, StorageS3Adapter } from "./storage/adapters/s3/StorageS3Adapter"; -import type { s } from "core/object/schema"; +import type { s } from "bknd/core"; export { StorageAdapter }; export { StorageS3Adapter, type S3AdapterConfig, StorageCloudinaryAdapter, type CloudinaryConfig }; diff --git a/app/src/media/media-schema.ts b/app/src/media/media-schema.ts index 6c9bdae0..0717a803 100644 --- a/app/src/media/media-schema.ts +++ b/app/src/media/media-schema.ts @@ -1,7 +1,7 @@ import { objectTransform } from "core/utils"; import { Adapters } from "media"; import { registries } from "modules/registries"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; export const ADAPTERS = { ...Adapters, diff --git a/app/src/media/storage/StorageAdapter.ts b/app/src/media/storage/StorageAdapter.ts index d6ceaab0..0d013a3e 100644 --- a/app/src/media/storage/StorageAdapter.ts +++ b/app/src/media/storage/StorageAdapter.ts @@ -1,6 +1,6 @@ import type { FileListObject, FileMeta } from "media"; import type { FileBody, FileUploadPayload } from "media/storage/Storage"; -import type { s } from "core/object/schema"; +import type { s } from "bknd/core"; const SYMBOL = Symbol.for("bknd:storage"); diff --git a/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts b/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts index 401f7723..54b44ad6 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 "core/object/schema"; +import { s, parse } from "bknd/core"; export const cloudinaryAdapterConfig = s.object( { diff --git a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts index a88e31f8..60d233d5 100644 --- a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts +++ b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts @@ -11,7 +11,7 @@ import { isFile, pickHeaders2 } from "core/utils"; import { transform } from "lodash-es"; import type { FileBody, FileListObject } from "../../Storage"; import { StorageAdapter } from "../../StorageAdapter"; -import { parse, s } from "core/object/schema"; +import { parse, s } from "bknd/core"; export const s3AdapterConfig = s.object( { diff --git a/app/src/modules/Controller.ts b/app/src/modules/Controller.ts index b3f29a07..8b424e94 100644 --- a/app/src/modules/Controller.ts +++ b/app/src/modules/Controller.ts @@ -3,7 +3,7 @@ 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 "core/object/schema"; +import { s } from "bknd/core"; export interface ServerEnv extends Env { Variables: { diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index 97a22124..21010952 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -5,7 +5,7 @@ import type { Connection, EntityManager } from "data"; import type { Hono } from "hono"; import type { ServerEnv } from "modules/Controller"; import type { ModuleHelper } from "./ModuleHelper"; -import type { s } from "core/object/schema"; +import type { s } from "bknd/core"; type PartialRec = { [P in keyof T]?: PartialRec }; diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index fbd342ed..059caced 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -20,7 +20,8 @@ import { AppMedia } from "../media/AppMedia"; import type { ServerEnv } from "./Controller"; import { Module, type ModuleBuildContext } from "./Module"; import { ModuleHelper } from "./ModuleHelper"; -import { s, mark, stripMark } from "core/object/schema"; +import { s } from "bknd/core"; +import { mark, stripMark } from "bknd/core"; export type { ModuleBuildContext }; diff --git a/app/src/modules/server/AppServer.ts b/app/src/modules/server/AppServer.ts index 09bdb709..2e0401c1 100644 --- a/app/src/modules/server/AppServer.ts +++ b/app/src/modules/server/AppServer.ts @@ -3,7 +3,7 @@ import { $console } from "core/utils"; import { cors } from "hono/cors"; import { Module } from "modules/Module"; import { AuthException } from "auth/errors"; -import { s } from "core/object/schema"; +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 d6801074..41d4fdca 100644 --- a/app/src/modules/server/SystemController.ts +++ b/app/src/modules/server/SystemController.ts @@ -14,7 +14,7 @@ import { type ModuleKey, } from "modules/ModuleManager"; import * as SystemPermissions from "modules/permissions"; -import { jsc, s, describeRoute, InvalidSchemaError } from "core/object/schema"; +import { jsc, s, describeRoute, InvalidSchemaError } from "bknd/core"; import { getVersion } from "core/env"; import { SecretSchema } from "core/object/schema/secret"; 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 723944ef..7ed2a7db 100644 --- a/app/src/ui/client/schema/data/use-bknd-data.ts +++ b/app/src/ui/client/schema/data/use-bknd-data.ts @@ -13,7 +13,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 "core/object/schema"; +import { s, parse, InvalidSchemaError } from "bknd/core"; 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 478112ca..a4d049de 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 "core/object/schema"; +import { parse } from "bknd/core"; import { type TAppFlowSchema, flowSchema } from "flows/flows-schema"; import { useBknd } from "../../BkndProvider"; diff --git a/app/src/ui/elements/auth/AuthForm.tsx b/app/src/ui/elements/auth/AuthForm.tsx index 52728df3..4f22b170 100644 --- a/app/src/ui/elements/auth/AuthForm.tsx +++ b/app/src/ui/elements/auth/AuthForm.tsx @@ -7,7 +7,7 @@ import { Button } from "ui/components/buttons/Button"; import { Group, Input, Password, Label } from "ui/components/form/Formy/components"; import { SocialLink } from "./SocialLink"; import type { Validator } from "json-schema-form-react"; -import { s } from "core/object/schema"; +import { s } from "bknd/core"; import type { ErrorDetail } from "jsonv-ts"; class JsonvTsValidator implements Validator { diff --git a/app/src/ui/hooks/use-search.ts b/app/src/ui/hooks/use-search.ts index 64d162a8..e58928a8 100644 --- a/app/src/ui/hooks/use-search.ts +++ b/app/src/ui/hooks/use-search.ts @@ -1,7 +1,7 @@ import { decodeSearch, encodeSearch, mergeObject } from "core/utils"; import { isEqual, transform } from "lodash-es"; import { useLocation, useSearch as useWouterSearch } from "wouter"; -import { type s, parse } from "core/object/schema"; +import { type s, parse } from "bknd/core"; import { useEffect, useMemo, useState } from "react"; export type UseSearchOptions = { diff --git a/app/src/ui/modules/data/components/schema/create-modal/CreateModal.tsx b/app/src/ui/modules/data/components/schema/create-modal/CreateModal.tsx index d7ca1839..c28cc40b 100644 --- a/app/src/ui/modules/data/components/schema/create-modal/CreateModal.tsx +++ b/app/src/ui/modules/data/components/schema/create-modal/CreateModal.tsx @@ -1,6 +1,5 @@ import type { ModalProps } from "@mantine/core"; import type { ContextModalProps } from "@mantine/modals"; -import { entitiesSchema, fieldsSchema, relationsSchema } from "data/data-schema"; import { useState } from "react"; import { type Modal2Ref, ModalBody, ModalFooter, ModalTitle } from "ui/components/modal/Modal2"; import { Step, Steps, useStepContext } from "ui/components/steps/Steps"; @@ -10,52 +9,10 @@ import { StepEntityFields } from "./step.entity.fields"; import { StepRelation } from "./step.relation"; import { StepSelect } from "./step.select"; import Templates from "./templates/register"; -import { s } from "core/object/schema"; +import type { TCreateModalSchema } from "./schema"; export type CreateModalRef = Modal2Ref; -export const ModalActions = ["entity", "relation", "media"] as const; - -export const entitySchema = s.object({ - name: s.string(), - ...entitiesSchema.properties, -}); - -// @todo: this union is not fully working, just "string" -const schemaAction = s.anyOf([ - s.string({ enum: ["entity", "relation", "media"] }), - s.string({ pattern: "^template-" }), -]); -export type TSchemaAction = s.Static; - -const createFieldSchema = s.object({ - entity: s.string(), - name: s.string(), - field: s.array(fieldsSchema), -}); -export type TFieldCreate = s.Static; - -const createModalSchema = s.strictObject({ - action: schemaAction, - initial: s.any().optional(), - entities: s - .object({ - create: s.array(entitySchema).optional(), - }) - .optional(), - relations: s - .object({ - create: s.array(s.anyOf(relationsSchema)).optional(), - }) - .optional(), - fields: s - .object({ - create: s.array(createFieldSchema).optional(), - }) - .optional(), -}); -export type TCreateModalSchema = s.Static; - export function CreateModal({ context, id, @@ -107,4 +64,4 @@ CreateModal.modalProps = { padding: 0, } satisfies Partial; -export { ModalBody, ModalFooter, ModalTitle, useStepContext, relationsSchema }; +export { ModalBody, ModalFooter, ModalTitle, useStepContext }; 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 new file mode 100644 index 00000000..31978b24 --- /dev/null +++ b/app/src/ui/modules/data/components/schema/create-modal/schema.ts @@ -0,0 +1,44 @@ +import { s } from "bknd/core"; +import { entitiesSchema, fieldsSchema, relationsSchema } from "data/data-schema"; + +export const ModalActions = ["entity", "relation", "media"] as const; + +export const entitySchema = s.object({ + name: s.string(), + ...entitiesSchema.properties, +}); + +// @todo: this union is not fully working, just "string" +const schemaAction = s.anyOf([ + s.string({ enum: ["entity", "relation", "media"] }), + s.string({ pattern: "^template-" }), +]); +export type TSchemaAction = s.Static; + +const createFieldSchema = s.object({ + entity: s.string(), + name: s.string(), + field: s.array(fieldsSchema), +}); +export type TFieldCreate = s.Static; + +const createModalSchema = s.strictObject({ + action: schemaAction, + initial: s.any().optional(), + entities: s + .object({ + create: s.array(entitySchema).optional(), + }) + .optional(), + relations: s + .object({ + create: s.array(s.anyOf(relationsSchema)).optional(), + }) + .optional(), + fields: s + .object({ + create: s.array(createFieldSchema).optional(), + }) + .optional(), +}); +export type TCreateModalSchema = s.Static; diff --git a/app/src/ui/modules/data/components/schema/create-modal/step.create.tsx b/app/src/ui/modules/data/components/schema/create-modal/step.create.tsx index fe7b3899..0ef9c485 100644 --- a/app/src/ui/modules/data/components/schema/create-modal/step.create.tsx +++ b/app/src/ui/modules/data/components/schema/create-modal/step.create.tsx @@ -1,7 +1,6 @@ import { useDisclosure } from "@mantine/hooks"; import { IconAlignJustified, - IconAugmentedReality, IconBox, IconCirclesRelation, IconInfoCircle, @@ -15,7 +14,7 @@ import { IconButton, type IconType } from "ui/components/buttons/IconButton"; import { JsonViewer } from "ui/components/code/JsonViewer"; import { ModalBody, ModalFooter } from "ui/components/modal/Modal2"; import { useStepContext } from "ui/components/steps/Steps"; -import type { TCreateModalSchema } from "ui/modules/data/components/schema/create-modal/CreateModal"; +import type { TCreateModalSchema } from "ui/modules/data/components/schema/create-modal/schema"; type ActionItem = SummaryItemProps & { run: () => Promise; @@ -35,9 +34,9 @@ export function StepCreate() { action: "add", Icon: IconBox, type: "Entity", - name: entity.name, + name: entity.name!, json: entity, - run: async () => await $data.actions.entity.add(entity.name, entity), + run: async () => await $data.actions.entity.add(entity.name!, entity), })), ); } 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 c52ceb5b..7a45e057 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,3 @@ -//import { typeboxResolver } from "@hookform/resolvers/typebox"; import { objectCleanEmpty } from "core/utils"; import { type TAppDataEntityFields, entitiesSchema } from "data/data-schema"; import { mergeWith } from "lodash-es"; @@ -10,12 +9,13 @@ import { EntityFieldsForm, type EntityFieldsFormRef, } from "ui/routes/data/forms/entity.fields.form"; -import { ModalBody, ModalFooter, type TCreateModalSchema, useStepContext } from "./CreateModal"; +import { ModalBody, ModalFooter, useStepContext } from "./CreateModal"; import { useBkndData } from "ui/client/schema/data/use-bknd-data"; -import type { s } from "core/object/schema"; +import type { s } from "bknd/core"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; +import { entitySchema, type TCreateModalSchema } from "./schema"; -const schema = entitiesSchema; +const schema = entitySchema; type Schema = s.Static; export function StepEntityFields() { 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 6c105f9a..6ac1e9ef 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 @@ -2,30 +2,29 @@ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; import { TextInput, Textarea } from "@mantine/core"; import { useFocusTrap } from "@mantine/hooks"; import { useForm } from "react-hook-form"; -import { - ModalBody, - ModalFooter, - type TCreateModalSchema, - entitySchema, - useStepContext, -} from "./CreateModal"; +import { ModalBody, ModalFooter, useStepContext } from "./CreateModal"; +import { entitySchema, type TCreateModalSchema } from "./schema"; +import { s } from "bknd/core"; +import { cloneSchema } from "core/object/schema"; + +const schema = s.object({ + name: entitySchema.properties.name, + config: entitySchema.properties.config.partial().optional(), +}); +type Schema = s.Static; export function StepEntity() { const focusTrapRef = useFocusTrap(); const { nextStep, stepBack, state, setState } = useStepContext(); const { register, handleSubmit, formState, watch, control } = useForm({ - mode: "onTouched", - resolver: standardSchemaResolver(entitySchema), - defaultValues: state.entities?.create?.[0] ?? {}, + mode: "onChange", + resolver: standardSchemaResolver(cloneSchema(schema)), + defaultValues: (state.entities?.create?.[0] ?? {}) as Schema, }); - /*const data = watch(); - console.log("state", { isValid }); - console.log("schema", JSON.stringify(entitySchema)); - console.log("data", JSON.stringify(data));*/ function onSubmit(data: any) { - console.log(data); + console.log("onSubmit", data); setState((prev) => { const prevEntity = prev.entities?.create?.[0]; if (prevEntity && prevEntity.name !== data.name) { @@ -45,6 +44,7 @@ export function StepEntity() { <>
+ (); 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 4137ab43..f4f581b5 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 @@ -7,14 +7,9 @@ import { useBknd } from "ui/client/bknd"; import { MantineNumberInput } from "ui/components/form/hook-form-mantine/MantineNumberInput"; import { MantineRadio } from "ui/components/form/hook-form-mantine/MantineRadio"; import { MantineSelect } from "ui/components/form/hook-form-mantine/MantineSelect"; -import { - ModalBody, - ModalFooter, - type TCreateModalSchema, - type TFieldCreate, - useStepContext, -} from "../../CreateModal"; -import { s, stringIdentifier } from "core/object/schema"; +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/flows/components/TriggerComponent.tsx b/app/src/ui/modules/flows/components/TriggerComponent.tsx index 058b1499..218a4c83 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 "core/object/schema"; +import { s } from "bknd/core"; export type TaskComponentProps = NodeProps> & { Icon?: IconType; 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 52339c23..2f1a3b7f 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 "core/object/schema"; +import { s } from "bknd/core"; 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 ad0979d4..4d95d4a4 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 "core/object/schema"; +import { s } from "bknd/core"; 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 004e76ca..89ac00b4 100644 --- a/app/src/ui/routes/auth/auth.roles.tsx +++ b/app/src/ui/routes/auth/auth.roles.tsx @@ -6,7 +6,7 @@ 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 { stringIdentifier } from "core/object/schema"; +import { stringIdentifier } from "bknd/core"; export function AuthRolesList() { const [navigate] = useNavigate(); diff --git a/app/src/ui/routes/auth/forms/role.form.tsx b/app/src/ui/routes/auth/forms/role.form.tsx index f811584c..1bd44670 100644 --- a/app/src/ui/routes/auth/forms/role.form.tsx +++ b/app/src/ui/routes/auth/forms/role.form.tsx @@ -6,7 +6,7 @@ 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 "core/object/schema"; +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.$entity.create.tsx b/app/src/ui/routes/data/data.$entity.create.tsx index 07b2bb58..df21081b 100644 --- a/app/src/ui/routes/data/data.$entity.create.tsx +++ b/app/src/ui/routes/data/data.$entity.create.tsx @@ -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 "core/object/schema"; +import { s } from "bknd/core"; 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 7b23feed..93b77429 100644 --- a/app/src/ui/routes/data/data.$entity.index.tsx +++ b/app/src/ui/routes/data/data.$entity.index.tsx @@ -14,7 +14,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 "core/object/schema"; +import { s } from "bknd/core"; import { pick } from "core/utils/objects"; const searchSchema = s.partialObject({ 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 917fe6fc..60be4c8e 100644 --- a/app/src/ui/routes/data/forms/entity.fields.form.tsx +++ b/app/src/ui/routes/data/forms/entity.fields.form.tsx @@ -21,7 +21,7 @@ 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 "core/object/schema"; +import { s, stringIdentifier } from "bknd/core"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; const fieldsSchemaObject = originalFieldsSchemaObject; diff --git a/app/src/ui/routes/flows/components/FlowCreateModal.tsx b/app/src/ui/routes/flows/components/FlowCreateModal.tsx index 6ee8795d..35b7afd3 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 "core/object/schema"; +import { s, stringIdentifier } from "bknd/core"; import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"; export type TCreateFlowModalSchema = any; diff --git a/app/src/ui/routes/settings/components/Setting.tsx b/app/src/ui/routes/settings/components/Setting.tsx index d3078f82..461237e1 100644 --- a/app/src/ui/routes/settings/components/Setting.tsx +++ b/app/src/ui/routes/settings/components/Setting.tsx @@ -18,7 +18,7 @@ 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 "core/object/schema"; +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 2d4e6f83..59e8c1bf 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 "core/object/schema"; +import type { s } from "bknd/core"; 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 a6de26b6..016125c0 100644 --- a/app/src/ui/routes/settings/utils/schema.ts +++ b/app/src/ui/routes/settings/utils/schema.ts @@ -1,5 +1,5 @@ import type { JSONSchema7 } from "json-schema"; -import type { s } from "core/object/schema"; +import type { s } from "bknd/core"; import { omitKeys } from "core/utils"; export function extractSchema< 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 a05b8f78..c8adfd1b 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 "core/object/schema"; +import { parse } from "bknd/core"; 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 08212998..169b2d07 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 "core/object/schema"; +import { s } from "bknd/core"; const schema = s.object({ example: s.string().optional(),