diff --git a/app/build.ts b/app/build.ts index 5931a7a..2e0e6c2 100644 --- a/app/build.ts +++ b/app/build.ts @@ -15,7 +15,7 @@ if (clean) { let types_running = false; function buildTypes() { - if (types_running) return; + if (types_running || !types) return; types_running = true; Bun.spawn(["bun", "build:types"], { diff --git a/app/src/Api.ts b/app/src/Api.ts index 5e288fe..835ff14 100644 --- a/app/src/Api.ts +++ b/app/src/Api.ts @@ -128,15 +128,17 @@ export class Api { }; } - async getVerifiedAuthState(force?: boolean): Promise { - if (force === true || !this.verified) { - await this.verifyAuth(); - } - + async getVerifiedAuthState(): Promise { + await this.verifyAuth(); return this.getAuthState(); } async verifyAuth() { + if (!this.token) { + this.markAuthVerified(false); + return; + } + try { const res = await this.auth.me(); if (!res.ok || !res.body.user) { diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index 14a0dea..20386a5 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -226,8 +226,16 @@ export class AppAuth extends Module { private toggleStrategyValueVisibility(visible: boolean) { const field = this.getUsersEntity().field("strategy_value")!; - field.config.hidden = !visible; - field.config.fillable = visible; + if (visible) { + field.config.hidden = false; + field.config.fillable = true; + } else { + // reset to normal + const template = AppAuth.usersFields.strategy_value.config; + field.config.hidden = template.hidden; + field.config.fillable = template.fillable; + } + // @todo: think about a PasswordField that automatically hashes on save? } diff --git a/app/src/auth/api/AuthController.ts b/app/src/auth/api/AuthController.ts index 265d8bc..82b50e1 100644 --- a/app/src/auth/api/AuthController.ts +++ b/app/src/auth/api/AuthController.ts @@ -33,7 +33,6 @@ export class AuthController extends Controller { const name = strategy.getName(); const { create, change } = actions; const em = this.auth.em; - const mutator = em.mutator(this.auth.config.entity_name as "users"); if (create) { hono.post( @@ -46,10 +45,9 @@ export class AuthController extends Controller { skipMark: true }); const processed = (await create.preprocess?.(valid)) ?? valid; - console.log("processed", processed); // @todo: check processed for "role" and check permissions - + const mutator = em.mutator(this.auth.config.entity_name as "users"); mutator.__unstable_toggleSystemEntityCreation(false); const { data: created } = await mutator.insertOne({ ...processed, @@ -98,7 +96,7 @@ export class AuthController extends Controller { hono.get("/me", auth(), async (c) => { if (this.auth.authenticator.isUserLoggedIn()) { - return c.json({ user: await this.auth.authenticator.getUser() }); + return c.json({ user: this.auth.authenticator.getUser() }); } return c.json({ user: null }, 403); diff --git a/app/src/ui/styles.css b/app/src/ui/styles.css index 7c2d1d4..9899752 100644 --- a/app/src/ui/styles.css +++ b/app/src/ui/styles.css @@ -1,3 +1,4 @@ +@import "./main.css"; @import "./components/form/json-schema/styles.css"; @import "@xyflow/react/dist/style.css"; @import "@mantine/core/styles.css"; diff --git a/app/vite.dev.ts b/app/vite.dev.ts index 0d27e5a..2f40dc5 100644 --- a/app/vite.dev.ts +++ b/app/vite.dev.ts @@ -1,8 +1,6 @@ import { readFile } from "node:fs/promises"; import { serveStatic } from "@hono/node-server/serve-static"; -import { createClient } from "@libsql/client/node"; import { App, registries } from "./src"; -import { LibsqlConnection } from "./src/data"; import { StorageLocalAdapter } from "./src/media/storage/adapters/StorageLocalAdapter"; registries.media.register("local", StorageLocalAdapter); @@ -12,17 +10,15 @@ const example = import.meta.env.VITE_EXAMPLE; const credentials = example ? { url: `file:.configs/${example}.db` - //url: ":memory:" } - : { - url: import.meta.env.VITE_DB_URL!, - authToken: import.meta.env.VITE_DB_TOKEN! - }; -if (!credentials.url) { - throw new Error("Missing VITE_DB_URL env variable. Add it to .env file"); -} - -const connection = new LibsqlConnection(createClient(credentials)); + : import.meta.env.VITE_DB_URL + ? { + url: import.meta.env.VITE_DB_URL!, + authToken: import.meta.env.VITE_DB_TOKEN! + } + : { + url: ":memory:" + }; let initialConfig: any = undefined; if (example) { @@ -31,11 +27,17 @@ if (example) { } let app: App; -const recreate = true; +const recreate = import.meta.env.VITE_APP_DISABLE_FRESH !== "1"; export default { async fetch(request: Request) { if (!app || recreate) { - app = App.create({ connection, initialConfig }); + app = App.create({ + connection: { + type: "libsql", + config: credentials + }, + initialConfig + }); app.emgr.onEvent( App.Events.AppBuiltEvent, async () => { diff --git a/examples/astro/src/pages/admin/[...admin].astro b/examples/astro/src/pages/admin/[...admin].astro index 30561b2..612b801 100644 --- a/examples/astro/src/pages/admin/[...admin].astro +++ b/examples/astro/src/pages/admin/[...admin].astro @@ -5,6 +5,7 @@ import "bknd/dist/styles.css"; import { getApi } from "bknd/adapter/astro"; const api = getApi(Astro, { mode: "dynamic" }); +await api.verifyAuth(); const user = api.getUser(); export const prerender = false; diff --git a/examples/astro/src/pages/ssr.astro b/examples/astro/src/pages/ssr.astro index eb3a8aa..726076d 100644 --- a/examples/astro/src/pages/ssr.astro +++ b/examples/astro/src/pages/ssr.astro @@ -3,6 +3,8 @@ import { getApi } from "bknd/adapter/astro"; import Card from "../components/Card.astro"; import Layout from "../layouts/Layout.astro"; const api = getApi(Astro, { mode: "dynamic" }); +await api.verifyAuth(); + const { data } = await api.data.readMany("todos"); const user = api.getUser(); diff --git a/examples/remix/app/routes/_index.tsx b/examples/remix/app/routes/_index.tsx index 5b419f1..eef795d 100644 --- a/examples/remix/app/routes/_index.tsx +++ b/examples/remix/app/routes/_index.tsx @@ -7,9 +7,9 @@ export const meta: MetaFunction = () => { export const loader = async (args: LoaderFunctionArgs) => { const api = args.context.api; - const user = (await api.getVerifiedAuthState(true)).user; + await api.verifyAuth(); const { data } = await api.data.readMany("todos"); - return { data, user }; + return { data, user: api.getUser() }; }; export default function Index() {