diff --git a/README.md b/README.md index ab86304..76b19af 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![npm version](https://img.shields.io/npm/v/bknd.svg)](https://npmjs.org/package/bknd) -![bknd](https://raw.githubusercontent.com/bknd-io/bknd/refs/heads/main/docs/_assets/poster.png) +![bknd](https://raw.githubusercontent.com/bknd-io/bknd/refs/heads/main/docs/public/assets/poster.png)

diff --git a/app/package.json b/app/package.json index 50ec4ed..8d4bba4 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "type": "module", "sideEffects": false, "bin": "./dist/cli/index.js", - "version": "0.16.0", + "version": "0.16.1", "description": "Lightweight Firebase/Supabase alternative built to run anywhere — incl. Next.js, React Router, Astro, Cloudflare, Bun, Node, AWS Lambda & more.", "homepage": "https://bknd.io", "repository": { @@ -64,7 +64,8 @@ "hono": "4.8.3", "json-schema-library": "10.0.0-rc7", "json-schema-to-ts": "^3.1.1", - "kysely": "^0.27.6", + "jsonv-ts": "0.3.2", + "kysely": "0.27.6", "lodash-es": "^4.17.21", "oauth4webapi": "^2.11.1", "object-path-immutable": "^4.1.2", @@ -100,7 +101,7 @@ "dotenv": "^16.4.7", "jotai": "^2.12.2", "jsdom": "^26.0.0", - "jsonv-ts": "link:jsonv-ts", + "jsonv-ts": "^0.3.2", "kysely-d1": "^0.3.0", "kysely-generic-sqlite": "^1.2.1", "libsql-stateless-easy": "^1.8.0", diff --git a/app/src/media/api/MediaApi.ts b/app/src/media/api/MediaApi.ts index 70cf746..db94b03 100644 --- a/app/src/media/api/MediaApi.ts +++ b/app/src/media/api/MediaApi.ts @@ -68,7 +68,7 @@ export class MediaApi extends ModuleApi { } protected uploadFile( - body: File | Blob | ReadableStream, + body: File | Blob | ReadableStream | Buffer, opts?: { filename?: string; path?: TInput; @@ -110,7 +110,7 @@ export class MediaApi extends ModuleApi { } async upload( - item: Request | Response | string | File | Blob | ReadableStream, + item: Request | Response | string | File | Blob | ReadableStream | Buffer, opts: { filename?: string; _init?: Omit; @@ -148,7 +148,7 @@ export class MediaApi extends ModuleApi { entity: string, id: PrimaryFieldType, field: string, - item: Request | Response | string | File | ReadableStream, + item: Request | Response | string | File | ReadableStream | Buffer, opts?: { _init?: Omit; fetcher?: typeof fetch; diff --git a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts index 7f3da6e..bb89265 100644 --- a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts +++ b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts @@ -183,13 +183,13 @@ export class StorageS3Adapter extends StorageAdapter { method: "GET", headers: pickHeaders2(headers, [ "if-none-match", - "accept-encoding", + //"accept-encoding", (causes 403 on r2) "accept", "if-modified-since", ]), }); - // Response has to be copied, because of middlewares that might set headers + // response has to be copied, because of middlewares that might set headers return new Response(res.body, { status: res.status, statusText: res.statusText, 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 4bce7a7..4edb4a3 100644 --- a/app/src/ui/modules/flows/components2/nodes/triggers/TriggerNode.tsx +++ b/app/src/ui/modules/flows/components2/nodes/triggers/TriggerNode.tsx @@ -94,8 +94,8 @@ export const TriggerNode = (props: NodeProps - {data.type === "manual" && } - {data.type === "http" && ( + {data?.type === "manual" && } + {data?.type === "http" && ( )} diff --git a/bun.lock b/bun.lock index 8fb8b89..f9b1786 100644 --- a/bun.lock +++ b/bun.lock @@ -15,7 +15,7 @@ }, "app": { "name": "bknd", - "version": "0.16.0", + "version": "0.16.1", "bin": "./dist/cli/index.js", "dependencies": { "@cfworker/json-schema": "^4.1.1", @@ -35,7 +35,8 @@ "hono": "4.8.3", "json-schema-library": "10.0.0-rc7", "json-schema-to-ts": "^3.1.1", - "kysely": "^0.27.6", + "jsonv-ts": "0.3.2", + "kysely": "0.27.6", "lodash-es": "^4.17.21", "oauth4webapi": "^2.11.1", "object-path-immutable": "^4.1.2", @@ -71,7 +72,6 @@ "dotenv": "^16.4.7", "jotai": "^2.12.2", "jsdom": "^26.0.0", - "jsonv-ts": "^0.5.1", "kysely-d1": "^0.3.0", "kysely-generic-sqlite": "^1.2.1", "libsql-stateless-easy": "^1.8.0", @@ -2511,7 +2511,7 @@ "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], - "jsonv-ts": ["jsonv-ts@0.5.1", "", { "optionalDependencies": { "hono": "*" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-9PoYn7rfk67q5aeDQLPcGUHJ1YWS/f4BPPsWY0HOna6hVKDbgRP+kem9lSvmf8IfQCpq363xVmR/g49MEMGOdQ=="], + "jsonv-ts": ["jsonv-ts@0.3.2", "", { "optionalDependencies": { "hono": "*" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-wGKLo0naUzgOCa2BgtlKZlF47po7hPjGXqDZK2lOoJ/4sE1lb4fMvf0YJrRghqfwg9QNtWz01xALr+F0QECYag=="], "jsonwebtoken": ["jsonwebtoken@9.0.2", "", { "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ=="], diff --git a/docs/public/assets/poster.png b/docs/public/assets/poster.png new file mode 100644 index 0000000..f43aa2d Binary files /dev/null and b/docs/public/assets/poster.png differ diff --git a/examples/astro/bknd.config.ts b/examples/astro/bknd.config.ts index 8ddea7e..b7b20bb 100644 --- a/examples/astro/bknd.config.ts +++ b/examples/astro/bknd.config.ts @@ -1,6 +1,6 @@ import type { AstroBkndConfig } from "bknd/adapter/astro"; import { registerLocalMediaAdapter } from "bknd/adapter/node"; -import { boolean, em, entity, text } from "bknd/data"; +import { boolean, em, entity, text } from "bknd"; import { secureRandomString } from "bknd/utils"; // since we're running in node, we can register the local media adapter @@ -16,7 +16,7 @@ const schema = em({ // register your schema to get automatic type completion type Database = (typeof schema)["DB"]; -declare module "bknd/core" { +declare module "bknd" { interface DB extends Database {} } diff --git a/examples/nextjs/bknd.config.ts b/examples/nextjs/bknd.config.ts index 39a12a7..186ef04 100644 --- a/examples/nextjs/bknd.config.ts +++ b/examples/nextjs/bknd.config.ts @@ -1,5 +1,5 @@ import type { NextjsBkndConfig } from "bknd/adapter/nextjs"; -import { boolean, em, entity, text } from "bknd/data"; +import { boolean, em, entity, text } from "bknd"; import { registerLocalMediaAdapter } from "bknd/adapter/node"; import { secureRandomString } from "bknd/utils"; @@ -22,7 +22,7 @@ const schema = em({ // register your schema to get automatic type completion type Database = (typeof schema)["DB"]; -declare module "bknd/core" { +declare module "bknd" { interface DB extends Database {} } diff --git a/examples/plasmic/src/server.ts b/examples/plasmic/src/server.ts index 5ac41cb..e8e931d 100644 --- a/examples/plasmic/src/server.ts +++ b/examples/plasmic/src/server.ts @@ -1,6 +1,5 @@ -import { App } from "bknd"; import { serve } from "bknd/adapter/vite"; -import { boolean, em, entity, text } from "bknd/data"; +import { App, boolean, em, entity, text } from "bknd"; import { secureRandomString } from "bknd/utils"; export default serve({ @@ -8,23 +7,23 @@ export default serve({ data: em({ todos: entity("todos", { title: text(), - done: boolean() - }) + done: boolean(), + }), }).toJSON(), auth: { enabled: true, jwt: { - secret: secureRandomString(64) - } - } + secret: secureRandomString(64), + }, + }, }, options: { seed: async (ctx) => { await ctx.em.mutator("todos" as any).insertMany([ { title: "Learn bknd", done: true }, - { title: "Build something cool", done: false } + { title: "Build something cool", done: false }, ]); - } + }, }, // here we can hook into the app lifecycle events ... beforeBuild: async (app) => { @@ -34,10 +33,10 @@ export default serve({ // ... to create an initial user await app.module.auth.createUser({ email: "ds@bknd.io", - password: "12345678" + password: "12345678", }); }, - "sync" + "sync", ); - } + }, }); diff --git a/examples/react-router/bknd.config.ts b/examples/react-router/bknd.config.ts index 06239b3..8be1756 100644 --- a/examples/react-router/bknd.config.ts +++ b/examples/react-router/bknd.config.ts @@ -1,6 +1,6 @@ import { registerLocalMediaAdapter } from "bknd/adapter/node"; import type { ReactRouterBkndConfig } from "bknd/adapter/react-router"; -import { boolean, em, entity, text } from "bknd/data"; +import { boolean, em, entity, text } from "bknd"; import { secureRandomString } from "bknd/utils"; // since we're running in node, we can register the local media adapter @@ -15,7 +15,7 @@ const schema = em({ // register your schema to get automatic type completion type Database = (typeof schema)["DB"]; -declare module "bknd/core" { +declare module "bknd" { interface DB extends Database {} } diff --git a/examples/react/src/App.tsx b/examples/react/src/App.tsx index f288529..d72cfb5 100644 --- a/examples/react/src/App.tsx +++ b/examples/react/src/App.tsx @@ -1,7 +1,6 @@ import { lazy, Suspense, useEffect, useState } from "react"; -import { App } from "bknd"; import { checksum } from "bknd/utils"; -import { boolean, em, entity, text } from "bknd/data"; +import { App, boolean, em, entity, text } from "bknd"; import { SQLocalConnection } from "@bknd/sqlocal"; import { Route, Router, Switch } from "wouter"; import IndexPage from "~/routes/_index"; @@ -68,7 +67,7 @@ const schema = em({ // register your schema to get automatic type completion type Database = (typeof schema)["DB"]; -declare module "bknd/core" { +declare module "bknd" { interface DB extends Database {} } diff --git a/examples/waku/bknd.config.ts b/examples/waku/bknd.config.ts index 28ecf03..3b384cc 100644 --- a/examples/waku/bknd.config.ts +++ b/examples/waku/bknd.config.ts @@ -1,6 +1,6 @@ import { registerLocalMediaAdapter } from "bknd/adapter/node"; import type { BkndConfig } from "bknd/adapter"; -import { boolean, em, entity, text } from "bknd/data"; +import { boolean, em, entity, text } from "bknd"; import { secureRandomString } from "bknd/utils"; // since we're running in node, we can register the local media adapter @@ -15,7 +15,7 @@ const schema = em({ // register your schema to get automatic type completion type Database = (typeof schema)["DB"]; -declare module "bknd/core" { +declare module "bknd" { interface DB extends Database {} }