From 44fdfcc8d9bddde000181110ea53f2e0256d1ea2 Mon Sep 17 00:00:00 2001 From: Jie <51285767+DimplesY@users.noreply.github.com> Date: Wed, 6 Aug 2025 15:19:28 +0800 Subject: [PATCH 1/7] docs: Correct the incorrect value of the config attribute in the admin component --- .../docs/(documentation)/integration/(frameworks)/nextjs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/docs/(documentation)/integration/(frameworks)/nextjs.mdx b/docs/content/docs/(documentation)/integration/(frameworks)/nextjs.mdx index 143e6e9..03d9eaa 100644 --- a/docs/content/docs/(documentation)/integration/(frameworks)/nextjs.mdx +++ b/docs/content/docs/(documentation)/integration/(frameworks)/nextjs.mdx @@ -145,7 +145,7 @@ export default async function AdminPage() { config={{ basepath: "/admin", logo_return_path: "/../", - color_scheme: "system", + theme: "system", }} /> ); From 4f945842a91674d77da5eae511069f5b9eeafe54 Mon Sep 17 00:00:00 2001 From: Jie <51285767+DimplesY@users.noreply.github.com> Date: Wed, 6 Aug 2025 15:52:05 +0800 Subject: [PATCH 2/7] docs: update astro.mdx --- .../docs/(documentation)/integration/(frameworks)/astro.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx b/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx index 12df1f6..064a422 100644 --- a/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx +++ b/docs/content/docs/(documentation)/integration/(frameworks)/astro.mdx @@ -173,7 +173,7 @@ export const prerender = false; withProvider={{ user }} config={{ basepath: "/admin", - color_scheme: "dark", + theme: "dark", logo_return_path: "/../" }} client:only From 6bed2e4fcacd8d21d793e0afcf00e0aebcc616b9 Mon Sep 17 00:00:00 2001 From: stormbyte Date: Wed, 6 Aug 2025 16:06:03 +0200 Subject: [PATCH 3/7] Update to node 24 --- docker/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 551d7b7..132289a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ # Stage 1: Build stage -FROM node:20 as builder +FROM node:24 as builder WORKDIR /app @@ -12,7 +12,7 @@ RUN npm install --omit=dev bknd@${VERSION} RUN mkdir /output && cp -r node_modules/bknd/dist /output/dist # Stage 2: Final minimal image -FROM node:20-alpine +FROM node:24-alpine WORKDIR /app @@ -29,4 +29,4 @@ ENV DEFAULT_ARGS="--db-url file:/data/data.db" COPY --from=builder /output/dist ./dist EXPOSE 1337 -CMD ["pm2-runtime", "dist/cli/index.js run ${ARGS:-${DEFAULT_ARGS}} --no-open"] \ No newline at end of file +CMD ["pm2-runtime", "dist/cli/index.js run ${ARGS:-${DEFAULT_ARGS}} --no-open"] From 7af8e0946823fa86b10c23c0dc77a7b741b0a9eb Mon Sep 17 00:00:00 2001 From: Dimples_YJ <2890841438@qq.com> Date: Fri, 8 Aug 2025 13:51:12 +0800 Subject: [PATCH 4/7] fix: add missing @clack/prompts dependency --- app/package.json | 1 + bun.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/app/package.json b/app/package.json index 8ad527a..97aee9a 100644 --- a/app/package.json +++ b/app/package.json @@ -75,6 +75,7 @@ "devDependencies": { "@aws-sdk/client-s3": "^3.758.0", "@bluwy/giget-core": "^0.1.2", + "@clack/prompts": "^0.11.0", "@cloudflare/vitest-pool-workers": "^0.8.38", "@cloudflare/workers-types": "^4.20250606.0", "@dagrejs/dagre": "^1.1.4", diff --git a/bun.lock b/bun.lock index f9b1786..7d6429f 100644 --- a/bun.lock +++ b/bun.lock @@ -46,6 +46,7 @@ "devDependencies": { "@aws-sdk/client-s3": "^3.758.0", "@bluwy/giget-core": "^0.1.2", + "@clack/prompts": "^0.11.0", "@cloudflare/vitest-pool-workers": "^0.8.38", "@cloudflare/workers-types": "^4.20250606.0", "@dagrejs/dagre": "^1.1.4", @@ -503,6 +504,10 @@ "@cfworker/json-schema": ["@cfworker/json-schema@4.1.1", "", {}, "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og=="], + "@clack/core": ["@clack/core@0.5.0", "https://registry.npmmirror.com/@clack/core/-/core-0.5.0.tgz", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow=="], + + "@clack/prompts": ["@clack/prompts@0.11.0", "https://registry.npmmirror.com/@clack/prompts/-/prompts-0.11.0.tgz", { "dependencies": { "@clack/core": "0.5.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw=="], + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.3.2", "", { "peerDependencies": { "unenv": "2.0.0-rc.17", "workerd": "^1.20250508.0" }, "optionalPeers": ["workerd"] }, "sha512-MtUgNl+QkQyhQvv5bbWP+BpBC1N0me4CHHuP2H4ktmOMKdB/6kkz/lo+zqiA4mEazb4y+1cwyNjVrQ2DWeE4mg=="], From 375d2c205f4ecae84c96b3638f67c2e2dda7cae2 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 12 Aug 2025 15:29:09 +0200 Subject: [PATCH 5/7] adapter(cloudflare): removed `durable` mode, added `withPlatformProxy` (#233) * removed `durable` mode as it requires an import from "cloudflare:" that often fails in non-cf environments * remove worker configuration types * add `withPlatformProxy` * withPlatformProxy: make configuration optional --- app/__test__/adapter/adapter.test.ts | 12 +- app/build.ts | 6 +- app/src/adapter/cloudflare/bindings.ts | 7 +- .../cloudflare-workers.adapter.spec.ts | 4 +- .../cloudflare/cloudflare-workers.adapter.ts | 12 +- app/src/adapter/cloudflare/config.ts | 8 +- app/src/adapter/cloudflare/index.ts | 2 +- app/src/adapter/cloudflare/modes/cached.ts | 2 +- app/src/adapter/cloudflare/modes/durable.ts | 134 ------------------ app/src/adapter/cloudflare/modes/fresh.ts | 2 +- app/src/adapter/cloudflare/proxy.ts | 66 +++++++++ .../cloudflare/storage/StorageR2Adapter.ts | 7 +- app/src/adapter/index.ts | 28 ++-- app/src/cli/commands/run/run.ts | 2 +- app/src/index.ts | 1 + examples/cloudflare-worker/.gitignore | 2 + examples/cloudflare-worker/bknd.config.ts | 12 ++ examples/cloudflare-worker/package.json | 9 +- examples/cloudflare-worker/src/index.ts | 8 +- examples/cloudflare-worker/tsconfig.json | 17 ++- .../worker-configuration.d.ts | 8 -- 21 files changed, 152 insertions(+), 197 deletions(-) delete mode 100644 app/src/adapter/cloudflare/modes/durable.ts create mode 100644 app/src/adapter/cloudflare/proxy.ts create mode 100644 examples/cloudflare-worker/bknd.config.ts delete mode 100644 examples/cloudflare-worker/worker-configuration.d.ts diff --git a/app/__test__/adapter/adapter.test.ts b/app/__test__/adapter/adapter.test.ts index f7d623c..ee9a87e 100644 --- a/app/__test__/adapter/adapter.test.ts +++ b/app/__test__/adapter/adapter.test.ts @@ -9,16 +9,16 @@ beforeAll(disableConsoleLog); afterAll(enableConsoleLog); describe("adapter", () => { - it("makes config", () => { - expect(omitKeys(adapter.makeConfig({}), ["connection"])).toEqual({}); - expect(omitKeys(adapter.makeConfig({}, { env: { TEST: "test" } }), ["connection"])).toEqual( - {}, - ); + it("makes config", async () => { + expect(omitKeys(await adapter.makeConfig({}), ["connection"])).toEqual({}); + expect( + omitKeys(await adapter.makeConfig({}, { env: { TEST: "test" } }), ["connection"]), + ).toEqual({}); // merges everything returned from `app` with the config expect( omitKeys( - adapter.makeConfig( + await adapter.makeConfig( { app: (a) => ({ initialConfig: { server: { cors: { origin: a.env.TEST } } } }) }, { env: { TEST: "test" } }, ), diff --git a/app/build.ts b/app/build.ts index f149231..998132c 100644 --- a/app/build.ts +++ b/app/build.ts @@ -256,7 +256,11 @@ async function buildAdapters() { ), tsup.build(baseConfig("astro")), tsup.build(baseConfig("aws")), - tsup.build(baseConfig("cloudflare")), + tsup.build( + baseConfig("cloudflare", { + external: ["wrangler", "node:process"], + }), + ), tsup.build({ ...baseConfig("vite"), diff --git a/app/src/adapter/cloudflare/bindings.ts b/app/src/adapter/cloudflare/bindings.ts index 0b68524..891081e 100644 --- a/app/src/adapter/cloudflare/bindings.ts +++ b/app/src/adapter/cloudflare/bindings.ts @@ -1,3 +1,5 @@ +import { inspect } from "node:util"; + export type BindingTypeMap = { D1Database: D1Database; KVNamespace: KVNamespace; @@ -13,8 +15,9 @@ export function getBindings(env: any, type: T): Bindin for (const key in env) { try { if ( - env[key] && - ((env[key] as any).constructor.name === type || String(env[key]) === `[object ${type}]`) + (env[key] as any).constructor.name === type || + String(env[key]) === `[object ${type}]` || + inspect(env[key]).includes(type) ) { bindings.push({ key, diff --git a/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts b/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts index 5cdde1a..401722c 100644 --- a/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts +++ b/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts @@ -18,7 +18,7 @@ describe("cf adapter", () => { }); it("makes config", async () => { - const staticConfig = makeConfig( + const staticConfig = await makeConfig( { connection: { url: DB_URL }, initialConfig: { data: { basepath: DB_URL } }, @@ -28,7 +28,7 @@ describe("cf adapter", () => { expect(staticConfig.initialConfig).toEqual({ data: { basepath: DB_URL } }); expect(staticConfig.connection).toBeDefined(); - const dynamicConfig = makeConfig( + const dynamicConfig = await makeConfig( { app: (env) => ({ initialConfig: { data: { basepath: env.DB_URL } }, diff --git a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts index 427f8e4..c16094e 100644 --- a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts +++ b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts @@ -5,8 +5,7 @@ import { Hono } from "hono"; import { serveStatic } from "hono/cloudflare-workers"; import { getFresh } from "./modes/fresh"; import { getCached } from "./modes/cached"; -import { getDurable } from "./modes/durable"; -import type { App } from "bknd"; +import type { App, MaybePromise } from "bknd"; import { $console } from "core/utils"; declare global { @@ -17,12 +16,11 @@ declare global { export type CloudflareEnv = Cloudflare.Env; export type CloudflareBkndConfig = RuntimeBkndConfig & { - mode?: "warm" | "fresh" | "cache" | "durable"; - bindings?: (args: Env) => { + mode?: "warm" | "fresh" | "cache"; + bindings?: (args: Env) => MaybePromise<{ kv?: KVNamespace; - dobj?: DurableObjectNamespace; db?: D1Database; - }; + }>; d1?: { session?: boolean; transport?: "header" | "cookie"; @@ -93,8 +91,6 @@ export function serve( case "cache": app = await getCached(config, context); break; - case "durable": - return await getDurable(config, context); default: throw new Error(`Unknown mode ${mode}`); } diff --git a/app/src/adapter/cloudflare/config.ts b/app/src/adapter/cloudflare/config.ts index da5af07..817892e 100644 --- a/app/src/adapter/cloudflare/config.ts +++ b/app/src/adapter/cloudflare/config.ts @@ -89,7 +89,7 @@ export function d1SessionHelper(config: CloudflareBkndConfig) { } let media_registered: boolean = false; -export function makeConfig( +export async function makeConfig( config: CloudflareBkndConfig, args?: CfMakeConfigArgs, ) { @@ -102,7 +102,7 @@ export function makeConfig( media_registered = true; } - const appConfig = makeAdapterConfig(config, args?.env); + const appConfig = await makeAdapterConfig(config, args?.env); // if connection instance is given, don't do anything // other than checking if D1 session is defined @@ -115,12 +115,12 @@ export function makeConfig( } // if connection is given, try to open with unified sqlite adapter } else if (appConfig.connection) { - appConfig.connection = sqlite(appConfig.connection); + appConfig.connection = sqlite(appConfig.connection) as any; // if connection is not given, but env is set // try to make D1 from bindings } else if (args?.env) { - const bindings = config.bindings?.(args?.env); + const bindings = await config.bindings?.(args?.env); const sessionHelper = d1SessionHelper(config); const sessionId = sessionHelper.get(args.request); let session: D1DatabaseSession | undefined; diff --git a/app/src/adapter/cloudflare/index.ts b/app/src/adapter/cloudflare/index.ts index bc4e294..edf9cb0 100644 --- a/app/src/adapter/cloudflare/index.ts +++ b/app/src/adapter/cloudflare/index.ts @@ -3,7 +3,6 @@ import { d1Sqlite, type D1ConnectionConfig } from "./connection/D1Connection"; export * from "./cloudflare-workers.adapter"; export { makeApp, getFresh } from "./modes/fresh"; export { getCached } from "./modes/cached"; -export { DurableBkndApp, getDurable } from "./modes/durable"; export { d1Sqlite, type D1ConnectionConfig }; export { getBinding, @@ -15,6 +14,7 @@ export { export { constants } from "./config"; export { StorageR2Adapter, registerMedia } from "./storage/StorageR2Adapter"; export { registries } from "bknd"; +export { withPlatformProxy } from "./proxy"; // for compatibility with old code export function d1( diff --git a/app/src/adapter/cloudflare/modes/cached.ts b/app/src/adapter/cloudflare/modes/cached.ts index fc1d3c4..fdbed21 100644 --- a/app/src/adapter/cloudflare/modes/cached.ts +++ b/app/src/adapter/cloudflare/modes/cached.ts @@ -8,7 +8,7 @@ export async function getCached( args: Context, ) { const { env, ctx } = args; - const { kv } = config.bindings?.(env)!; + const { kv } = await config.bindings?.(env)!; if (!kv) throw new Error("kv namespace is not defined in cloudflare.bindings"); const key = config.key ?? "app"; diff --git a/app/src/adapter/cloudflare/modes/durable.ts b/app/src/adapter/cloudflare/modes/durable.ts deleted file mode 100644 index 4812b0c..0000000 --- a/app/src/adapter/cloudflare/modes/durable.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { DurableObject } from "cloudflare:workers"; -import type { App, CreateAppConfig } from "bknd"; -import { createRuntimeApp, makeConfig } from "bknd/adapter"; -import type { CloudflareBkndConfig, Context, CloudflareEnv } from "../index"; -import { constants, registerAsyncsExecutionContext } from "../config"; -import { $console } from "core/utils"; - -export async function getDurable( - config: CloudflareBkndConfig, - ctx: Context, -) { - const { dobj } = config.bindings?.(ctx.env)!; - if (!dobj) throw new Error("durable object is not defined in cloudflare.bindings"); - const key = config.key ?? "app"; - - if ([config.onBuilt, config.beforeBuild].some((x) => x)) { - $console.warn("onBuilt and beforeBuild are not supported with DurableObject mode"); - } - - const start = performance.now(); - - const id = dobj.idFromName(key); - const stub = dobj.get(id) as unknown as DurableBkndApp; - - const create_config = makeConfig(config, ctx.env); - - const res = await stub.fire(ctx.request, { - config: create_config, - keepAliveSeconds: config.keepAliveSeconds, - }); - - const headers = new Headers(res.headers); - headers.set("X-TTDO", String(performance.now() - start)); - - return new Response(res.body, { - status: res.status, - statusText: res.statusText, - headers, - }); -} - -export class DurableBkndApp extends DurableObject { - protected id = Math.random().toString(36).slice(2); - protected app?: App; - protected interval?: any; - - async fire( - request: Request, - options: { - config: CreateAppConfig; - html?: string; - keepAliveSeconds?: number; - setAdminHtml?: boolean; - }, - ) { - let buildtime = 0; - if (!this.app) { - const start = performance.now(); - const config = options.config; - - // change protocol to websocket if libsql - if ( - config?.connection && - "type" in config.connection && - config.connection.type === "libsql" - ) { - //config.connection.config.protocol = "wss"; - } - - this.app = await createRuntimeApp({ - ...config, - onBuilt: async (app) => { - registerAsyncsExecutionContext(app, this.ctx); - app.modules.server.get(constants.do_endpoint, async (c) => { - // @ts-ignore - const context: any = c.req.raw.cf ? c.req.raw.cf : c.env.cf; - return c.json({ - id: this.id, - keepAliveSeconds: options?.keepAliveSeconds ?? 0, - colo: context.colo, - }); - }); - - await this.onBuilt(app); - }, - adminOptions: { html: options.html }, - beforeBuild: async (app) => { - await this.beforeBuild(app); - }, - }); - - buildtime = performance.now() - start; - } - - if (options?.keepAliveSeconds) { - this.keepAlive(options.keepAliveSeconds); - } - - const res = await this.app!.fetch(request); - const headers = new Headers(res.headers); - headers.set("X-BuildTime", buildtime.toString()); - headers.set("X-DO-ID", this.id); - - return new Response(res.body, { - status: res.status, - statusText: res.statusText, - headers, - }); - } - - async onBuilt(app: App) {} - - async beforeBuild(app: App) {} - - protected keepAlive(seconds: number) { - if (this.interval) { - clearInterval(this.interval); - } - - let i = 0; - this.interval = setInterval(() => { - i += 1; - if (i === seconds) { - console.log("cleared"); - clearInterval(this.interval); - - // ping every 30 seconds - } else if (i % 30 === 0) { - console.log("ping"); - this.app?.modules.ctx().connection.ping(); - } - }, 1000); - } -} diff --git a/app/src/adapter/cloudflare/modes/fresh.ts b/app/src/adapter/cloudflare/modes/fresh.ts index 7fb37e3..5a3ad22 100644 --- a/app/src/adapter/cloudflare/modes/fresh.ts +++ b/app/src/adapter/cloudflare/modes/fresh.ts @@ -7,7 +7,7 @@ export async function makeApp( args?: CfMakeConfigArgs, opts?: RuntimeOptions, ) { - return await createRuntimeApp(makeConfig(config, args), args?.env, opts); + return await createRuntimeApp(await makeConfig(config, args), args?.env, opts); } export async function getFresh( diff --git a/app/src/adapter/cloudflare/proxy.ts b/app/src/adapter/cloudflare/proxy.ts new file mode 100644 index 0000000..60e49ea --- /dev/null +++ b/app/src/adapter/cloudflare/proxy.ts @@ -0,0 +1,66 @@ +import { + d1Sqlite, + getBinding, + registerMedia, + type CloudflareBkndConfig, + type CloudflareEnv, +} from "."; +import type { PlatformProxy } from "wrangler"; +import process from "node:process"; + +export type WithPlatformProxyOptions = { + /** + * By default, proxy is used if the PROXY environment variable is set to 1. + * You can override/force this by setting this option. + */ + useProxy?: boolean; +}; + +export function withPlatformProxy( + config?: CloudflareBkndConfig, + opts?: WithPlatformProxyOptions, +) { + const use_proxy = + typeof opts?.useProxy === "boolean" ? opts.useProxy : process.env.PROXY === "1"; + let proxy: PlatformProxy | undefined; + + async function getEnv(env?: Env): Promise { + if (use_proxy) { + if (!proxy) { + const getPlatformProxy = await import("wrangler").then((mod) => mod.getPlatformProxy); + proxy = await getPlatformProxy(); + setTimeout(proxy?.dispose, 1000); + } + return proxy.env as unknown as Env; + } + return env || ({} as Env); + } + + return { + ...config, + beforeBuild: async (app, registries) => { + if (!use_proxy) return; + const env = await getEnv(); + registerMedia(env, registries); + await config?.beforeBuild?.(app, registries); + }, + bindings: async (env) => { + return (await config?.bindings?.(await getEnv(env))) || {}; + }, + app: async (_env) => { + const env = await getEnv(_env); + + if (config?.app === undefined && use_proxy) { + const binding = getBinding(env, "D1Database"); + return { + connection: d1Sqlite({ + binding: binding.value, + }), + }; + } else if (typeof config?.app === "function") { + return config?.app(env); + } + return config?.app || {}; + }, + } satisfies CloudflareBkndConfig; +} diff --git a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts index a1edf58..e257b7c 100644 --- a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts +++ b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts @@ -1,4 +1,4 @@ -import { registries, isDebug, guessMimeType } from "bknd"; +import { registries as $registries, isDebug, guessMimeType } from "bknd"; import { getBindings } from "../bindings"; import { s } from "bknd/utils"; import { StorageAdapter, type FileBody } from "bknd"; @@ -12,7 +12,10 @@ export function makeSchema(bindings: string[] = []) { ); } -export function registerMedia(env: Record) { +export function registerMedia( + env: Record, + registries: typeof $registries = $registries, +) { const r2_bindings = getBindings(env, "R2Bucket"); registries.media.register( diff --git a/app/src/adapter/index.ts b/app/src/adapter/index.ts index 65c749b..1990b9f 100644 --- a/app/src/adapter/index.ts +++ b/app/src/adapter/index.ts @@ -1,13 +1,21 @@ -import { config as $config, App, type CreateAppConfig, Connection, guessMimeType } from "bknd"; +import { + config as $config, + App, + type CreateAppConfig, + Connection, + guessMimeType, + type MaybePromise, + registries as $registries, +} from "bknd"; import { $console } from "bknd/utils"; import type { Context, MiddlewareHandler, Next } from "hono"; import type { AdminControllerOptions } from "modules/server/AdminController"; import type { Manifest } from "vite"; export type BkndConfig = CreateAppConfig & { - app?: CreateAppConfig | ((args: Args) => CreateAppConfig); + app?: CreateAppConfig | ((args: Args) => MaybePromise); onBuilt?: (app: App) => Promise; - beforeBuild?: (app: App) => Promise; + beforeBuild?: (app: App, registries?: typeof $registries) => Promise; buildConfig?: Parameters[0]; }; @@ -30,10 +38,10 @@ export type DefaultArgs = { [key: string]: any; }; -export function makeConfig( +export async function makeConfig( config: BkndConfig, args?: Args, -): CreateAppConfig { +): Promise { let additionalConfig: CreateAppConfig = {}; const { app, ...rest } = config; if (app) { @@ -41,7 +49,7 @@ export function makeConfig( if (!args) { throw new Error("args is required when config.app is a function"); } - additionalConfig = app(args); + additionalConfig = await app(args); } else { additionalConfig = app; } @@ -60,7 +68,7 @@ export async function createAdapterApp( ); } - await config.beforeBuild?.(app); + await config.beforeBuild?.(app, $registries); await app.build(config.buildConfig); } @@ -131,7 +139,7 @@ export async function createRuntimeApp( "sync", ); - await config.beforeBuild?.(app); + await config.beforeBuild?.(app, $registries); await app.build(config.buildConfig); } diff --git a/app/src/cli/commands/run/run.ts b/app/src/cli/commands/run/run.ts index 24c14b5..23e0caf 100644 --- a/app/src/cli/commands/run/run.ts +++ b/app/src/cli/commands/run/run.ts @@ -77,7 +77,7 @@ async function makeApp(config: MakeAppConfig) { } export async function makeConfigApp(_config: CliBkndConfig, platform?: Platform) { - const config = makeConfig(_config, process.env); + const config = await makeConfig(_config, process.env); return makeApp({ ...config, server: { platform }, diff --git a/app/src/index.ts b/app/src/index.ts index 3a7b4d1..28ebbe9 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -39,6 +39,7 @@ export { registries } from "modules/registries"; /** * Core */ +export type { MaybePromise } from "core/types"; export { Exception, BkndError } from "core/errors"; export { isDebug, env } from "core/env"; export { type PrimaryFieldType, config, type DB, type AppEntity } from "core/config"; diff --git a/examples/cloudflare-worker/.gitignore b/examples/cloudflare-worker/.gitignore index 3b0fe33..6fd7128 100644 --- a/examples/cloudflare-worker/.gitignore +++ b/examples/cloudflare-worker/.gitignore @@ -170,3 +170,5 @@ dist .dev.vars .wrangler/ +bknd-types.d.ts +worker-configuration.d.ts \ No newline at end of file diff --git a/examples/cloudflare-worker/bknd.config.ts b/examples/cloudflare-worker/bknd.config.ts new file mode 100644 index 0000000..af5eea2 --- /dev/null +++ b/examples/cloudflare-worker/bknd.config.ts @@ -0,0 +1,12 @@ +/** + * Optionally wrapping the configuration with the `withPlatformProxy` function + * enables programmatic access to the bindings, e.g. for generating types. + */ + +import { withPlatformProxy } from "bknd/adapter/cloudflare"; + +export default withPlatformProxy({ + d1: { + session: true, + }, +}); diff --git a/examples/cloudflare-worker/package.json b/examples/cloudflare-worker/package.json index d283159..02faf9d 100644 --- a/examples/cloudflare-worker/package.json +++ b/examples/cloudflare-worker/package.json @@ -2,16 +2,19 @@ "name": "cloudflare-worker", "version": "0.0.0", "private": true, + "type": "module", "scripts": { "deploy": "wrangler deploy", "dev": "wrangler dev", - "typegen": "wrangler types" + "bknd-typegen": "PROXY=1 npx bknd types", + "typegen": "wrangler types && npm run bknd-typegen", + "predev": "npm run typegen" }, "dependencies": { "bknd": "file:../../app" }, "devDependencies": { - "typescript": "^5.8.3", - "wrangler": "^4.19.1" + "typescript": "^5.9.2", + "wrangler": "^4.28.1" } } diff --git a/examples/cloudflare-worker/src/index.ts b/examples/cloudflare-worker/src/index.ts index cae6a1b..ebbfc8b 100644 --- a/examples/cloudflare-worker/src/index.ts +++ b/examples/cloudflare-worker/src/index.ts @@ -1,8 +1,4 @@ import { serve } from "bknd/adapter/cloudflare"; +import config from "../bknd.config"; -export default serve({ - mode: "warm", - d1: { - session: true, - }, -}); +export default serve(config); diff --git a/examples/cloudflare-worker/tsconfig.json b/examples/cloudflare-worker/tsconfig.json index 9879d52..d3f6143 100644 --- a/examples/cloudflare-worker/tsconfig.json +++ b/examples/cloudflare-worker/tsconfig.json @@ -1,11 +1,9 @@ { "compilerOptions": { - "target": "es2021", - "lib": ["es2021"], - "jsx": "react-jsx", - "module": "es2022", - "moduleResolution": "Bundler", - "types": ["./worker-configuration.d.ts"], + "lib": ["ES2022"], + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", "resolveJsonModule": true, "allowJs": true, "checkJs": false, @@ -18,5 +16,10 @@ "skipLibCheck": true }, "exclude": ["test"], - "include": ["worker-configuration.d.ts", "src/**/*.ts"] + "include": [ + "worker-configuration.d.ts", + "bknd-types.d.ts", + "bknd.config.ts", + "src/**/*.ts" + ] } diff --git a/examples/cloudflare-worker/worker-configuration.d.ts b/examples/cloudflare-worker/worker-configuration.d.ts deleted file mode 100644 index 9f7bd6c..0000000 --- a/examples/cloudflare-worker/worker-configuration.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -// placeholder, run generation again -declare namespace Cloudflare { - interface Env { - BUCKET: R2Bucket; - DB: D1Database; - } -} -interface Env extends Cloudflare.Env {} From 725a2d453aba87a466ac4340d8c94c5e8fdda9b1 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 12 Aug 2025 15:30:45 +0200 Subject: [PATCH 6/7] adapter(cf): fix exports and type name for do db (#232) --- app/src/adapter/cloudflare/connection/DoConnection.ts | 8 ++++---- app/src/adapter/cloudflare/index.ts | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/adapter/cloudflare/connection/DoConnection.ts b/app/src/adapter/cloudflare/connection/DoConnection.ts index 91ae5ec..5a13b91 100644 --- a/app/src/adapter/cloudflare/connection/DoConnection.ts +++ b/app/src/adapter/cloudflare/connection/DoConnection.ts @@ -3,16 +3,16 @@ import { genericSqlite, type GenericSqliteConnection } from "bknd"; import type { QueryResult } from "kysely"; -export type D1SqliteConnection = GenericSqliteConnection; +export type DoSqliteConnection = GenericSqliteConnection; export type DurableObjecSql = DurableObjectState["storage"]["sql"]; -export type D1ConnectionConfig = +export type DoConnectionConfig = | DurableObjectState | { sql: DB; }; -export function doSqlite(config: D1ConnectionConfig) { +export function doSqlite(config: DoConnectionConfig) { const db = "sql" in config ? config.sql : config.storage.sql; return genericSqlite( @@ -21,7 +21,7 @@ export function doSqlite(config: D1ConnectionConfig< (utils) => { // must be async to work with the miniflare mock const getStmt = async (sql: string, parameters?: any[] | readonly any[]) => - await db.exec(sql, ...(parameters || [])); + db.exec(sql, ...(parameters || [])); const mapResult = ( cursor: SqlStorageCursor>, diff --git a/app/src/adapter/cloudflare/index.ts b/app/src/adapter/cloudflare/index.ts index edf9cb0..88f7413 100644 --- a/app/src/adapter/cloudflare/index.ts +++ b/app/src/adapter/cloudflare/index.ts @@ -4,6 +4,7 @@ export * from "./cloudflare-workers.adapter"; export { makeApp, getFresh } from "./modes/fresh"; export { getCached } from "./modes/cached"; export { d1Sqlite, type D1ConnectionConfig }; +export { doSqlite, type DoConnectionConfig } from "./connection/DoConnection"; export { getBinding, getBindings, From 97d6af3792503aa2d8f6515efcf51c7c398780e1 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 12 Aug 2025 16:12:10 +0200 Subject: [PATCH 7/7] cleaned up left over bknd/utils imports (#235) --- app/src/Api.ts | 2 +- app/src/App.ts | 2 +- app/src/adapter/cloudflare/cloudflare-workers.adapter.ts | 2 +- app/src/adapter/cloudflare/config.ts | 2 +- app/src/auth/AppAuth.ts | 2 +- app/src/auth/AppUserPool.ts | 2 +- app/src/auth/authenticate/strategies/PasswordStrategy.ts | 3 +-- app/src/auth/authorize/Guard.ts | 2 +- app/src/cli/commands/create/templates/cloudflare.ts | 5 ++--- app/src/cli/commands/run/platform.ts | 2 +- app/src/cli/commands/user.ts | 3 +-- app/src/cli/utils/sys.ts | 2 +- app/src/core/drivers/email/mailchannels.ts | 2 +- app/src/core/events/EventManager.ts | 2 +- app/src/data/AppData.ts | 2 +- app/src/data/connection/connection-test-suite.ts | 2 +- app/src/data/data-schema.ts | 2 +- app/src/data/entities/EntityTypescript.ts | 2 +- app/src/data/entities/Result.ts | 2 +- app/src/data/entities/mutation/MutatorResult.ts | 2 +- app/src/data/entities/query/Repository.ts | 2 +- app/src/data/entities/query/RepositoryResult.ts | 2 +- app/src/data/entities/query/WithBuilder.ts | 2 +- app/src/data/fields/BooleanField.ts | 3 +-- app/src/data/fields/DateField.ts | 4 +--- app/src/data/fields/EnumField.ts | 2 +- app/src/data/fields/JsonField.ts | 2 +- app/src/data/fields/JsonSchemaField.ts | 2 +- app/src/data/fields/NumberField.ts | 3 +-- app/src/data/fields/TextField.ts | 3 +-- app/src/data/schema/constructor.ts | 2 +- app/src/data/server/query.ts | 3 +-- app/src/flows/flows-schema.ts | 3 +-- app/src/flows/flows/Execution.ts | 2 +- app/src/flows/flows/Flow.ts | 2 +- app/src/flows/flows/executors/RuntimeExecutor.ts | 2 +- app/src/flows/flows/triggers/EventTrigger.ts | 3 +-- app/src/flows/tasks/TaskConnection.ts | 2 +- app/src/flows/tasks/presets/LogTask.ts | 3 +-- app/src/media/AppMedia.ts | 2 +- app/src/media/storage/Storage.ts | 2 +- .../storage/adapters/cloudinary/StorageCloudinaryAdapter.ts | 3 +-- app/src/modules/migrations.ts | 2 +- app/src/ui/client/schema/actions.ts | 2 +- app/src/ui/components/form/json-schema-form/utils.ts | 4 ++-- 45 files changed, 47 insertions(+), 60 deletions(-) diff --git a/app/src/Api.ts b/app/src/Api.ts index cce9156..d9fb8e4 100644 --- a/app/src/Api.ts +++ b/app/src/Api.ts @@ -4,7 +4,7 @@ import { DataApi, type DataApiOptions } from "data/api/DataApi"; import { decode } from "hono/jwt"; import { MediaApi, type MediaApiOptions } from "media/api/MediaApi"; import { SystemApi } from "modules/SystemApi"; -import { omitKeys } from "core/utils"; +import { omitKeys } from "bknd/utils"; import type { BaseModuleApiOptions } from "modules"; export type TApiUser = SafeUser; diff --git a/app/src/App.ts b/app/src/App.ts index 832ed70..7f84a6a 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -1,5 +1,5 @@ import type { CreateUserPayload } from "auth/AppAuth"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import { Event } from "core/events"; import type { em as prototypeEm } from "data/prototype"; import { Connection } from "data/connection/Connection"; diff --git a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts index c16094e..4cd03ca 100644 --- a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts +++ b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts @@ -6,7 +6,7 @@ import { serveStatic } from "hono/cloudflare-workers"; import { getFresh } from "./modes/fresh"; import { getCached } from "./modes/cached"; import type { App, MaybePromise } from "bknd"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; declare global { namespace Cloudflare { diff --git a/app/src/adapter/cloudflare/config.ts b/app/src/adapter/cloudflare/config.ts index 817892e..0a70249 100644 --- a/app/src/adapter/cloudflare/config.ts +++ b/app/src/adapter/cloudflare/config.ts @@ -9,7 +9,7 @@ import { d1Sqlite } from "./connection/D1Connection"; import type { CloudflareBkndConfig, CloudflareEnv } from "."; import { App } from "bknd"; import type { Context, ExecutionContext } from "hono"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import { setCookie } from "hono/cookie"; export const constants = { diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index 8ee5423..df8cd03 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -2,7 +2,7 @@ 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 { $console, secureRandomString, transformObject } from "bknd/utils"; import type { Entity, EntityManager } from "data/entities"; import { em, entity, enumm, type FieldSchema } from "data/prototype"; import { Module } from "modules/Module"; diff --git a/app/src/auth/AppUserPool.ts b/app/src/auth/AppUserPool.ts index 128de6c..d5679b6 100644 --- a/app/src/auth/AppUserPool.ts +++ b/app/src/auth/AppUserPool.ts @@ -1,6 +1,6 @@ import { AppAuth } from "auth/AppAuth"; import type { CreateUser, SafeUser, User, UserPool } from "auth/authenticate/Authenticator"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import { pick } from "lodash-es"; import { InvalidConditionsException, diff --git a/app/src/auth/authenticate/strategies/PasswordStrategy.ts b/app/src/auth/authenticate/strategies/PasswordStrategy.ts index 1ee6d36..e7e97b8 100644 --- a/app/src/auth/authenticate/strategies/PasswordStrategy.ts +++ b/app/src/auth/authenticate/strategies/PasswordStrategy.ts @@ -1,11 +1,10 @@ import type { User } from "bknd"; import type { Authenticator } from "auth/authenticate/Authenticator"; import { InvalidCredentialsException } from "auth/errors"; -import { hash, $console } from "core/utils"; +import { hash, $console, s, parse, jsc } from "bknd/utils"; import { Hono } from "hono"; import { compare as bcryptCompare, genSalt as bcryptGenSalt, hash as bcryptHash } from "bcryptjs"; import { AuthStrategy } from "./Strategy"; -import { s, parse, jsc } from "bknd/utils"; const schema = s .object({ diff --git a/app/src/auth/authorize/Guard.ts b/app/src/auth/authorize/Guard.ts index 09d36fb..a89b98d 100644 --- a/app/src/auth/authorize/Guard.ts +++ b/app/src/auth/authorize/Guard.ts @@ -1,5 +1,5 @@ import { Exception } from "core/errors"; -import { $console, objectTransform } from "core/utils"; +import { $console, objectTransform } from "bknd/utils"; import { Permission } from "core/security/Permission"; import type { Context } from "hono"; import type { ServerEnv } from "modules/Controller"; diff --git a/app/src/cli/commands/create/templates/cloudflare.ts b/app/src/cli/commands/create/templates/cloudflare.ts index 0bbab03..1cac856 100644 --- a/app/src/cli/commands/create/templates/cloudflare.ts +++ b/app/src/cli/commands/create/templates/cloudflare.ts @@ -1,7 +1,6 @@ import * as $p from "@clack/prompts"; -import { overrideJson, overridePackageJson } from "cli/commands/create/npm"; -import { typewriter, wait } from "cli/utils/cli"; -import { uuid } from "core/utils"; +import { overrideJson } from "cli/commands/create/npm"; +import { typewriter } from "cli/utils/cli"; import c from "picocolors"; import type { Template, TemplateSetupCtx } from "."; import { exec } from "cli/utils/sys"; diff --git a/app/src/cli/commands/run/platform.ts b/app/src/cli/commands/run/platform.ts index bc3379b..061d44c 100644 --- a/app/src/cli/commands/run/platform.ts +++ b/app/src/cli/commands/run/platform.ts @@ -1,5 +1,5 @@ import path from "node:path"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import type { MiddlewareHandler } from "hono"; import open from "open"; import { fileExists, getRelativeDistPath } from "../../utils/sys"; diff --git a/app/src/cli/commands/user.ts b/app/src/cli/commands/user.ts index 4f4db7c..e7e23b7 100644 --- a/app/src/cli/commands/user.ts +++ b/app/src/cli/commands/user.ts @@ -9,9 +9,8 @@ import type { PasswordStrategy } from "auth/authenticate/strategies"; import { makeAppFromEnv } from "cli/commands/run"; import type { CliCommand } from "cli/types"; import { Argument } from "commander"; -import { $console } from "core/utils"; +import { $console, isBun } from "bknd/utils"; import c from "picocolors"; -import { isBun } from "core/utils"; export const user: CliCommand = (program) => { program diff --git a/app/src/cli/utils/sys.ts b/app/src/cli/utils/sys.ts index 56ae32e..e7f07c6 100644 --- a/app/src/cli/utils/sys.ts +++ b/app/src/cli/utils/sys.ts @@ -1,4 +1,4 @@ -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import { execSync, exec as nodeExec } from "node:child_process"; import { readFile, writeFile as nodeWriteFile } from "node:fs/promises"; import path from "node:path"; diff --git a/app/src/core/drivers/email/mailchannels.ts b/app/src/core/drivers/email/mailchannels.ts index 7478ef5..540355a 100644 --- a/app/src/core/drivers/email/mailchannels.ts +++ b/app/src/core/drivers/email/mailchannels.ts @@ -1,4 +1,4 @@ -import { mergeObject, type RecursivePartial } from "core/utils"; +import { mergeObject, type RecursivePartial } from "bknd/utils"; import type { IEmailDriver } from "./index"; export type MailchannelsEmailOptions = { diff --git a/app/src/core/events/EventManager.ts b/app/src/core/events/EventManager.ts index 78db931..8370f2b 100644 --- a/app/src/core/events/EventManager.ts +++ b/app/src/core/events/EventManager.ts @@ -1,6 +1,6 @@ import { type Event, type EventClass, InvalidEventReturn } from "./Event"; import { EventListener, type ListenerHandler, type ListenerMode } from "./EventListener"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; export type RegisterListenerConfig = | ListenerMode diff --git a/app/src/data/AppData.ts b/app/src/data/AppData.ts index 0b4e464..13dbcc3 100644 --- a/app/src/data/AppData.ts +++ b/app/src/data/AppData.ts @@ -1,4 +1,4 @@ -import { transformObject } from "core/utils"; +import { transformObject } from "bknd/utils"; import { Module } from "modules/Module"; import { DataController } from "./api/DataController"; diff --git a/app/src/data/connection/connection-test-suite.ts b/app/src/data/connection/connection-test-suite.ts index af1eeba..aed28aa 100644 --- a/app/src/data/connection/connection-test-suite.ts +++ b/app/src/data/connection/connection-test-suite.ts @@ -1,6 +1,6 @@ import type { TestRunner } from "core/test"; import { Connection, type FieldSpec } from "./Connection"; -import { getPath } from "core/utils"; +import { getPath } from "bknd/utils"; import * as proto from "data/prototype"; import { createApp } from "App"; import type { MaybePromise } from "core/types"; diff --git a/app/src/data/data-schema.ts b/app/src/data/data-schema.ts index 7b5c0d8..b1750be 100644 --- a/app/src/data/data-schema.ts +++ b/app/src/data/data-schema.ts @@ -1,4 +1,4 @@ -import { objectTransform } from "core/utils"; +import { objectTransform } from "bknd/utils"; import { MediaField, mediaFieldConfigSchema } from "../media/MediaField"; import { FieldClassMap } from "data/fields"; import { RelationClassMap, RelationFieldClassMap } from "data/relations"; diff --git a/app/src/data/entities/EntityTypescript.ts b/app/src/data/entities/EntityTypescript.ts index 85255b9..b7e2b2c 100644 --- a/app/src/data/entities/EntityTypescript.ts +++ b/app/src/data/entities/EntityTypescript.ts @@ -1,6 +1,6 @@ import type { Entity, EntityManager, TEntityType } from "data/entities"; import type { EntityRelation } from "data/relations"; -import { autoFormatString } from "core/utils"; +import { autoFormatString } from "bknd/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 0570aa6..2816efd 100644 --- a/app/src/data/entities/Result.ts +++ b/app/src/data/entities/Result.ts @@ -1,5 +1,5 @@ import { isDebug } from "core/env"; -import { pick } from "core/utils"; +import { pick } from "bknd/utils"; import type { Connection } from "data/connection"; import type { Compilable, diff --git a/app/src/data/entities/mutation/MutatorResult.ts b/app/src/data/entities/mutation/MutatorResult.ts index 551bd61..e9e876e 100644 --- a/app/src/data/entities/mutation/MutatorResult.ts +++ b/app/src/data/entities/mutation/MutatorResult.ts @@ -1,4 +1,4 @@ -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import type { Entity, EntityData } from "../Entity"; import type { EntityManager } from "../EntityManager"; import { Result, type ResultJSON, type ResultOptions } from "../Result"; diff --git a/app/src/data/entities/query/Repository.ts b/app/src/data/entities/query/Repository.ts index 5f85d80..13554a6 100644 --- a/app/src/data/entities/query/Repository.ts +++ b/app/src/data/entities/query/Repository.ts @@ -1,5 +1,5 @@ import type { DB as DefaultDB, PrimaryFieldType } from "bknd"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import { type EmitsEvents, EventManager } from "core/events"; import { type SelectQueryBuilder, sql } from "kysely"; import { InvalidSearchParamsException } from "../../errors"; diff --git a/app/src/data/entities/query/RepositoryResult.ts b/app/src/data/entities/query/RepositoryResult.ts index 7631f8f..85dc2eb 100644 --- a/app/src/data/entities/query/RepositoryResult.ts +++ b/app/src/data/entities/query/RepositoryResult.ts @@ -2,7 +2,7 @@ import type { Entity, EntityData } from "../Entity"; import type { EntityManager } from "../EntityManager"; import { Result, type ResultJSON, type ResultOptions } from "../Result"; import type { Compilable, SelectQueryBuilder } from "kysely"; -import { $console, ensureInt } from "core/utils"; +import { $console, ensureInt } from "bknd/utils"; export type RepositoryResultOptions = ResultOptions & { silent?: boolean; diff --git a/app/src/data/entities/query/WithBuilder.ts b/app/src/data/entities/query/WithBuilder.ts index 3f6dde3..5e9fd6a 100644 --- a/app/src/data/entities/query/WithBuilder.ts +++ b/app/src/data/entities/query/WithBuilder.ts @@ -1,4 +1,4 @@ -import { isObject } from "core/utils"; +import { isObject } from "bknd/utils"; import type { KyselyJsonFrom } from "data/relations/EntityRelation"; import type { RepoQuery } from "data/server/query"; diff --git a/app/src/data/fields/BooleanField.ts b/app/src/data/fields/BooleanField.ts index 1655a89..860dbe4 100644 --- a/app/src/data/fields/BooleanField.ts +++ b/app/src/data/fields/BooleanField.ts @@ -1,8 +1,7 @@ -import { omitKeys } from "core/utils"; +import { omitKeys, s } from "bknd/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; -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 0624986..20d152e 100644 --- a/app/src/data/fields/DateField.ts +++ b/app/src/data/fields/DateField.ts @@ -1,9 +1,7 @@ -import { dayjs } from "core/utils"; +import { dayjs, $console, s } from "bknd/utils"; 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/utils"; export const dateFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/EnumField.ts b/app/src/data/fields/EnumField.ts index 306674c..5b2e10f 100644 --- a/app/src/data/fields/EnumField.ts +++ b/app/src/data/fields/EnumField.ts @@ -1,4 +1,4 @@ -import { omitKeys } from "core/utils"; +import { omitKeys } from "bknd/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { baseFieldConfigSchema, Field, type TActionContext, type TRenderContext } from "./Field"; diff --git a/app/src/data/fields/JsonField.ts b/app/src/data/fields/JsonField.ts index 711767f..c54854b 100644 --- a/app/src/data/fields/JsonField.ts +++ b/app/src/data/fields/JsonField.ts @@ -1,4 +1,4 @@ -import { omitKeys } from "core/utils"; +import { omitKeys } from "bknd/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; diff --git a/app/src/data/fields/JsonSchemaField.ts b/app/src/data/fields/JsonSchemaField.ts index 76ad00a..fed47bf 100644 --- a/app/src/data/fields/JsonSchemaField.ts +++ b/app/src/data/fields/JsonSchemaField.ts @@ -1,5 +1,5 @@ import { type Schema as JsonSchema, Validator } from "@cfworker/json-schema"; -import { objectToJsLiteral } from "core/utils"; +import { objectToJsLiteral } from "bknd/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; diff --git a/app/src/data/fields/NumberField.ts b/app/src/data/fields/NumberField.ts index 4f6e53c..b2e4516 100644 --- a/app/src/data/fields/NumberField.ts +++ b/app/src/data/fields/NumberField.ts @@ -2,8 +2,7 @@ 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/utils"; -import { omitKeys } from "core/utils"; +import { s, omitKeys } from "bknd/utils"; export const numberFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/TextField.ts b/app/src/data/fields/TextField.ts index 94674fb..9567899 100644 --- a/app/src/data/fields/TextField.ts +++ b/app/src/data/fields/TextField.ts @@ -1,8 +1,7 @@ import type { EntityManager } from "data/entities"; -import { omitKeys } from "core/utils"; +import { omitKeys, s } from "bknd/utils"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, baseFieldConfigSchema } from "./Field"; -import { s } from "bknd/utils"; export const textFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/schema/constructor.ts b/app/src/data/schema/constructor.ts index 7742812..98cc2fa 100644 --- a/app/src/data/schema/constructor.ts +++ b/app/src/data/schema/constructor.ts @@ -1,4 +1,4 @@ -import { transformObject } from "core/utils"; +import { transformObject } from "bknd/utils"; import { Entity } from "data/entities"; import type { Field } from "data/fields"; import { FIELDS, RELATIONS, type TAppDataEntity, type TAppDataRelation } from "data/data-schema"; diff --git a/app/src/data/server/query.ts b/app/src/data/server/query.ts index f8ba0c0..15ff95f 100644 --- a/app/src/data/server/query.ts +++ b/app/src/data/server/query.ts @@ -1,6 +1,5 @@ -import { s } from "bknd/utils"; +import { s, isObject, $console } 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/flows-schema.ts b/app/src/flows/flows-schema.ts index f430c6c..5d897c8 100644 --- a/app/src/flows/flows-schema.ts +++ b/app/src/flows/flows-schema.ts @@ -1,6 +1,5 @@ -import { transformObject } from "core/utils"; +import { transformObject, s } from "bknd/utils"; import { TaskMap, TriggerMap } from "flows"; -import { s } from "bknd/utils"; export const TASKS = { ...TaskMap, diff --git a/app/src/flows/flows/Execution.ts b/app/src/flows/flows/Execution.ts index 41d2166..7c8ef86 100644 --- a/app/src/flows/flows/Execution.ts +++ b/app/src/flows/flows/Execution.ts @@ -2,7 +2,7 @@ import { Event, EventManager, type ListenerHandler } from "core/events"; import type { EmitsEvents } from "core/events"; import type { Task, TaskResult } from "../tasks/Task"; import type { Flow } from "./Flow"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; export type TaskLog = TaskResult & { task: Task; diff --git a/app/src/flows/flows/Flow.ts b/app/src/flows/flows/Flow.ts index cf6a00b..2a1821a 100644 --- a/app/src/flows/flows/Flow.ts +++ b/app/src/flows/flows/Flow.ts @@ -1,4 +1,4 @@ -import { $console, transformObject } from "core/utils"; +import { $console, transformObject } from "bknd/utils"; import { type TaskMapType, TriggerMap } from "../index"; import type { Task } from "../tasks/Task"; import { Condition, TaskConnection } from "../tasks/TaskConnection"; diff --git a/app/src/flows/flows/executors/RuntimeExecutor.ts b/app/src/flows/flows/executors/RuntimeExecutor.ts index 55bf890..65888c7 100644 --- a/app/src/flows/flows/executors/RuntimeExecutor.ts +++ b/app/src/flows/flows/executors/RuntimeExecutor.ts @@ -1,5 +1,5 @@ import type { Task } from "../../tasks/Task"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; export class RuntimeExecutor { async run( diff --git a/app/src/flows/flows/triggers/EventTrigger.ts b/app/src/flows/flows/triggers/EventTrigger.ts index f17fd69..d1e5b82 100644 --- a/app/src/flows/flows/triggers/EventTrigger.ts +++ b/app/src/flows/flows/triggers/EventTrigger.ts @@ -1,8 +1,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/utils"; +import { $console, s } from "bknd/utils"; export class EventTrigger extends Trigger { override type = "event"; diff --git a/app/src/flows/tasks/TaskConnection.ts b/app/src/flows/tasks/TaskConnection.ts index 186eb28..d44b3f9 100644 --- a/app/src/flows/tasks/TaskConnection.ts +++ b/app/src/flows/tasks/TaskConnection.ts @@ -1,4 +1,4 @@ -import { objectCleanEmpty, uuid } from "core/utils"; +import { objectCleanEmpty, uuid } from "bknd/utils"; import { get } from "lodash-es"; import type { Task, TaskResult } from "./Task"; diff --git a/app/src/flows/tasks/presets/LogTask.ts b/app/src/flows/tasks/presets/LogTask.ts index 63b9677..05fc9f9 100644 --- a/app/src/flows/tasks/presets/LogTask.ts +++ b/app/src/flows/tasks/presets/LogTask.ts @@ -1,6 +1,5 @@ import { Task } from "../Task"; -import { $console } from "core/utils"; -import { s } from "bknd/utils"; +import { $console, s } from "bknd/utils"; export class LogTask extends Task { type = "log"; diff --git a/app/src/media/AppMedia.ts b/app/src/media/AppMedia.ts index a699d25..4cba790 100644 --- a/app/src/media/AppMedia.ts +++ b/app/src/media/AppMedia.ts @@ -1,5 +1,5 @@ import type { AppEntity, FileUploadedEventData, StorageAdapter } from "bknd"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import type { Entity, EntityManager } from "data/entities"; import { Storage } from "media/storage/Storage"; import { Module } from "modules/Module"; diff --git a/app/src/media/storage/Storage.ts b/app/src/media/storage/Storage.ts index e364daa..893e25f 100644 --- a/app/src/media/storage/Storage.ts +++ b/app/src/media/storage/Storage.ts @@ -1,5 +1,5 @@ import { type EmitsEvents, EventManager } from "core/events"; -import { $console, isFile, detectImageDimensions } from "core/utils"; +import { $console, isFile, detectImageDimensions } from "bknd/utils"; import { isMimeType } from "media/storage/mime-types-tiny"; import * as StorageEvents from "./events"; import type { FileUploadedEventData } from "./events"; diff --git a/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts b/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts index 96ec791..105dfef 100644 --- a/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts +++ b/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts @@ -1,7 +1,6 @@ -import { hash, pickHeaders } from "core/utils"; +import { hash, pickHeaders, s, parse } from "bknd/utils"; import type { FileBody, FileListObject, FileMeta } from "../../Storage"; import { StorageAdapter } from "../../StorageAdapter"; -import { s, parse } from "bknd/utils"; export const cloudinaryAdapterConfig = s.object( { diff --git a/app/src/modules/migrations.ts b/app/src/modules/migrations.ts index 3ce4ffb..e2834eb 100644 --- a/app/src/modules/migrations.ts +++ b/app/src/modules/migrations.ts @@ -1,4 +1,4 @@ -import { transformObject } from "core/utils"; +import { transformObject } from "bknd/utils"; import type { Kysely } from "kysely"; import { set } from "lodash-es"; diff --git a/app/src/ui/client/schema/actions.ts b/app/src/ui/client/schema/actions.ts index aa64003..3b8e619 100644 --- a/app/src/ui/client/schema/actions.ts +++ b/app/src/ui/client/schema/actions.ts @@ -1,6 +1,6 @@ import { type NotificationData, notifications } from "@mantine/notifications"; import type { Api } from "Api"; -import { ucFirst } from "core/utils"; +import { ucFirst } from "bknd/utils"; import type { ModuleConfigs } from "modules"; import type { ResponseObject } from "modules/ModuleApi"; import type { ConfigUpdateResponse } from "modules/server/SystemController"; diff --git a/app/src/ui/components/form/json-schema-form/utils.ts b/app/src/ui/components/form/json-schema-form/utils.ts index 81b4a92..6f3e206 100644 --- a/app/src/ui/components/form/json-schema-form/utils.ts +++ b/app/src/ui/components/form/json-schema-form/utils.ts @@ -1,9 +1,9 @@ -import { autoFormatString, omitKeys } from "core/utils"; +import { autoFormatString, omitKeys } from "bknd/utils"; import { type Draft, Draft2019, type JsonSchema } from "json-schema-library"; import type { JSONSchema } from "json-schema-to-ts"; import type { JSONSchemaType } from "json-schema-to-ts/lib/types/definitions/jsonSchema"; -export { isEqual, getPath } from "core/utils/objects"; +export { isEqual, getPath } from "bknd/utils"; export function isNotDefined(value: any) { return value === null || value === undefined || value === "";