From 9f2c20ccee0311cb371c057d3c5bbfc7dbcc0788 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 7 Jan 2025 08:55:25 +0100 Subject: [PATCH 01/30] refactor: remove cjs from build to reduce package size --- app/build.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/build.ts b/app/build.ts index 6511124..30a8842 100644 --- a/app/build.ts +++ b/app/build.ts @@ -22,9 +22,11 @@ function buildTypes() { types_running = true; Bun.spawn(["bun", "build:types"], { + stdout: "inherit", onExit: () => { console.log("Types built"); Bun.spawn(["bun", "tsc-alias"], { + stdout: "inherit", onExit: () => { console.log("Types aliased"); types_running = false; @@ -120,7 +122,7 @@ await tsup.build({ external: ["bun:test", "@libsql/client"], metafile: true, platform: "browser", - format: ["esm", "cjs"], + format: ["esm"], splitting: false, treeshake: true, loader: { @@ -143,7 +145,7 @@ await tsup.build({ external: ["bun:test", "react", "react-dom", "use-sync-external-store"], metafile: true, platform: "browser", - format: ["esm", "cjs"], + format: ["esm"], splitting: true, treeshake: true, loader: { @@ -199,13 +201,11 @@ await tsup.build({ await tsup.build({ ...baseConfig("nextjs"), - format: ["esm", "cjs"], platform: "node" }); await tsup.build({ - ...baseConfig("remix"), - format: ["esm", "cjs"] + ...baseConfig("remix") }); await tsup.build({ @@ -214,11 +214,9 @@ await tsup.build({ await tsup.build({ ...baseConfig("node"), - platform: "node", - format: ["esm", "cjs"] + platform: "node" }); await tsup.build({ - ...baseConfig("astro"), - format: ["esm", "cjs"] -}); + ...baseConfig("astro") +}); \ No newline at end of file From 7d3d1e811fcd3529387da87c510cd467c60b0fe9 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 7 Jan 2025 13:32:50 +0100 Subject: [PATCH 02/30] refactor: extracted auth as middleware to be added manually to endpoints --- app/src/App.ts | 23 ++++-- app/src/auth/AppAuth.ts | 23 ++---- app/src/auth/api/AuthController.ts | 39 ++-------- app/src/auth/middlewares.ts | 38 +++++++++ app/src/cli/commands/user.ts | 21 +++-- app/src/data/api/DataController.ts | 89 +++++++++------------- app/src/media/api/MediaController.ts | 16 ++-- app/src/modules/Controller.ts | 26 +++++++ app/src/modules/Module.ts | 15 +++- app/src/modules/ModuleManager.ts | 17 +++-- app/src/modules/server/AdminController.tsx | 27 +++---- app/src/modules/server/SystemController.ts | 51 +++++-------- app/src/ui/routes/auth/auth.index.tsx | 4 +- 13 files changed, 211 insertions(+), 178 deletions(-) create mode 100644 app/src/auth/middlewares.ts create mode 100644 app/src/modules/Controller.ts diff --git a/app/src/App.ts b/app/src/App.ts index 9c856da..9faa1d4 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -1,3 +1,4 @@ +import type { CreateUserPayload } from "auth/AppAuth"; import { Event } from "core/events"; import { Connection, type LibSqlCredentials, LibsqlConnection } from "data"; import { @@ -68,6 +69,12 @@ export class App { onFirstBoot: async () => { console.log("[APP] first boot"); this.trigger_first_boot = true; + }, + onServerInit: async (server) => { + server.use(async (c, next) => { + c.set("app", this); + await next(); + }) } }); this.modules.ctx().emgr.registerEvents(AppEvents); @@ -87,9 +94,11 @@ export class App { //console.log("syncing", syncResult); } + const { guard, server } = this.modules.ctx(); + // load system controller - this.modules.ctx().guard.registerPermissions(Object.values(SystemPermissions)); - this.modules.server.route("/api/system", new SystemController(this).getController()); + guard.registerPermissions(Object.values(SystemPermissions)); + server.route("/api/system", new SystemController(this).getController()); // load plugins if (this.plugins.length > 0) { @@ -99,8 +108,8 @@ export class App { //console.log("emitting built", options); await this.emgr.emit(new AppBuiltEvent({ app: this })); - // not found on any not registered api route - this.modules.server.all("/api/*", async (c) => c.notFound()); + + server.all("/api/*", async (c) => c.notFound()); if (options?.save) { await this.modules.save(); @@ -158,6 +167,10 @@ export class App { static create(config: CreateAppConfig) { return createApp(config); } + + async createUser(p: CreateUserPayload) { + return this.module.auth.createUser(p); + } } export function createApp(config: CreateAppConfig = {}) { @@ -181,4 +194,4 @@ export function createApp(config: CreateAppConfig = {}) { } return new App(connection, config.initialConfig, config.plugins, config.options); -} +} \ No newline at end of file diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index 48b6ada..c8557da 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -1,6 +1,6 @@ import { type AuthAction, Authenticator, type ProfileExchange, Role, type Strategy } from "auth"; import type { PasswordStrategy } from "auth/authenticate/strategies"; -import { Exception, type PrimaryFieldType } from "core"; +import { type DB, Exception, type PrimaryFieldType } from "core"; import { type Static, secureRandomString, transformObject } from "core/utils"; import { type Entity, EntityIndex, type EntityManager } from "data"; import { type FieldSchema, entity, enumm, make, text } from "data/prototype"; @@ -17,6 +17,7 @@ declare module "core" { } type AuthSchema = Static; +export type CreateUserPayload = { email: string; password: string; [key: string]: any }; export class AppAuth extends Module { private _authenticator?: Authenticator; @@ -36,8 +37,12 @@ export class AppAuth extends Module { return to; } + get enabled() { + return this.config.enabled; + } + override async build() { - if (!this.config.enabled) { + if (!this.enabled) { this.setBuilt(); return; } @@ -84,14 +89,6 @@ export class AppAuth extends Module { return this._controller; } - getMiddleware() { - if (!this.config.enabled) { - return; - } - - return new AuthController(this).getMiddleware; - } - getSchema() { return authConfigSchema; } @@ -287,11 +284,7 @@ export class AppAuth extends Module { } catch (e) {} } - async createUser({ - email, - password, - ...additional - }: { email: string; password: string; [key: string]: any }) { + async createUser({ email, password, ...additional }: CreateUserPayload): Promise { const strategy = "password"; const pw = this.authenticator.strategy(strategy) as PasswordStrategy; const strategy_value = await pw.hash(password); diff --git a/app/src/auth/api/AuthController.ts b/app/src/auth/api/AuthController.ts index 9afd302..0291461 100644 --- a/app/src/auth/api/AuthController.ts +++ b/app/src/auth/api/AuthController.ts @@ -1,42 +1,17 @@ import type { AppAuth } from "auth"; -import { type ClassController, isDebug } from "core"; -import { Hono, type MiddlewareHandler } from "hono"; +import { Controller } from "modules/Controller"; -export class AuthController implements ClassController { - constructor(private auth: AppAuth) {} +export class AuthController extends Controller { + constructor(private auth: AppAuth) { + super(); + } get guard() { return this.auth.ctx.guard; } - getMiddleware: MiddlewareHandler = async (c, next) => { - // @todo: ONLY HOTFIX - // middlewares are added for all routes are registered. But we need to make sure that - // only HTML/JSON routes are adding a cookie to the response. Config updates might - // also use an extension "syntax", e.g. /api/system/patch/data/entities.posts - // This middleware should be extracted and added by each Controller individually, - // but it requires access to the auth secret. - // Note: This doesn't mean endpoints aren't protected, just the cookie is not set. - const url = new URL(c.req.url); - const last = url.pathname.split("/")?.pop(); - const ext = last?.includes(".") ? last.split(".")?.pop() : undefined; - if ( - !this.auth.authenticator.isJsonRequest(c) && - ["GET", "HEAD", "OPTIONS"].includes(c.req.method) && - ext && - ["js", "css", "png", "jpg", "jpeg", "svg", "ico"].includes(ext) - ) { - isDebug() && console.log("Skipping auth", { ext }, url.pathname); - } else { - const user = await this.auth.authenticator.resolveAuthFromRequest(c); - this.auth.ctx.guard.setUserContext(user); - } - - await next(); - }; - - getController(): Hono { - const hono = new Hono(); + override getController() { + const hono = this.create(); const strategies = this.auth.authenticator.getStrategies(); for (const [name, strategy] of Object.entries(strategies)) { diff --git a/app/src/auth/middlewares.ts b/app/src/auth/middlewares.ts new file mode 100644 index 0000000..d378dc4 --- /dev/null +++ b/app/src/auth/middlewares.ts @@ -0,0 +1,38 @@ +import type { Permission } from "core"; +import type { Context } from "hono"; +import { createMiddleware } from "hono/factory"; +import type { ServerEnv } from "modules/Module"; + +async function resolveAuth(app: ServerEnv["Variables"]["app"], c: Context) { + const resolved = c.get("auth_resolved") ?? false; + if (resolved) { + return; + } + if (!app.module.auth.enabled) { + return; + } + + const authenticator = app.module.auth.authenticator; + const guard = app.modules.ctx().guard; + + guard.setUserContext(await authenticator.resolveAuthFromRequest(c)); +} + +export const auth = createMiddleware(async (c, next) => { + await resolveAuth(c.get("app"), c); + await next(); +}); + +export const permission = (...permissions: Permission[]) => + createMiddleware(async (c, next) => { + const app = c.get("app"); + await resolveAuth(app, c); + + const p = Array.isArray(permissions) ? permissions : [permissions]; + const guard = app.modules.ctx().guard; + for (const permission of p) { + guard.throwUnlessGranted(permission); + } + + await next(); + }); diff --git a/app/src/cli/commands/user.ts b/app/src/cli/commands/user.ts index 0883c67..235fd4c 100644 --- a/app/src/cli/commands/user.ts +++ b/app/src/cli/commands/user.ts @@ -35,9 +35,11 @@ async function action(action: "create" | "update", options: any) { } async function create(app: App, options: any) { - const config = app.module.auth.toJSON(true); const strategy = app.module.auth.authenticator.strategy("password") as PasswordStrategy; - const users_entity = config.entity_name as "users"; + + if (!strategy) { + throw new Error("Password strategy not configured"); + } const email = await $text({ message: "Enter email", @@ -65,16 +67,11 @@ async function create(app: App, options: any) { } try { - const mutator = app.modules.ctx().em.mutator(users_entity); - mutator.__unstable_toggleSystemEntityCreation(false); - const res = await mutator.insertOne({ + const created = await app.createUser({ email, - strategy: "password", - strategy_value: await strategy.hash(password as string) - }); - mutator.__unstable_toggleSystemEntityCreation(true); - - console.log("Created:", res.data); + password: await strategy.hash(password as string) + }) + console.log("Created:", created); } catch (e) { console.error("Error", e); } @@ -141,4 +138,4 @@ async function update(app: App, options: any) { } catch (e) { console.error("Error", e); } -} +} \ No newline at end of file diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index 68a5417..b94b7b0 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -1,32 +1,26 @@ -import { type ClassController, isDebug, tbValidator as tb } from "core"; -import { StringEnum, Type, objectCleanEmpty, objectTransform } from "core/utils"; +import { isDebug, tbValidator as tb } from "core"; +import { StringEnum, Type } from "core/utils"; import { DataPermissions, type EntityData, type EntityManager, - FieldClassMap, type MutatorResponse, - PrimaryField, type RepoQuery, type RepositoryResponse, - TextField, querySchema } from "data"; -import { Hono } from "hono"; import type { Handler } from "hono/types"; import type { ModuleBuildContext } from "modules"; +import { Controller } from "modules/Controller"; import * as SystemPermissions from "modules/permissions"; -import { type AppDataConfig, FIELDS } from "../data-schema"; +import type { AppDataConfig } from "../data-schema"; -export class DataController implements ClassController { +export class DataController extends Controller { constructor( private readonly ctx: ModuleBuildContext, private readonly config: AppDataConfig ) { - /*console.log( - "data controller", - this.em.entities.map((e) => e.name) - );*/ + super(); } get em(): EntityManager { @@ -74,8 +68,9 @@ export class DataController implements ClassController { } } - getController(): Hono { - const hono = new Hono(); + override getController() { + const hono = this.create(); + const { permission } = this.middlewares; const definedEntities = this.em.entities.map((e) => e.name); const tbNumber = Type.Transform(Type.String({ pattern: "^[1-9][0-9]{0,}$" })) .Decode(Number.parseInt) @@ -89,10 +84,7 @@ export class DataController implements ClassController { return func; } - hono.use("*", async (c, next) => { - this.ctx.guard.throwUnlessGranted(SystemPermissions.accessApi); - await next(); - }); + hono.use("*", permission(SystemPermissions.accessApi)); // info hono.get( @@ -104,9 +96,7 @@ export class DataController implements ClassController { ); // sync endpoint - hono.get("/sync", async (c) => { - this.guard.throwUnlessGranted(DataPermissions.databaseSync); - + hono.get("/sync", permission(DataPermissions.databaseSync), async (c) => { const force = c.req.query("force") === "1"; const drop = c.req.query("drop") === "1"; //console.log("force", force); @@ -126,10 +116,9 @@ export class DataController implements ClassController { // fn: count .post( "/:entity/fn/count", + permission(DataPermissions.entityRead), tb("param", Type.Object({ entity: Type.String() })), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); - const { entity } = c.req.valid("param"); if (!this.entityExists(entity)) { return c.notFound(); @@ -143,10 +132,9 @@ export class DataController implements ClassController { // fn: exists .post( "/:entity/fn/exists", + permission(DataPermissions.entityRead), tb("param", Type.Object({ entity: Type.String() })), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); - const { entity } = c.req.valid("param"); if (!this.entityExists(entity)) { return c.notFound(); @@ -163,8 +151,7 @@ export class DataController implements ClassController { */ hono // read entity schema - .get("/schema.json", async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); + .get("/schema.json", permission(DataPermissions.entityRead), async (c) => { const $id = `${this.config.basepath}/schema.json`; const schemas = Object.fromEntries( this.em.entities.map((e) => [ @@ -183,6 +170,7 @@ export class DataController implements ClassController { // read schema .get( "/schemas/:entity/:context?", + permission(DataPermissions.entityRead), tb( "param", Type.Object({ @@ -191,8 +179,6 @@ export class DataController implements ClassController { }) ), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); - //console.log("request", c.req.raw); const { entity, context } = c.req.param(); if (!this.entityExists(entity)) { @@ -216,11 +202,10 @@ export class DataController implements ClassController { // read many .get( "/:entity", + permission(DataPermissions.entityRead), tb("param", Type.Object({ entity: Type.String() })), tb("query", querySchema), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); - //console.log("request", c.req.raw); const { entity } = c.req.param(); if (!this.entityExists(entity)) { @@ -238,6 +223,7 @@ export class DataController implements ClassController { // read one .get( "/:entity/:id", + permission(DataPermissions.entityRead), tb( "param", Type.Object({ @@ -246,11 +232,7 @@ export class DataController implements ClassController { }) ), tb("query", querySchema), - /*zValidator("param", z.object({ entity: z.string(), id: z.coerce.number() })), - zValidator("query", repoQuerySchema),*/ async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); - const { entity, id } = c.req.param(); if (!this.entityExists(entity)) { return c.notFound(); @@ -264,6 +246,7 @@ export class DataController implements ClassController { // read many by reference .get( "/:entity/:id/:reference", + permission(DataPermissions.entityRead), tb( "param", Type.Object({ @@ -274,8 +257,6 @@ export class DataController implements ClassController { ), tb("query", querySchema), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); - const { entity, id, reference } = c.req.param(); if (!this.entityExists(entity)) { return c.notFound(); @@ -292,11 +273,10 @@ export class DataController implements ClassController { // func query .post( "/:entity/query", + permission(DataPermissions.entityRead), tb("param", Type.Object({ entity: Type.String() })), tb("json", querySchema), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityRead); - const { entity } = c.req.param(); if (!this.entityExists(entity)) { return c.notFound(); @@ -314,25 +294,27 @@ export class DataController implements ClassController { */ // insert one hono - .post("/:entity", tb("param", Type.Object({ entity: Type.String() })), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityCreate); + .post( + "/:entity", + permission(DataPermissions.entityCreate), + tb("param", Type.Object({ entity: Type.String() })), + async (c) => { + const { entity } = c.req.param(); + if (!this.entityExists(entity)) { + return c.notFound(); + } + const body = (await c.req.json()) as EntityData; + const result = await this.em.mutator(entity).insertOne(body); - const { entity } = c.req.param(); - if (!this.entityExists(entity)) { - return c.notFound(); + return c.json(this.mutatorResult(result), 201); } - const body = (await c.req.json()) as EntityData; - const result = await this.em.mutator(entity).insertOne(body); - - return c.json(this.mutatorResult(result), 201); - }) + ) // update one .patch( "/:entity/:id", + permission(DataPermissions.entityUpdate), tb("param", Type.Object({ entity: Type.String(), id: tbNumber })), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityUpdate); - const { entity, id } = c.req.param(); if (!this.entityExists(entity)) { return c.notFound(); @@ -346,6 +328,8 @@ export class DataController implements ClassController { // delete one .delete( "/:entity/:id", + + permission(DataPermissions.entityDelete), tb("param", Type.Object({ entity: Type.String(), id: tbNumber })), async (c) => { this.guard.throwUnlessGranted(DataPermissions.entityDelete); @@ -363,11 +347,10 @@ export class DataController implements ClassController { // delete many .delete( "/:entity", + permission(DataPermissions.entityDelete), tb("param", Type.Object({ entity: Type.String() })), tb("json", querySchema.properties.where), async (c) => { - this.guard.throwUnlessGranted(DataPermissions.entityDelete); - //console.log("request", c.req.raw); const { entity } = c.req.param(); if (!this.entityExists(entity)) { diff --git a/app/src/media/api/MediaController.ts b/app/src/media/api/MediaController.ts index 2a1a304..fcbbddc 100644 --- a/app/src/media/api/MediaController.ts +++ b/app/src/media/api/MediaController.ts @@ -1,10 +1,10 @@ -import { type ClassController, tbValidator as tb } from "core"; +import { tbValidator as tb } from "core"; import { Type } from "core/utils"; -import { Hono } from "hono"; import { bodyLimit } from "hono/body-limit"; import type { StorageAdapter } from "media"; import { StorageEvents } from "media"; import { getRandomizedFilename } from "media"; +import { Controller } from "modules/Controller"; import type { AppMedia } from "../AppMedia"; import { MediaField } from "../MediaField"; @@ -12,8 +12,10 @@ const booleanLike = Type.Transform(Type.String()) .Decode((v) => v === "1") .Encode((v) => (v ? "1" : "0")); -export class MediaController implements ClassController { - constructor(private readonly media: AppMedia) {} +export class MediaController extends Controller { + constructor(private readonly media: AppMedia) { + super(); + } private getStorageAdapter(): StorageAdapter { return this.getStorage().getAdapter(); @@ -23,11 +25,11 @@ export class MediaController implements ClassController { return this.media.storage; } - getController(): Hono { + override getController() { // @todo: multiple providers? // @todo: implement range requests - const hono = new Hono(); + const hono = this.create(); // get files list (temporary) hono.get("/files", async (c) => { @@ -190,4 +192,4 @@ export class MediaController implements ClassController { return hono; } -} +} \ No newline at end of file diff --git a/app/src/modules/Controller.ts b/app/src/modules/Controller.ts new file mode 100644 index 0000000..ebd31c0 --- /dev/null +++ b/app/src/modules/Controller.ts @@ -0,0 +1,26 @@ +import { auth, permission } from "auth/middlewares"; +import { Hono } from "hono"; +import type { ServerEnv } from "modules/Module"; + +export class Controller { + protected middlewares = { + auth, + permission + } + + protected create({ auth }: { auth?: boolean } = {}): Hono { + const server = Controller.createServer(); + if (auth !== false) { + server.use(this.middlewares.auth); + } + return server; + } + + static createServer(): Hono { + return new Hono(); + } + + getController(): Hono { + return this.create(); + } +} \ No newline at end of file diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index 32f098c..6a86d3e 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -1,3 +1,4 @@ +import type { App } from "App"; import type { Guard } from "auth"; import { SchemaObject } from "core"; import type { EventManager } from "core/events"; @@ -5,9 +6,17 @@ import type { Static, TSchema } from "core/utils"; import type { Connection, EntityManager } from "data"; import type { Hono } from "hono"; +export type ServerEnv = { + Variables: { + app: App; + auth_resolved: boolean; + html?: string; + }; +}; + export type ModuleBuildContext = { connection: Connection; - server: Hono; + server: Hono; em: EntityManager; emgr: EventManager; guard: Guard; @@ -78,6 +87,10 @@ export abstract class Module Promise; // base path for the hono instance basePath?: string; + // callback after server was created + onServerInit?: (server: Hono) => void; // doesn't perform validity checks for given/fetched config trustFetched?: boolean; // runs when initial config provided on a fresh database @@ -124,15 +127,12 @@ export class ModuleManager { __em!: EntityManager; // ctx for modules em!: EntityManager; - server!: Hono; + server!: Hono; emgr!: EventManager; guard!: Guard; private _version: number = 0; private _built = false; - private _fetched = false; - - // @todo: keep? not doing anything with it private readonly _booted_with?: "provided" | "partial"; private logger = new DebugLogger(false); @@ -204,10 +204,13 @@ export class ModuleManager { } private rebuildServer() { - this.server = new Hono(); + this.server = new Hono(); if (this.options?.basePath) { this.server = this.server.basePath(this.options.basePath); } + if (this.options?.onServerInit) { + this.options.onServerInit(this.server); + } // @todo: this is a current workaround, controllers must be reworked objectEach(this.modules, (module) => { @@ -547,4 +550,4 @@ export function getDefaultConfig(): ModuleConfigs { }); return config as any; -} +} \ No newline at end of file diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index f573132..1da3dee 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -1,11 +1,11 @@ /** @jsxImportSource hono/jsx */ import type { App } from "App"; -import { type ClassController, isDebug } from "core"; +import { isDebug } from "core"; import { addFlashMessage } from "core/server/flash"; -import { Hono } from "hono"; import { html } from "hono/html"; import { Fragment } from "hono/jsx"; +import { Controller } from "modules/Controller"; import * as SystemPermissions from "modules/permissions"; const htmlBkndContextReplace = ""; @@ -17,11 +17,13 @@ export type AdminControllerOptions = { forceDev?: boolean | { mainPath: string }; }; -export class AdminController implements ClassController { +export class AdminController extends Controller { constructor( private readonly app: App, private options: AdminControllerOptions = {} - ) {} + ) { + super(); + } get ctx() { return this.app.modules.ctx(); @@ -32,19 +34,16 @@ export class AdminController implements ClassController { } private withBasePath(route: string = "") { - return (this.basepath + route).replace(/\/+$/, "/"); + return (this.basepath + route).replace(/(? { + override getController() { + const hono = this.create().basePath(this.withBasePath()); const auth = this.app.module.auth; const configs = this.app.modules.configs(); // if auth is not enabled, authenticator is undefined const auth_enabled = configs.auth.enabled; - const hono = new Hono<{ - Variables: { - html: string; - }; - }>().basePath(this.withBasePath()); + const authRoutes = { root: "/", success: configs.auth.cookie.pathSuccess ?? "/", @@ -80,8 +79,7 @@ export class AdminController implements ClassController { return c.redirect(authRoutes.success); } - const html = c.get("html"); - return c.html(html); + return c.html(c.get("html")!); }); hono.get(authRoutes.logout, async (c) => { @@ -96,8 +94,7 @@ export class AdminController implements ClassController { return c.redirect(authRoutes.login); } - const html = c.get("html"); - return c.html(html); + return c.html(c.get("html")!); }); return hono; diff --git a/app/src/modules/server/SystemController.ts b/app/src/modules/server/SystemController.ts index a9fb8d3..e7810b3 100644 --- a/app/src/modules/server/SystemController.ts +++ b/app/src/modules/server/SystemController.ts @@ -1,10 +1,11 @@ /// import type { App } from "App"; -import type { ClassController } from "core"; import { tbValidator as tb } from "core"; import { StringEnum, Type, TypeInvalidError } from "core/utils"; -import { type Context, Hono } from "hono"; +import type { Context, Hono } from "hono"; +import { Controller } from "modules/Controller"; + import { MODULE_NAMES, type ModuleConfigs, @@ -27,21 +28,20 @@ export type ConfigUpdateResponse = | ConfigUpdate | { success: false; type: "type-invalid" | "error" | "unknown"; error?: any; errors?: any }; -export class SystemController implements ClassController { - constructor(private readonly app: App) {} +export class SystemController extends Controller { + constructor(private readonly app: App) { + super(); + } get ctx() { return this.app.modules.ctx(); } private registerConfigController(client: Hono): void { - const hono = new Hono(); + const hono = this.create(); + const { permission } = this.middlewares; - /*hono.use("*", async (c, next) => { - //this.ctx.guard.throwUnlessGranted(SystemPermissions.configRead); - console.log("perm?", this.ctx.guard.hasPermission(SystemPermissions.configRead)); - return next(); - });*/ + hono.use(permission(SystemPermissions.configRead)); hono.get( "/:module?", @@ -57,7 +57,6 @@ export class SystemController implements ClassController { const { secrets } = c.req.valid("query"); const { module } = c.req.valid("param"); - this.ctx.guard.throwUnlessGranted(SystemPermissions.configRead); secrets && this.ctx.guard.throwUnlessGranted(SystemPermissions.configReadSecrets); const config = this.app.toJSON(secrets); @@ -96,6 +95,7 @@ export class SystemController implements ClassController { hono.post( "/set/:module", + permission(SystemPermissions.configWrite), tb( "query", Type.Object({ @@ -107,8 +107,6 @@ export class SystemController implements ClassController { const { force } = c.req.valid("query"); const value = await c.req.json(); - this.ctx.guard.throwUnlessGranted(SystemPermissions.configWrite); - return await handleConfigUpdateResponse(c, async () => { // you must explicitly set force to override existing values // because omitted values gets removed @@ -131,14 +129,12 @@ export class SystemController implements ClassController { } ); - hono.post("/add/:module/:path", async (c) => { + hono.post("/add/:module/:path", permission(SystemPermissions.configWrite), async (c) => { // @todo: require auth (admin) const module = c.req.param("module") as any; const value = await c.req.json(); const path = c.req.param("path") as string; - this.ctx.guard.throwUnlessGranted(SystemPermissions.configWrite); - const moduleConfig = this.app.mutateConfig(module); if (moduleConfig.has(path)) { return c.json({ success: false, path, error: "Path already exists" }, { status: 400 }); @@ -155,14 +151,12 @@ export class SystemController implements ClassController { }); }); - hono.patch("/patch/:module/:path", async (c) => { + hono.patch("/patch/:module/:path", permission(SystemPermissions.configWrite), async (c) => { // @todo: require auth (admin) const module = c.req.param("module") as any; const value = await c.req.json(); const path = c.req.param("path"); - this.ctx.guard.throwUnlessGranted(SystemPermissions.configWrite); - return await handleConfigUpdateResponse(c, async () => { await this.app.mutateConfig(module).patch(path, value); return { @@ -173,14 +167,12 @@ export class SystemController implements ClassController { }); }); - hono.put("/overwrite/:module/:path", async (c) => { + hono.put("/overwrite/:module/:path", permission(SystemPermissions.configWrite), async (c) => { // @todo: require auth (admin) const module = c.req.param("module") as any; const value = await c.req.json(); const path = c.req.param("path"); - this.ctx.guard.throwUnlessGranted(SystemPermissions.configWrite); - return await handleConfigUpdateResponse(c, async () => { await this.app.mutateConfig(module).overwrite(path, value); return { @@ -191,13 +183,11 @@ export class SystemController implements ClassController { }); }); - hono.delete("/remove/:module/:path", async (c) => { + hono.delete("/remove/:module/:path", permission(SystemPermissions.configWrite), async (c) => { // @todo: require auth (admin) const module = c.req.param("module") as any; const path = c.req.param("path")!; - this.ctx.guard.throwUnlessGranted(SystemPermissions.configWrite); - return await handleConfigUpdateResponse(c, async () => { await this.app.mutateConfig(module).remove(path); return { @@ -211,13 +201,15 @@ export class SystemController implements ClassController { client.route("/config", hono); } - getController(): Hono { - const hono = new Hono(); + override getController() { + const hono = this.create(); + const { permission } = this.middlewares; this.registerConfigController(hono); hono.get( "/schema/:module?", + permission(SystemPermissions.schemaRead), tb( "query", Type.Object({ @@ -228,7 +220,7 @@ export class SystemController implements ClassController { async (c) => { const module = c.req.param("module") as ModuleKey | undefined; const { config, secrets } = c.req.valid("query"); - this.ctx.guard.throwUnlessGranted(SystemPermissions.schemaRead); + config && this.ctx.guard.throwUnlessGranted(SystemPermissions.configRead); secrets && this.ctx.guard.throwUnlessGranted(SystemPermissions.configReadSecrets); @@ -300,8 +292,7 @@ export class SystemController implements ClassController { return c.json({ version: this.app.version(), test: 2, - // @ts-ignore - app: !!c.var.app + app: c.get("app").version() }); }); diff --git a/app/src/ui/routes/auth/auth.index.tsx b/app/src/ui/routes/auth/auth.index.tsx index 21eace5..ea2f7f4 100644 --- a/app/src/ui/routes/auth/auth.index.tsx +++ b/app/src/ui/routes/auth/auth.index.tsx @@ -12,7 +12,9 @@ export function AuthIndex() { config: { roles, strategies, entity_name, enabled } } = useBkndAuth(); const users_entity = entity_name; - const $q = useApiQuery((api) => api.data.count(users_entity)); + const $q = useApiQuery((api) => api.data.count(users_entity), { + enabled + }); const usersTotal = $q.data?.count ?? 0; const rolesTotal = Object.keys(roles ?? {}).length ?? 0; const strategiesTotal = Object.keys(strategies ?? {}).length ?? 0; From 6026613d299889dc2b0d6483af82a45f5ad2ae43 Mon Sep 17 00:00:00 2001 From: dswbx Date: Tue, 7 Jan 2025 18:08:50 +0100 Subject: [PATCH 03/30] feat: allow data query to have single string as sort --- app/__test__/data/data-query-impl.spec.ts | 26 ++++++++++++++++++----- app/src/data/server/data-query-impl.ts | 13 +++++++++--- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/app/__test__/data/data-query-impl.spec.ts b/app/__test__/data/data-query-impl.spec.ts index d5217df..a2fcdff 100644 --- a/app/__test__/data/data-query-impl.spec.ts +++ b/app/__test__/data/data-query-impl.spec.ts @@ -1,16 +1,15 @@ import { describe, expect, test } from "bun:test"; -import type { QueryObject } from "ufo"; -import { WhereBuilder, type WhereQuery } from "../../src/data/entities/query/WhereBuilder"; +import { Value } from "../../src/core/utils"; +import { WhereBuilder, type WhereQuery, querySchema } from "../../src/data"; import { getDummyConnection } from "./helper"; -const t = "t"; describe("data-query-impl", () => { function qb() { const c = getDummyConnection(); const kysely = c.dummyConnection.kysely; - return kysely.selectFrom(t).selectAll(); + return kysely.selectFrom("t").selectAll(); } - function compile(q: QueryObject) { + function compile(q: WhereQuery) { const { sql, parameters } = WhereBuilder.addClause(qb(), q).compile(); return { sql, parameters }; } @@ -90,3 +89,20 @@ describe("data-query-impl", () => { } }); }); + +describe("data-query-impl: Typebox", () => { + test("sort", async () => { + const decode = (input: any, expected: any) => { + const result = Value.Decode(querySchema, input); + expect(result.sort).toEqual(expected); + }; + const _dflt = { by: "id", dir: "asc" }; + + decode({ sort: "" }, _dflt); + decode({ sort: "name" }, { by: "name", dir: "asc" }); + decode({ sort: "-name" }, { by: "name", dir: "desc" }); + decode({ sort: "-posts.name" }, { by: "posts.name", dir: "desc" }); + decode({ sort: "-1name" }, _dflt); + decode({ sort: { by: "name", dir: "desc" } }, { by: "name", dir: "desc" }); + }); +}); diff --git a/app/src/data/server/data-query-impl.ts b/app/src/data/server/data-query-impl.ts index a85ac77..5bf18d9 100644 --- a/app/src/data/server/data-query-impl.ts +++ b/app/src/data/server/data-query-impl.ts @@ -6,7 +6,6 @@ import { Type, Value } from "core/utils"; -import type { Simplify } from "type-fest"; import { WhereBuilder } from "../entities"; const NumberOrString = (options: SchemaOptions = {}) => @@ -19,17 +18,25 @@ const limit = NumberOrString({ default: 10 }); const offset = NumberOrString({ default: 0 }); // @todo: allow "id" and "-id" +const sort_default = { by: "id", dir: "asc" }; const sort = Type.Transform( Type.Union( [Type.String(), Type.Object({ by: Type.String(), dir: StringEnum(["asc", "desc"]) })], { - default: { by: "id", dir: "asc" } + default: sort_default } ) ) .Decode((value) => { if (typeof value === "string") { - return JSON.parse(value); + if (/^-?[a-zA-Z_][a-zA-Z0-9_.]*$/.test(value)) { + const dir = value[0] === "-" ? "desc" : "asc"; + return { by: dir === "desc" ? value.slice(1) : value, dir }; + } else if (/^{.*}$/.test(value)) { + return JSON.parse(value); + } + + return sort_default; } return value; }) From aa86d545532f91a233c2b5a1531eb0157a7f0819 Mon Sep 17 00:00:00 2001 From: dswbx Date: Wed, 8 Jan 2025 10:16:41 +0100 Subject: [PATCH 04/30] clean up data controller --- app/src/data/api/DataController.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index 68a5417..adf10a4 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -1,33 +1,25 @@ import { type ClassController, isDebug, tbValidator as tb } from "core"; -import { StringEnum, Type, objectCleanEmpty, objectTransform } from "core/utils"; +import { StringEnum, Type } from "core/utils"; import { DataPermissions, type EntityData, type EntityManager, - FieldClassMap, type MutatorResponse, - PrimaryField, type RepoQuery, type RepositoryResponse, - TextField, querySchema } from "data"; import { Hono } from "hono"; import type { Handler } from "hono/types"; import type { ModuleBuildContext } from "modules"; import * as SystemPermissions from "modules/permissions"; -import { type AppDataConfig, FIELDS } from "../data-schema"; +import type { AppDataConfig } from "../data-schema"; export class DataController implements ClassController { constructor( private readonly ctx: ModuleBuildContext, private readonly config: AppDataConfig - ) { - /*console.log( - "data controller", - this.em.entities.map((e) => e.name) - );*/ - } + ) {} get em(): EntityManager { return this.ctx.em; From fcab042e8876b2ee346fe769e061daa03c6ef412 Mon Sep 17 00:00:00 2001 From: dswbx Date: Wed, 8 Jan 2025 17:03:50 +0100 Subject: [PATCH 05/30] replaced hook form with json schema from --- app/package.json | 3 +- app/src/ui/modules/auth/LoginForm.tsx | 74 +++++++++++++++----------- app/src/ui/routes/auth/auth.login.tsx | 1 - bun.lockb | Bin 1078080 -> 1078416 bytes 4 files changed, 44 insertions(+), 34 deletions(-) diff --git a/app/package.json b/app/package.json index 8efb6c9..352ad90 100644 --- a/app/package.json +++ b/app/package.json @@ -34,7 +34,8 @@ "liquidjs": "^10.15.0", "lodash-es": "^4.17.21", "oauth4webapi": "^2.11.1", - "swr": "^2.2.5" + "swr": "^2.2.5", + "json-schema-form-react": "link:json-schema-form-react" }, "devDependencies": { "@aws-sdk/client-s3": "^3.613.0", diff --git a/app/src/ui/modules/auth/LoginForm.tsx b/app/src/ui/modules/auth/LoginForm.tsx index 4f1887d..c20206b 100644 --- a/app/src/ui/modules/auth/LoginForm.tsx +++ b/app/src/ui/modules/auth/LoginForm.tsx @@ -1,7 +1,7 @@ -import { typeboxResolver } from "@hookform/resolvers/typebox"; -import { Type } from "core/utils"; +import type { ValueError } from "@sinclair/typebox/value"; +import { type TSchema, Type, Value } from "core/utils"; +import { Form, type Validator } from "json-schema-form-react"; import type { ComponentPropsWithoutRef } from "react"; -import { useForm } from "react-hook-form"; import { twMerge } from "tailwind-merge"; import { Button } from "ui/components/buttons/Button"; import * as Formy from "ui/components/form/Formy"; @@ -11,6 +11,13 @@ export type LoginFormProps = Omit, "onSubmit"> formData?: any; }; +class TypeboxValidator implements Validator { + async validate(schema: TSchema, data: any) { + return Value.Check(schema, data) ? [] : [...Value.Errors(schema, data)]; + } +} +const validator = new TypeboxValidator(); + const schema = Type.Object({ email: Type.String({ pattern: "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$" @@ -20,36 +27,39 @@ const schema = Type.Object({ }) }); -export function LoginForm({ formData, className, method = "POST", ...props }: LoginFormProps) { - const { - register, - formState: { isValid, errors } - } = useForm({ - mode: "onChange", - defaultValues: formData, - resolver: typeboxResolver(schema) - }); - +export function LoginForm({ formData, className, ...props }: LoginFormProps) { return ( -
- - Email address - - - - Password - - + + {({ errors, submitting }) => ( + <> +
{JSON.stringify(errors, null, 2)}
+ + Email address + + + + Password + + - -
+ + + )} + ); } diff --git a/app/src/ui/routes/auth/auth.login.tsx b/app/src/ui/routes/auth/auth.login.tsx index a9cebdc..9a05b76 100644 --- a/app/src/ui/routes/auth/auth.login.tsx +++ b/app/src/ui/routes/auth/auth.login.tsx @@ -22,7 +22,6 @@ export function AuthLogin() { }, {} ) as Record; - //console.log("oauth", oauth, strategies); return ( diff --git a/bun.lockb b/bun.lockb index 6aed43151bc8df4b4c2fe6281388811b5d2c000d..62f83ac8b5a69bdca2ac80b29c49f02240cbe574 100755 GIT binary patch delta 169709 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%0A@k^c6`;FA*P7!MhU!(7x`;^W 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 Date: Wed, 8 Jan 2025 17:10:00 +0100 Subject: [PATCH 06/30] optimized vite adapter with better defaults --- app/build.ts | 2 +- app/src/adapter/vite/vite.adapter.ts | 39 +++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/app/build.ts b/app/build.ts index 6511124..e982777 100644 --- a/app/build.ts +++ b/app/build.ts @@ -166,7 +166,7 @@ function baseConfig(adapter: string): tsup.Options { minify, sourcemap, watch, - entry: [`src/adapter/${adapter}`], + entry: [`src/adapter/${adapter}/index.ts`], format: ["esm"], platform: "neutral", outDir: `dist/adapter/${adapter}`, diff --git a/app/src/adapter/vite/vite.adapter.ts b/app/src/adapter/vite/vite.adapter.ts index e94ece6..2f6b3e9 100644 --- a/app/src/adapter/vite/vite.adapter.ts +++ b/app/src/adapter/vite/vite.adapter.ts @@ -1,10 +1,11 @@ import { serveStatic } from "@hono/node-server/serve-static"; +import { type DevServerOptions, default as honoViteDevServer } from "@hono/vite-dev-server"; import { type RuntimeBkndConfig, createRuntimeApp } from "adapter"; import type { App } from "bknd"; export type ViteBkndConfig = RuntimeBkndConfig & { setAdminHtml?: boolean; - forceDev?: boolean; + forceDev?: boolean | { mainPath: string }; html?: string; }; @@ -24,20 +25,26 @@ ${addBkndContext ? "" : ""} ); } -async function createApp(config: ViteBkndConfig, env?: any) { +async function createApp(config: ViteBkndConfig = {}, env?: any) { return await createRuntimeApp( { ...config, - adminOptions: config.setAdminHtml - ? { html: config.html, forceDev: config.forceDev } - : undefined, + adminOptions: + config.setAdminHtml === false + ? undefined + : { + html: config.html, + forceDev: config.forceDev ?? { + mainPath: "/src/main.tsx" + } + }, serveStatic: ["/assets/*", serveStatic({ root: config.distPath ?? "./" })] }, env ); } -export async function serveFresh(config: ViteBkndConfig) { +export function serveFresh(config: ViteBkndConfig = {}) { return { async fetch(request: Request, env: any, ctx: ExecutionContext) { const app = await createApp(config, env); @@ -47,7 +54,7 @@ export async function serveFresh(config: ViteBkndConfig) { } let app: App; -export async function serveCached(config: ViteBkndConfig) { +export function serveCached(config: ViteBkndConfig = {}) { return { async fetch(request: Request, env: any, ctx: ExecutionContext) { if (!app) { @@ -58,3 +65,21 @@ export async function serveCached(config: ViteBkndConfig) { } }; } + +export function devServer(options: DevServerOptions) { + return honoViteDevServer({ + entry: "./server.ts", + exclude: [ + /.*\.tsx?($|\?)/, + /^(?!.*\/__admin).*\.(s?css|less)($|\?)/, + // exclude except /api + /^(?!.*\/api).*\.(ico|mp4|jpg|jpeg|svg|png|vtt|mp3|js)($|\?)/, + /^\/@.+$/, + /\/components.*?\.json.*/, // @todo: improve + /^\/(public|assets|static)\/.+/, + /^\/node_modules\/.*/ + ], + injectClientScript: false, + ...options + }); +} From 5c7bfeab8f6a5bbfb7cfbe2a3799a2b69d244b25 Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 9 Jan 2025 10:20:28 +0100 Subject: [PATCH 07/30] Refactor authentication components for modularity Replaced `LoginForm` with a more extensible `AuthForm` and `AuthScreen`, enabling support for multiple auth strategies (e.g., OAuth) and improved reusability. Updated imports, routes, and configurations accordingly. --- app/build.ts | 7 +- app/package.json | 5 + app/src/auth/auth-schema.ts | 1 + app/src/ui/elements/index.ts | 1 + app/src/ui/layouts/AppShell/Header.tsx | 16 +++- app/src/ui/modules/auth/AuthForm.tsx | 128 +++++++++++++++++++++++++ app/src/ui/modules/auth/AuthScreen.tsx | 41 ++++++++ app/src/ui/modules/auth/LoginForm.tsx | 65 ------------- app/src/ui/modules/auth/SocialLink.tsx | 33 +++++++ app/src/ui/modules/auth/index.ts | 9 ++ app/src/ui/routes/auth/auth.login.tsx | 77 +-------------- 11 files changed, 237 insertions(+), 146 deletions(-) create mode 100644 app/src/ui/elements/index.ts create mode 100644 app/src/ui/modules/auth/AuthForm.tsx create mode 100644 app/src/ui/modules/auth/AuthScreen.tsx delete mode 100644 app/src/ui/modules/auth/LoginForm.tsx create mode 100644 app/src/ui/modules/auth/SocialLink.tsx create mode 100644 app/src/ui/modules/auth/index.ts diff --git a/app/build.ts b/app/build.ts index 6511124..37394a7 100644 --- a/app/build.ts +++ b/app/build.ts @@ -138,7 +138,12 @@ await tsup.build({ minify, sourcemap, watch, - entry: ["src/ui/index.ts", "src/ui/client/index.ts", "src/ui/main.css"], + entry: [ + "src/ui/index.ts", + "src/ui/client/index.ts", + "src/ui/elements/index.ts", + "src/ui/main.css" + ], outDir: "dist/ui", external: ["bun:test", "react", "react-dom", "use-sync-external-store"], metafile: true, diff --git a/app/package.json b/app/package.json index 352ad90..d2c52b3 100644 --- a/app/package.json +++ b/app/package.json @@ -104,6 +104,11 @@ "import": "./dist/ui/index.js", "require": "./dist/ui/index.cjs" }, + "./elements": { + "types": "./dist/types/ui/elements/index.d.ts", + "import": "./dist/ui/elements/index.js", + "require": "./dist/ui/elements/index.cjs" + }, "./client": { "types": "./dist/types/ui/client/index.d.ts", "import": "./dist/ui/client/index.js", diff --git a/app/src/auth/auth-schema.ts b/app/src/auth/auth-schema.ts index 202e0b4..84882b5 100644 --- a/app/src/auth/auth-schema.ts +++ b/app/src/auth/auth-schema.ts @@ -33,6 +33,7 @@ const strategiesSchemaObject = objectTransform(STRATEGIES, (strategy, name) => { const strategiesSchema = Type.Union(Object.values(strategiesSchemaObject)); export type AppAuthStrategies = Static; export type AppAuthOAuthStrategy = Static; +export type AppAuthCustomOAuthStrategy = Static; const guardConfigSchema = Type.Object({ enabled: Type.Optional(Type.Boolean({ default: false })) diff --git a/app/src/ui/elements/index.ts b/app/src/ui/elements/index.ts new file mode 100644 index 0000000..0e3c055 --- /dev/null +++ b/app/src/ui/elements/index.ts @@ -0,0 +1 @@ +export { Auth } from "ui/modules/auth/index"; diff --git a/app/src/ui/layouts/AppShell/Header.tsx b/app/src/ui/layouts/AppShell/Header.tsx index 0d1c701..6343772 100644 --- a/app/src/ui/layouts/AppShell/Header.tsx +++ b/app/src/ui/layouts/AppShell/Header.tsx @@ -144,7 +144,7 @@ export function Header({ hasSidebar = true }) { } function UserMenu() { - const { adminOverride } = useBknd(); + const { adminOverride, config } = useBknd(); const auth = useAuth(); const [navigate] = useNavigate(); const { logout_route } = useBkndWindowContext(); @@ -163,10 +163,16 @@ function UserMenu() { { label: "Settings", onClick: () => navigate("/settings"), icon: IconSettings } ]; - if (!auth.user) { - items.push({ label: "Login", onClick: handleLogin, icon: IconUser }); - } else { - items.push({ label: `Logout ${auth.user.email}`, onClick: handleLogout, icon: IconKeyOff }); + if (config.auth.enabled) { + if (!auth.user) { + items.push({ label: "Login", onClick: handleLogin, icon: IconUser }); + } else { + items.push({ + label: `Logout ${auth.user.email}`, + onClick: handleLogout, + icon: IconKeyOff + }); + } } if (!adminOverride) { diff --git a/app/src/ui/modules/auth/AuthForm.tsx b/app/src/ui/modules/auth/AuthForm.tsx new file mode 100644 index 0000000..fa864ef --- /dev/null +++ b/app/src/ui/modules/auth/AuthForm.tsx @@ -0,0 +1,128 @@ +import type { ValueError } from "@sinclair/typebox/value"; +import type { AppAuthOAuthStrategy, AppAuthSchema } from "auth/auth-schema"; +import { type TSchema, Type, Value } from "core/utils"; +import { Form, type Validator } from "json-schema-form-react"; +import { transform } from "lodash-es"; +import type { ComponentPropsWithoutRef } from "react"; +import { twMerge } from "tailwind-merge"; +import { Button } from "ui/components/buttons/Button"; +import { Group, Input, Label } from "ui/components/form/Formy"; +import { SocialLink } from "ui/modules/auth/SocialLink"; + +export type LoginFormProps = Omit, "onSubmit" | "action"> & { + className?: string; + formData?: any; + action: "login" | "register"; + method?: "POST" | "GET"; + auth?: Partial>; + buttonLabel?: string; +}; + +class TypeboxValidator implements Validator { + async validate(schema: TSchema, data: any) { + return Value.Check(schema, data) ? [] : [...Value.Errors(schema, data)]; + } +} + +const validator = new TypeboxValidator(); + +const schema = Type.Object({ + email: Type.String({ + pattern: "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$" + }), + password: Type.String({ + minLength: 8 // @todo: this should be configurable + }) +}); + +export function AuthForm({ + formData, + className, + method = "POST", + action, + auth, + buttonLabel = action === "login" ? "Sign in" : "Sign up", + ...props +}: LoginFormProps) { + const basepath = auth?.basepath ?? "/api/auth"; + const password = { + action: `${basepath}/password/${action}`, + strategy: auth?.strategies?.password ?? ({ type: "password" } as const) + }; + + const oauth = transform( + auth?.strategies ?? {}, + (result, value, key) => { + if (value.type !== "password") { + result[key] = value.config; + } + }, + {} + ) as Record; + const has_oauth = Object.keys(oauth).length > 0; + + return ( +

+ {has_oauth && ( + <> +
+ {Object.entries(oauth)?.map(([name, oauth], key) => ( + + ))} +
+ + + )} +
+ {({ errors, submitting }) => ( + <> + + + + + + + + + + + + )} +
+
+ ); +} + +const Or = () => ( +
+
+
+
+
or
+
+
+
+
+); diff --git a/app/src/ui/modules/auth/AuthScreen.tsx b/app/src/ui/modules/auth/AuthScreen.tsx new file mode 100644 index 0000000..3ac60e1 --- /dev/null +++ b/app/src/ui/modules/auth/AuthScreen.tsx @@ -0,0 +1,41 @@ +import type { ReactNode } from "react"; +import { useAuthStrategies } from "ui/client/schema/auth/use-auth"; +import { Logo } from "ui/components/display/Logo"; +import { Link } from "ui/components/wouter/Link"; +import { AuthForm } from "ui/modules/auth/AuthForm"; + +export type AuthScreenProps = { + method?: "POST" | "GET"; + action?: "login" | "register"; + logo?: ReactNode; + intro?: ReactNode; +}; + +export function AuthScreen({ method = "POST", action = "login", logo, intro }: AuthScreenProps) { + const { strategies, basepath, loading } = useAuthStrategies(); + + return ( +
+ {!loading && ( +
+ {typeof logo !== "undefined" ? ( + logo + ) : ( + + + + )} + {typeof intro !== "undefined" ? ( + intro + ) : ( +
+

Sign in to your admin panel

+

Enter your credentials below to get access.

+
+ )} + +
+ )} +
+ ); +} diff --git a/app/src/ui/modules/auth/LoginForm.tsx b/app/src/ui/modules/auth/LoginForm.tsx deleted file mode 100644 index c20206b..0000000 --- a/app/src/ui/modules/auth/LoginForm.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import type { ValueError } from "@sinclair/typebox/value"; -import { type TSchema, Type, Value } from "core/utils"; -import { Form, type Validator } from "json-schema-form-react"; -import type { ComponentPropsWithoutRef } from "react"; -import { twMerge } from "tailwind-merge"; -import { Button } from "ui/components/buttons/Button"; -import * as Formy from "ui/components/form/Formy"; - -export type LoginFormProps = Omit, "onSubmit"> & { - className?: string; - formData?: any; -}; - -class TypeboxValidator implements Validator { - async validate(schema: TSchema, data: any) { - return Value.Check(schema, data) ? [] : [...Value.Errors(schema, data)]; - } -} -const validator = new TypeboxValidator(); - -const schema = Type.Object({ - email: Type.String({ - pattern: "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$" - }), - password: Type.String({ - minLength: 8 // @todo: this should be configurable - }) -}); - -export function LoginForm({ formData, className, ...props }: LoginFormProps) { - return ( -
- {({ errors, submitting }) => ( - <> -
{JSON.stringify(errors, null, 2)}
- - Email address - - - - Password - - - - - - )} -
- ); -} diff --git a/app/src/ui/modules/auth/SocialLink.tsx b/app/src/ui/modules/auth/SocialLink.tsx new file mode 100644 index 0000000..e116bb4 --- /dev/null +++ b/app/src/ui/modules/auth/SocialLink.tsx @@ -0,0 +1,33 @@ +import { ucFirstAllSnakeToPascalWithSpaces } from "core/utils"; +import type { ReactNode } from "react"; +import { Button } from "ui/components/buttons/Button"; +import type { IconType } from "ui/components/buttons/IconButton"; + +export type SocialLinkProps = { + label?: string; + provider: string; + icon?: IconType; + action: "login" | "register"; + method?: "GET" | "POST"; + basepath?: string; + children?: ReactNode; +}; + +export function SocialLink({ + label, + provider, + icon, + action, + method = "POST", + basepath = "/api/auth", + children +}: SocialLinkProps) { + return ( +
+ + {children} +
+ ); +} diff --git a/app/src/ui/modules/auth/index.ts b/app/src/ui/modules/auth/index.ts new file mode 100644 index 0000000..f3940d7 --- /dev/null +++ b/app/src/ui/modules/auth/index.ts @@ -0,0 +1,9 @@ +import { AuthForm } from "ui/modules/auth/AuthForm"; +import { AuthScreen } from "ui/modules/auth/AuthScreen"; +import { SocialLink } from "ui/modules/auth/SocialLink"; + +export const Auth = { + Screen: AuthScreen, + Form: AuthForm, + SocialLink: SocialLink +}; diff --git a/app/src/ui/routes/auth/auth.login.tsx b/app/src/ui/routes/auth/auth.login.tsx index 9a05b76..b9bf183 100644 --- a/app/src/ui/routes/auth/auth.login.tsx +++ b/app/src/ui/routes/auth/auth.login.tsx @@ -1,80 +1,7 @@ -import type { AppAuthOAuthStrategy } from "auth/auth-schema"; -import { ucFirstAllSnakeToPascalWithSpaces } from "core/utils"; -import { transform } from "lodash-es"; -import { useAuthStrategies } from "ui/client/schema/auth/use-auth"; -import { Button } from "ui/components/buttons/Button"; -import { Logo } from "ui/components/display/Logo"; -import { Link } from "ui/components/wouter/Link"; import { useBrowserTitle } from "ui/hooks/use-browser-title"; -import { LoginForm } from "ui/modules/auth/LoginForm"; -import * as AppShell from "../../layouts/AppShell/AppShell"; +import { AuthScreen } from "ui/modules/auth/AuthScreen"; export function AuthLogin() { useBrowserTitle(["Login"]); - const { strategies, basepath, loading } = useAuthStrategies(); - - const oauth = transform( - strategies ?? {}, - (result, value, key) => { - if (value.type !== "password") { - result[key] = value.config; - } - }, - {} - ) as Record; - - return ( - - - {!loading && ( -
- - - -
-

Sign in to your admin panel

-

Enter your credentials below to get access.

-
-
- {Object.keys(oauth).length > 0 && ( - <> - {Object.entries(oauth)?.map(([name, oauth], key) => ( -
- -
- ))} - -
-
-
-
-
or
-
-
-
-
- - )} - - - {/*Logout*/} -
-
- )} - - - ); + return ; } From 47f48be51496f1f043420ca7b755bbc71525a8d0 Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 9 Jan 2025 10:59:48 +0100 Subject: [PATCH 08/30] Refactor module middleware initialization logic. Replaced `getMiddleware` with `onServerInit` for streamlined middleware registration. Updated `AppAuth` to automatically register its authentication middleware. Added a test case to verify middleware registration. Removed redundant cookie renewal logic from `AdminController` and made related adjustments across modules. --- app/__test__/modules/AppAuth.spec.ts | 28 +++++++++++++++++++++- app/src/App.ts | 9 ++++--- app/src/auth/AppAuth.ts | 6 +++++ app/src/auth/authenticate/Authenticator.ts | 1 - app/src/auth/middlewares.ts | 9 ++++++- app/src/modules/Controller.ts | 12 ++++------ app/src/modules/Module.ts | 7 +++--- app/src/modules/ModuleManager.ts | 11 +++------ app/src/modules/server/AdminController.tsx | 2 -- 9 files changed, 58 insertions(+), 27 deletions(-) diff --git a/app/__test__/modules/AppAuth.spec.ts b/app/__test__/modules/AppAuth.spec.ts index 14640f0..d8866c7 100644 --- a/app/__test__/modules/AppAuth.spec.ts +++ b/app/__test__/modules/AppAuth.spec.ts @@ -1,4 +1,5 @@ -import { afterAll, beforeAll, beforeEach, describe, expect, test } from "bun:test"; +import { afterAll, beforeAll, beforeEach, describe, expect, spyOn, test } from "bun:test"; +import { createApp } from "../../src"; import { AuthController } from "../../src/auth/api/AuthController"; import { AppAuth, type ModuleBuildContext } from "../../src/modules"; import { disableConsoleLog, enableConsoleLog } from "../helper"; @@ -76,4 +77,29 @@ describe("AppAuth", () => { expect(users[0].email).toBe("some@body.com"); } }); + + test("registers auth middleware automatically", async () => { + const app = createApp({ + initialConfig: { + auth: { + enabled: true, + jwt: { + secret: "123456" + } + } + } + }); + + await app.build(); + const spy = spyOn(app.module.auth.authenticator, "requestCookieRefresh"); + + // register custom route + app.server.get("/test", async (c) => c.text("test")); + + // call a system api and then the custom route + await app.server.request("/api/system/ping"); + await app.server.request("/test"); + + expect(spy.mock.calls.length).toBe(2); + }); }); diff --git a/app/src/App.ts b/app/src/App.ts index 9faa1d4..cc8af11 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -74,7 +74,7 @@ export class App { server.use(async (c, next) => { c.set("app", this); await next(); - }) + }); } }); this.modules.ctx().emgr.registerEvents(AppEvents); @@ -108,7 +108,6 @@ export class App { //console.log("emitting built", options); await this.emgr.emit(new AppBuiltEvent({ app: this })); - server.all("/api/*", async (c) => c.notFound()); if (options?.save) { @@ -130,6 +129,10 @@ export class App { return this.modules.server; } + get em() { + return this.modules.ctx().em; + } + get fetch(): any { return this.server.fetch; } @@ -194,4 +197,4 @@ export function createApp(config: CreateAppConfig = {}) { } return new App(connection, config.initialConfig, config.plugins, config.options); -} \ No newline at end of file +} diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index c8557da..a65b251 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -1,9 +1,11 @@ import { type AuthAction, Authenticator, type ProfileExchange, Role, type Strategy } from "auth"; import type { PasswordStrategy } from "auth/authenticate/strategies"; +import { auth } from "auth/middlewares"; import { type DB, Exception, type PrimaryFieldType } from "core"; import { type Static, secureRandomString, transformObject } from "core/utils"; import { type Entity, EntityIndex, type EntityManager } from "data"; import { type FieldSchema, entity, enumm, make, text } from "data/prototype"; +import type { Hono } from "hono"; import { pick } from "lodash-es"; import { Module } from "modules/Module"; import { AuthController } from "./api/AuthController"; @@ -89,6 +91,10 @@ export class AppAuth extends Module { return this._controller; } + override onServerInit(hono: Hono) { + hono.use(auth); + } + getSchema() { return authConfigSchema; } diff --git a/app/src/auth/authenticate/Authenticator.ts b/app/src/auth/authenticate/Authenticator.ts index 46fa586..01355b5 100644 --- a/app/src/auth/authenticate/Authenticator.ts +++ b/app/src/auth/authenticate/Authenticator.ts @@ -243,7 +243,6 @@ export class Authenticator = Record< if (this.config.cookie.renew) { const token = await this.getAuthCookie(c); if (token) { - console.log("renewing cookie", c.req.url); await this.setAuthCookie(c, token); } } diff --git a/app/src/auth/middlewares.ts b/app/src/auth/middlewares.ts index d378dc4..6f00ee0 100644 --- a/app/src/auth/middlewares.ts +++ b/app/src/auth/middlewares.ts @@ -16,17 +16,24 @@ async function resolveAuth(app: ServerEnv["Variables"]["app"], c: Context(async (c, next) => { + // make sure to only register once + if (c.get("auth_registered")) { + return; + } await resolveAuth(c.get("app"), c); + c.set("auth_registered", true); await next(); }); export const permission = (...permissions: Permission[]) => createMiddleware(async (c, next) => { const app = c.get("app"); - await resolveAuth(app, c); const p = Array.isArray(permissions) ? permissions : [permissions]; const guard = app.modules.ctx().guard; diff --git a/app/src/modules/Controller.ts b/app/src/modules/Controller.ts index ebd31c0..99aace5 100644 --- a/app/src/modules/Controller.ts +++ b/app/src/modules/Controller.ts @@ -6,14 +6,10 @@ export class Controller { protected middlewares = { auth, permission - } + }; - protected create({ auth }: { auth?: boolean } = {}): Hono { - const server = Controller.createServer(); - if (auth !== false) { - server.use(this.middlewares.auth); - } - return server; + protected create(): Hono { + return Controller.createServer(); } static createServer(): Hono { @@ -23,4 +19,4 @@ export class Controller { getController(): Hono { return this.create(); } -} \ No newline at end of file +} diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index 6a86d3e..e9e2933 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -10,6 +10,7 @@ export type ServerEnv = { Variables: { app: App; auth_resolved: boolean; + auth_registered: boolean; html?: string; }; }; @@ -87,9 +88,9 @@ export abstract class Module) {} get ctx() { if (!this._ctx) { diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index dcbfb34..558b3d8 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -212,14 +212,9 @@ export class ModuleManager { this.options.onServerInit(this.server); } - // @todo: this is a current workaround, controllers must be reworked + // optional method for each module to register global middlewares, etc. objectEach(this.modules, (module) => { - if ("getMiddleware" in module) { - const middleware = module.getMiddleware(); - if (middleware) { - this.server.use(middleware); - } - } + module.onServerInit(this.server); }); } @@ -550,4 +545,4 @@ export function getDefaultConfig(): ModuleConfigs { }); return config as any; -} \ No newline at end of file +} diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index 1da3dee..e7e60fe 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -65,8 +65,6 @@ export class AdminController extends Controller { } c.set("html", html); - // refresh cookie if needed - await auth.authenticator?.requestCookieRefresh(c); await next(); }); From 99df7f1402e2c4aa9946c8face5cca9cde753a14 Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 9 Jan 2025 11:06:40 +0100 Subject: [PATCH 09/30] Handle missing app context in permission middleware to prevent errors. --- app/src/auth/middlewares.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/auth/middlewares.ts b/app/src/auth/middlewares.ts index 6f00ee0..afefc94 100644 --- a/app/src/auth/middlewares.ts +++ b/app/src/auth/middlewares.ts @@ -34,11 +34,14 @@ export const auth = createMiddleware(async (c, next) => { export const permission = (...permissions: Permission[]) => createMiddleware(async (c, next) => { const app = c.get("app"); - - const p = Array.isArray(permissions) ? permissions : [permissions]; - const guard = app.modules.ctx().guard; - for (const permission of p) { - guard.throwUnlessGranted(permission); + if (app) { + const p = Array.isArray(permissions) ? permissions : [permissions]; + const guard = app.modules.ctx().guard; + for (const permission of p) { + guard.throwUnlessGranted(permission); + } + } else { + console.warn("app not in context, skip permission check"); } await next(); From 138a3579cb7293337622a38aa7c406c2e52102a6 Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 9 Jan 2025 11:23:23 +0100 Subject: [PATCH 10/30] Update test expectations and fix test utility usage Replaced `console.log` with `expect` in crypto tests for proper validation. Wrapped a test case with `withDisabledConsole` to suppress expected log output. Fixed typo in data test field configuration (`max_length` to `maxLength`). --- app/__test__/core/crypto.spec.ts | 10 ++++++---- app/__test__/data/data.test.ts | 2 +- app/__test__/flows/workflow-basic.test.ts | 6 ++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/__test__/core/crypto.spec.ts b/app/__test__/core/crypto.spec.ts index 38178af..238b9e4 100644 --- a/app/__test__/core/crypto.spec.ts +++ b/app/__test__/core/crypto.spec.ts @@ -1,14 +1,16 @@ -import { describe, test } from "bun:test"; +import { describe, expect, test } from "bun:test"; import { checksum, hash } from "../../src/core/utils"; describe("crypto", async () => { test("sha256", async () => { - console.log(await hash.sha256("test")); + expect(await hash.sha256("test")).toBe( + "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + ); }); test("sha1", async () => { - console.log(await hash.sha1("test")); + expect(await hash.sha1("test")).toBe("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"); }); test("checksum", async () => { - console.log(checksum("hello world")); + expect(await checksum("hello world")).toBe("2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"); }); }); diff --git a/app/__test__/data/data.test.ts b/app/__test__/data/data.test.ts index 5d9c32a..dc8257f 100644 --- a/app/__test__/data/data.test.ts +++ b/app/__test__/data/data.test.ts @@ -18,7 +18,7 @@ describe("some tests", async () => { const users = new Entity("users", [ new TextField("username", { required: true, default_value: "nobody" }), - new TextField("email", { max_length: 3 }) + new TextField("email", { maxLength: 3 }) ]); const posts = new Entity("posts", [ diff --git a/app/__test__/flows/workflow-basic.test.ts b/app/__test__/flows/workflow-basic.test.ts index f199762..6a0f1d6 100644 --- a/app/__test__/flows/workflow-basic.test.ts +++ b/app/__test__/flows/workflow-basic.test.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-unresolved import { describe, expect, test } from "bun:test"; import { isEqual } from "lodash-es"; -import { type Static, Type, _jsonp } from "../../src/core/utils"; +import { type Static, Type, _jsonp, withDisabledConsole } from "../../src/core/utils"; import { Condition, ExecutionEvent, FetchTask, Flow, LogTask, Task } from "../../src/flows"; /*beforeAll(disableConsoleLog); @@ -232,7 +232,9 @@ describe("Flow tests", async () => { ).toEqual(["second", "fourth"]); const execution = back.createExecution(); - expect(execution.start()).rejects.toThrow(); + withDisabledConsole(async () => { + expect(execution.start()).rejects.toThrow(); + }); }); test("Flow with back step: enough retries", async () => { From d18264098162b6b75a2e476a0062d152ff92d1eb Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 9 Jan 2025 15:43:43 +0100 Subject: [PATCH 11/30] Add Media.Dropzone and Media.Preview as isolated elements Introduce `Media.*` to modularize and customize file upload handling. Refactor media-related components to improve usability, add max item limits, overwrite support, and event callbacks. --- app/src/media/media-schema.ts | 3 +- app/src/ui/client/api/use-entity.ts | 2 + app/src/ui/elements/index.ts | 1 + app/src/ui/elements/media.ts | 15 ++ .../ui/modules/data/components/EntityForm.tsx | 42 +--- .../media/components/dropzone/Dropzone.tsx | 199 ++++++++++++------ .../components/dropzone/DropzoneContainer.tsx | 98 +++++++++ .../media/components/dropzone/use-dropzone.ts | 11 +- app/src/ui/routes/media/_media.root.tsx | 32 +-- app/src/ui/routes/test/index.tsx | 4 +- .../test/tests/dropzone-element-test.tsx | 78 +++++++ 11 files changed, 358 insertions(+), 127 deletions(-) create mode 100644 app/src/ui/elements/media.ts create mode 100644 app/src/ui/modules/media/components/dropzone/DropzoneContainer.tsx create mode 100644 app/src/ui/routes/test/tests/dropzone-element-test.tsx diff --git a/app/src/media/media-schema.ts b/app/src/media/media-schema.ts index 045a0ca..64a52ba 100644 --- a/app/src/media/media-schema.ts +++ b/app/src/media/media-schema.ts @@ -1,4 +1,4 @@ -import { Const, Type, objectTransform } from "core/utils"; +import { Const, type Static, Type, objectTransform } from "core/utils"; import { Adapters } from "media"; import { registries } from "modules/registries"; @@ -47,3 +47,4 @@ export function buildMediaSchema() { } export const mediaConfigSchema = buildMediaSchema(); +export type TAppMediaConfig = Static; diff --git a/app/src/ui/client/api/use-entity.ts b/app/src/ui/client/api/use-entity.ts index 4900972..5f4da99 100644 --- a/app/src/ui/client/api/use-entity.ts +++ b/app/src/ui/client/api/use-entity.ts @@ -143,6 +143,8 @@ export const useEntityQuery = < return { ...swr, ...mapped, + mutate: mutateAll, + mutateRaw: swr.mutate, api, key }; diff --git a/app/src/ui/elements/index.ts b/app/src/ui/elements/index.ts index 0e3c055..83a292b 100644 --- a/app/src/ui/elements/index.ts +++ b/app/src/ui/elements/index.ts @@ -1 +1,2 @@ export { Auth } from "ui/modules/auth/index"; +export * from "./media"; diff --git a/app/src/ui/elements/media.ts b/app/src/ui/elements/media.ts new file mode 100644 index 0000000..5ed6e11 --- /dev/null +++ b/app/src/ui/elements/media.ts @@ -0,0 +1,15 @@ +import { PreviewWrapperMemoized } from "ui/modules/media/components/dropzone/Dropzone"; +import { DropzoneContainer } from "ui/modules/media/components/dropzone/DropzoneContainer"; + +export const Media = { + Dropzone: DropzoneContainer, + Preview: PreviewWrapperMemoized +}; + +export type { + PreviewComponentProps, + FileState, + DropzoneProps, + DropzoneRenderProps +} from "ui/modules/media/components/dropzone/Dropzone"; +export type { DropzoneContainerProps } from "ui/modules/media/components/dropzone/DropzoneContainer"; diff --git a/app/src/ui/modules/data/components/EntityForm.tsx b/app/src/ui/modules/data/components/EntityForm.tsx index 131bd61..fb5fc5f 100644 --- a/app/src/ui/modules/data/components/EntityForm.tsx +++ b/app/src/ui/modules/data/components/EntityForm.tsx @@ -10,13 +10,11 @@ import { } from "data"; import { MediaField } from "media/MediaField"; import { type ComponentProps, Suspense } from "react"; -import { useApi, useBaseUrl, useInvalidate } from "ui/client"; import { JsonEditor } from "ui/components/code/JsonEditor"; import * as Formy from "ui/components/form/Formy"; import { FieldLabel } from "ui/components/form/Formy"; +import { Media } from "ui/elements"; import { useEvent } from "ui/hooks/use-event"; -import { Dropzone, type FileState } from "../../media/components/dropzone/Dropzone"; -import { mediaItemsToFileStates } from "../../media/helper"; import { EntityJsonSchemaFormField } from "./fields/EntityJsonSchemaFormField"; import { EntityRelationalFormField } from "./fields/EntityRelationalFormField"; @@ -215,9 +213,6 @@ function EntityMediaFormField({ }) { if (!entityId) return; - const api = useApi(); - const baseUrl = useBaseUrl(); - const invalidate = useInvalidate(); const value = formApi.useStore((state) => { const val = state.values[field.name]; if (!val || typeof val === "undefined") return []; @@ -225,37 +220,20 @@ function EntityMediaFormField({ return [val]; }); - const initialItems: FileState[] = - value.length === 0 - ? [] - : mediaItemsToFileStates(value, { - baseUrl: api.baseUrl, - overrides: { state: "uploaded" } - }); - - const getUploadInfo = useEvent(() => { - return { - url: api.media.getEntityUploadUrl(entity.name, entityId, field.name), - headers: api.media.getUploadHeaders(), - method: "POST" - }; - }); - - const handleDelete = useEvent(async (file: FileState) => { - invalidate((api) => api.data.readOne(entity.name, entityId)); - return api.media.deleteFile(file.path); - }); + const key = JSON.stringify([entity, entityId, field.name, value.length]); return ( - ); diff --git a/app/src/ui/modules/media/components/dropzone/Dropzone.tsx b/app/src/ui/modules/media/components/dropzone/Dropzone.tsx index 19d2690..4f6fe20 100644 --- a/app/src/ui/modules/media/components/dropzone/Dropzone.tsx +++ b/app/src/ui/modules/media/components/dropzone/Dropzone.tsx @@ -1,5 +1,6 @@ import { type ComponentPropsWithRef, + type ComponentPropsWithoutRef, type RefObject, memo, useEffect, @@ -28,10 +29,11 @@ export type DropzoneRenderProps = { state: { files: FileState[]; isOver: boolean; + isOverAccepted: boolean; showPlaceholder: boolean; }; actions: { - uploadFileProgress: (file: FileState) => Promise; + uploadFile: (file: FileState) => Promise; deleteFile: (file: FileState) => Promise; openFileInput: () => void; }; @@ -43,11 +45,16 @@ export type DropzoneProps = { handleDelete: (file: FileState) => Promise; initialItems?: FileState[]; maxItems?: number; + overwrite?: boolean; autoUpload?: boolean; + onRejected?: (files: FileWithPath[]) => void; + onDeleted?: (file: FileState) => void; + onUploaded?: (file: FileState) => void; placeholder?: { show?: boolean; text?: string; }; + children?: (props: DropzoneRenderProps) => JSX.Element; }; export function Dropzone({ @@ -55,23 +62,65 @@ export function Dropzone({ handleDelete, initialItems = [], maxItems, + overwrite, autoUpload, - placeholder + placeholder, + onRejected, + onDeleted, + onUploaded, + children }: DropzoneProps) { const [files, setFiles] = useState(initialItems); const [uploading, setUploading] = useState(false); const inputRef = useRef(null); + const [isOverAccepted, setIsOverAccepted] = useState(false); + + function isMaxReached(added: number): boolean { + if (!maxItems) { + console.log("maxItems is undefined, never reached"); + return false; + } + + const current = files.length; + const remaining = maxItems - current; + console.log("isMaxReached", { added, current, remaining, maxItems, overwrite }); + + // if overwrite is set, but added is bigger than max items + if (overwrite) { + console.log("added > maxItems, stop?", added > maxItems); + return added > maxItems; + } + console.log("remaining > added, stop?", remaining > added); + // or remaining doesn't suffice, stop + return added > remaining; + } const { isOver, handleFileInputChange, ref } = useDropzone({ onDropped: (newFiles: FileWithPath[]) => { - if (maxItems && files.length + newFiles.length > maxItems) { - alert("Max items reached"); - return; + let to_drop = 0; + const added = newFiles.length; + + if (maxItems) { + if (isMaxReached(added)) { + if (onRejected) { + onRejected(newFiles); + } else { + console.warn("maxItems reached"); + } + + return; + } + + to_drop = added; } - console.log("files", newFiles); + console.log("files", newFiles, { to_drop }); setFiles((prev) => { - const currentPaths = prev.map((f) => f.path); + // drop amount calculated + const _prev = prev.slice(to_drop); + + // prep new files + const currentPaths = _prev.map((f) => f.path); const filteredFiles: FileState[] = newFiles .filter((f) => f.path && !currentPaths.includes(f.path)) .map((f) => ({ @@ -84,7 +133,7 @@ export function Dropzone({ progress: 0 })); - return [...prev, ...filteredFiles]; + return [..._prev, ...filteredFiles]; }); if (autoUpload) { @@ -92,17 +141,12 @@ export function Dropzone({ } }, onOver: (items) => { - if (maxItems && files.length + items.length >= maxItems) { - // indicate that the drop is not allowed - return; - } + const max_reached = isMaxReached(items.length); + setIsOverAccepted(!max_reached); + }, + onLeave: () => { + setIsOverAccepted(false); } - /*onOver: (items) => - console.log( - "onOver", - items, - items.map((i) => [i.kind, i.type].join(":")) - )*/ }); useEffect(() => { @@ -180,7 +224,14 @@ export function Dropzone({ formData.append("file", file.body); const xhr = new XMLHttpRequest(); - xhr.open(method, url, true); + const urlWithParams = new URL(url); + if (overwrite) { + urlWithParams.searchParams.append("overwrite", "1"); + } + console.log("url", urlWithParams.toString()); + //return; + + xhr.open(method, urlWithParams.toString(), true); if (headers) { headers.forEach((value, key) => { @@ -207,6 +258,8 @@ export function Dropzone({ if (xhr.status === 200) { //setFileState(file.path, "uploaded", 1); console.log("Upload complete"); + onUploaded?.(file); + try { const response = JSON.parse(xhr.responseText); @@ -252,6 +305,7 @@ export function Dropzone({ setFileState(file.path, "deleting"); await handleDelete(file); removeFileFromState(file.path); + onDeleted?.(file); } break; } @@ -262,54 +316,61 @@ export function Dropzone({ placeholder?.show === true || !maxItems || (maxItems && files.length < maxItems) ); - const Component = DropzoneInner; + const renderProps: DropzoneRenderProps = { + wrapperRef: ref, + inputProps: { + ref: inputRef, + type: "file", + multiple: !maxItems || maxItems > 1, + onChange: handleFileInputChange + }, + state: { + files, + isOver, + isOverAccepted, + showPlaceholder + }, + actions: { + uploadFile: uploadFileProgress, + deleteFile, + openFileInput + }, + dropzoneProps: { + maxItems, + placeholder, + autoUpload + } + }; - return ( - 1, - onChange: handleFileInputChange - }} - state={{ files, isOver, showPlaceholder }} - actions={{ uploadFileProgress, deleteFile, openFileInput }} - dropzoneProps={{ maxItems, placeholder, autoUpload }} - /> - ); + return children ? children(renderProps) : ; } const DropzoneInner = ({ wrapperRef, inputProps, - state: { files, isOver, showPlaceholder }, - actions: { uploadFileProgress, deleteFile, openFileInput }, + state: { files, isOver, isOverAccepted, showPlaceholder }, + actions: { uploadFile, deleteFile, openFileInput }, dropzoneProps: { placeholder } }: DropzoneRenderProps) => { return (
- 1} - onChange={handleFileInputChange}*/ - /> +
- {files.map((file, i) => ( + {files.map((file) => ( ))} @@ -333,18 +394,29 @@ const UploadPlaceholder = ({ onClick, text = "Upload files" }) => { ); }; -const Wrapper = ({ file }: { file: FileState }) => { +export type PreviewComponentProps = { + file: FileState; + fallback?: (props: { file: FileState }) => JSX.Element; + className?: string; + onClick?: () => void; + onTouchStart?: () => void; +}; + +const Wrapper = ({ file, fallback, ...props }: PreviewComponentProps) => { if (file.type.startsWith("image/")) { - return ; + return ; } if (file.type.startsWith("video/")) { - return ; + return ; } - return ; + return fallback ? fallback({ file }) : null; }; -const WrapperMemoized = memo(Wrapper, (prev, next) => prev.file.path === next.file.path); +export const PreviewWrapperMemoized = memo( + Wrapper, + (prev, next) => prev.file.path === next.file.path +); type PreviewProps = { file: FileState; @@ -370,7 +442,6 @@ const Preview: React.FC = ({ file, handleUpload, handleDelete }) = file.state === "deleting" && "opacity-70" )} > - {/*{file.state}*/}
@@ -385,7 +456,11 @@ const Preview: React.FC = ({ file, handleUpload, handleDelete }) =
)}
- +

{file.name}

@@ -398,14 +473,20 @@ const Preview: React.FC = ({ file, handleUpload, handleDelete }) = ); }; -const ImagePreview = ({ file }: { file: FileState }) => { +const ImagePreview = ({ + file, + ...props +}: { file: FileState } & ComponentPropsWithoutRef<"img">) => { const objectUrl = typeof file.body === "string" ? file.body : URL.createObjectURL(file.body); - return ; + return ; }; -const VideoPreview = ({ file }: { file: FileState }) => { +const VideoPreview = ({ + file, + ...props +}: { file: FileState } & ComponentPropsWithoutRef<"video">) => { const objectUrl = typeof file.body === "string" ? file.body : URL.createObjectURL(file.body); - return
} href="/integration/node" /> + + + + +
} + href="/integration/vite" + /> diff --git a/docs/mint.json b/docs/mint.json index 1298f0f..e848206 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -89,6 +89,7 @@ "integration/astro", "integration/node", "integration/deno", + "integration/vite", "integration/docker" ] }, From 475563b5e1d40c5dd6f5811f26b7d947353c3fd0 Mon Sep 17 00:00:00 2001 From: dswbx Date: Fri, 10 Jan 2025 11:41:48 +0100 Subject: [PATCH 14/30] fixed version of `json-schema-form-react` --- app/package.json | 2 +- bun.lockb | Bin 1078416 -> 1078504 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/package.json b/app/package.json index d2c52b3..da85eac 100644 --- a/app/package.json +++ b/app/package.json @@ -35,7 +35,7 @@ "lodash-es": "^4.17.21", "oauth4webapi": "^2.11.1", "swr": "^2.2.5", - "json-schema-form-react": "link:json-schema-form-react" + "json-schema-form-react": "^0.0.2" }, "devDependencies": { "@aws-sdk/client-s3": "^3.613.0", diff --git a/bun.lockb b/bun.lockb index 62f83ac8b5a69bdca2ac80b29c49f02240cbe574..64002392c1707671ae1392048828b56377494c58 100755 GIT binary patch delta 130018 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 Wo|5{yj(2>iezuMa>*re9@P7bYyaxgR delta 129289 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

$UHM)f8?>0(kP!D}mflV6=zy0_%RJH<_Z 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 Okoc%cP90?Hqy0ZGSIj{G From a8c20d36759f494506c3614fe1d35c7b13a40927 Mon Sep 17 00:00:00 2001 From: dswbx Date: Fri, 10 Jan 2025 14:43:39 +0100 Subject: [PATCH 15/30] Refactor module schema handling and add sync mechanism Redesigned entity and index management with methods to streamline schema updates and added a sync flag to signal required DB syncs post-build. Enhanced test coverage and functionality for schema modifications, including support for additional fields. --- app/__test__/Module.spec.ts | 38 ---- app/__test__/modules/AppAuth.spec.ts | 30 +++ app/__test__/modules/AppMedia.spec.ts | 48 ++++- app/__test__/modules/Module.spec.ts | 200 ++++++++++++++++++ .../{ => modules}/ModuleManager.spec.ts | 10 +- app/src/auth/AppAuth.ts | 43 ++-- app/src/data/prototype/index.ts | 16 +- app/src/media/AppMedia.ts | 41 ++-- app/src/modules/Module.ts | 47 +++- app/src/modules/ModuleManager.ts | 15 +- app/vite.dev.ts | 34 ++- 11 files changed, 413 insertions(+), 109 deletions(-) delete mode 100644 app/__test__/Module.spec.ts create mode 100644 app/__test__/modules/Module.spec.ts rename app/__test__/{ => modules}/ModuleManager.spec.ts (96%) diff --git a/app/__test__/Module.spec.ts b/app/__test__/Module.spec.ts deleted file mode 100644 index 4089ab1..0000000 --- a/app/__test__/Module.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { describe, expect, test } from "bun:test"; -import { type TSchema, Type, stripMark } from "../src/core/utils"; -import { Module } from "../src/modules/Module"; - -function createModule(schema: Schema) { - class TestModule extends Module { - getSchema() { - return schema; - } - toJSON() { - return this.config; - } - useForceParse() { - return true; - } - } - - return TestModule; -} - -describe("Module", async () => { - test("basic", async () => {}); - - test("listener", async () => { - let result: any; - - const module = createModule(Type.Object({ a: Type.String() })); - const m = new module({ a: "test" }); - - await m.schema().set({ a: "test2" }); - m.setListener(async (c) => { - await new Promise((r) => setTimeout(r, 10)); - result = stripMark(c); - }); - await m.schema().set({ a: "test3" }); - expect(result).toEqual({ a: "test3" }); - }); -}); diff --git a/app/__test__/modules/AppAuth.spec.ts b/app/__test__/modules/AppAuth.spec.ts index d8866c7..849d8dd 100644 --- a/app/__test__/modules/AppAuth.spec.ts +++ b/app/__test__/modules/AppAuth.spec.ts @@ -1,6 +1,7 @@ import { afterAll, beforeAll, beforeEach, describe, expect, spyOn, test } from "bun:test"; import { createApp } from "../../src"; import { AuthController } from "../../src/auth/api/AuthController"; +import { em, entity, text } from "../../src/data"; import { AppAuth, type ModuleBuildContext } from "../../src/modules"; import { disableConsoleLog, enableConsoleLog } from "../helper"; import { makeCtx, moduleTestSuite } from "./module-test-suite"; @@ -102,4 +103,33 @@ describe("AppAuth", () => { expect(spy.mock.calls.length).toBe(2); }); + + test("should allow additional user fields", async () => { + const app = createApp({ + initialConfig: { + auth: { + entity_name: "users", + enabled: true + }, + data: em({ + users: entity("users", { + additional: text() + }) + }).toJSON() + } + }); + + await app.build(); + + const userfields = app.modules.em.entity("users").fields.map((f) => f.name); + expect(userfields).toContain("additional"); + expect(userfields).toEqual([ + "id", + "additional", + "email", + "strategy", + "strategy_value", + "role" + ]); + }); }); diff --git a/app/__test__/modules/AppMedia.spec.ts b/app/__test__/modules/AppMedia.spec.ts index 6f1b0f5..c1fc2f9 100644 --- a/app/__test__/modules/AppMedia.spec.ts +++ b/app/__test__/modules/AppMedia.spec.ts @@ -1,7 +1,53 @@ -import { describe } from "bun:test"; +import { describe, expect, test } from "bun:test"; +import { createApp, registries } from "../../src"; +import { em, entity, text } from "../../src/data"; +import { StorageLocalAdapter } from "../../src/media/storage/adapters/StorageLocalAdapter"; import { AppMedia } from "../../src/modules"; import { moduleTestSuite } from "./module-test-suite"; describe("AppMedia", () => { moduleTestSuite(AppMedia); + + test("should allow additional fields", async () => { + registries.media.register("local", StorageLocalAdapter); + + const app = createApp({ + initialConfig: { + media: { + entity_name: "media", + enabled: true, + adapter: { + type: "local", + config: { + path: "./" + } + } + }, + data: em({ + media: entity("media", { + additional: text() + }) + }).toJSON() + } + }); + + await app.build(); + + const fields = app.modules.em.entity("media").fields.map((f) => f.name); + expect(fields).toContain("additional"); + expect(fields).toEqual([ + "id", + "additional", + "path", + "folder", + "mime_type", + "size", + "scope", + "etag", + "modified_at", + "reference", + "entity_id", + "metadata" + ]); + }); }); diff --git a/app/__test__/modules/Module.spec.ts b/app/__test__/modules/Module.spec.ts new file mode 100644 index 0000000..b53dcfa --- /dev/null +++ b/app/__test__/modules/Module.spec.ts @@ -0,0 +1,200 @@ +import { describe, expect, test } from "bun:test"; +import { type TSchema, Type, stripMark } from "../../src/core/utils"; +import { EntityManager, em, entity, index, text } from "../../src/data"; +import { DummyConnection } from "../../src/data/connection/DummyConnection"; +import { Module } from "../../src/modules/Module"; + +function createModule(schema: Schema) { + class TestModule extends Module { + getSchema() { + return schema; + } + toJSON() { + return this.config; + } + useForceParse() { + return true; + } + } + + return TestModule; +} + +describe("Module", async () => { + describe("basic", () => { + test("listener", async () => { + let result: any; + + const module = createModule(Type.Object({ a: Type.String() })); + const m = new module({ a: "test" }); + + await m.schema().set({ a: "test2" }); + m.setListener(async (c) => { + await new Promise((r) => setTimeout(r, 10)); + result = stripMark(c); + }); + await m.schema().set({ a: "test3" }); + expect(result).toEqual({ a: "test3" }); + }); + }); + + describe("db schema", () => { + class M extends Module { + override getSchema() { + return Type.Object({}); + } + + prt = { + ensureEntity: this.ensureEntity.bind(this), + ensureIndex: this.ensureIndex.bind(this), + ensureSchema: this.ensureSchema.bind(this) + }; + + get em() { + return this.ctx.em; + } + } + + function make(_em: ReturnType) { + const em = new EntityManager( + Object.values(_em.entities), + new DummyConnection(), + _em.relations, + _em.indices + ); + return new M({} as any, { em, flags: Module.ctx_flags } as any); + } + function flat(_em: EntityManager) { + return { + entities: _em.entities.map((e) => ({ + name: e.name, + fields: e.fields.map((f) => f.name) + })), + indices: _em.indices.map((i) => ({ + name: i.name, + entity: i.entity.name, + fields: i.fields.map((f) => f.name), + unique: i.unique + })) + }; + } + + test("no change", () => { + const initial = em({}); + + const m = make(initial); + expect(m.ctx.flags.sync_required).toBe(false); + + expect(flat(make(initial).em)).toEqual({ + entities: [], + indices: [] + }); + }); + + test("init", () => { + const initial = em({ + users: entity("u", { + name: text() + }) + }); + + const m = make(initial); + expect(m.ctx.flags.sync_required).toBe(false); + + expect(flat(m.em)).toEqual({ + entities: [ + { + name: "u", + fields: ["id", "name"] + } + ], + indices: [] + }); + }); + + test("ensure entity", () => { + const initial = em({ + users: entity("u", { + name: text() + }) + }); + + const m = make(initial); + expect(flat(m.em)).toEqual({ + entities: [ + { + name: "u", + fields: ["id", "name"] + } + ], + indices: [] + }); + + // this should add a new entity + m.prt.ensureEntity( + entity("p", { + title: text() + }) + ); + + // this should only add the field "important" + m.prt.ensureEntity( + entity("u", { + important: text() + }) + ); + + expect(m.ctx.flags.sync_required).toBe(true); + expect(flat(m.em)).toEqual({ + entities: [ + { + name: "u", + fields: ["id", "name", "important"] + }, + { + name: "p", + fields: ["id", "title"] + } + ], + indices: [] + }); + }); + + test("ensure index", () => { + const users = entity("u", { + name: text(), + title: text() + }); + const initial = em({ users }, ({ index }, { users }) => { + index(users).on(["title"]); + }); + + const m = make(initial); + m.prt.ensureIndex(index(users).on(["name"])); + + expect(m.ctx.flags.sync_required).toBe(true); + expect(flat(m.em)).toEqual({ + entities: [ + { + name: "u", + fields: ["id", "name", "title"] + } + ], + indices: [ + { + name: "idx_u_title", + entity: "u", + fields: ["title"], + unique: false + }, + { + name: "idx_u_name", + entity: "u", + fields: ["name"], + unique: false + } + ] + }); + }); + }); +}); diff --git a/app/__test__/ModuleManager.spec.ts b/app/__test__/modules/ModuleManager.spec.ts similarity index 96% rename from app/__test__/ModuleManager.spec.ts rename to app/__test__/modules/ModuleManager.spec.ts index 2e928d6..e22afff 100644 --- a/app/__test__/ModuleManager.spec.ts +++ b/app/__test__/modules/ModuleManager.spec.ts @@ -1,9 +1,9 @@ import { describe, expect, test } from "bun:test"; -import { mark, stripMark } from "../src/core/utils"; -import { entity, text } from "../src/data"; -import { ModuleManager, getDefaultConfig } from "../src/modules/ModuleManager"; -import { CURRENT_VERSION, TABLE_NAME } from "../src/modules/migrations"; -import { getDummyConnection } from "./helper"; +import { stripMark } from "../../src/core/utils"; +import { entity, text } from "../../src/data"; +import { ModuleManager, getDefaultConfig } from "../../src/modules/ModuleManager"; +import { CURRENT_VERSION, TABLE_NAME } from "../../src/modules/migrations"; +import { getDummyConnection } from "../helper"; describe("ModuleManager", async () => { test("s1: no config, no build", async () => { diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index a65b251..8899495 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -4,7 +4,7 @@ import { auth } from "auth/middlewares"; import { type DB, Exception, type PrimaryFieldType } from "core"; import { type Static, secureRandomString, transformObject } from "core/utils"; import { type Entity, EntityIndex, type EntityManager } from "data"; -import { type FieldSchema, entity, enumm, make, text } from "data/prototype"; +import { type FieldSchema, em, entity, enumm, make, text } from "data/prototype"; import type { Hono } from "hono"; import { pick } from "lodash-es"; import { Module } from "modules/Module"; @@ -250,43 +250,30 @@ export class AppAuth extends Module { }; registerEntities() { - const users = this.getUsersEntity(); - - if (!this.em.hasEntity(users.name)) { - this.em.addEntity(users); - } else { - // if exists, check all fields required are there - // @todo: add to context: "needs sync" flag - const _entity = this.getUsersEntity(true); - for (const field of _entity.fields) { - const _field = users.field(field.name); - if (!_field) { - users.addField(field); + const name = this.config.entity_name as "users"; + const { + entities: { users } + } = this.ensureSchema( + em( + { + [name]: entity(name, AppAuth.usersFields) + }, + ({ index }, { users }) => { + index(users).on(["email"], true).on(["strategy"]).on(["strategy_value"]); } - } - } - - const indices = [ - new EntityIndex(users, [users.field("email")!], true), - new EntityIndex(users, [users.field("strategy")!]), - new EntityIndex(users, [users.field("strategy_value")!]) - ]; - indices.forEach((index) => { - if (!this.em.hasIndex(index)) { - this.em.addIndex(index); - } - }); + ) + ); try { const roles = Object.keys(this.config.roles ?? {}); const field = make("role", enumm({ enum: roles })); - this.em.entity(users.name).__experimental_replaceField("role", field); + users.__experimental_replaceField("role", field); } catch (e) {} try { const strategies = Object.keys(this.config.strategies ?? {}); const field = make("strategy", enumm({ enum: strategies })); - this.em.entity(users.name).__experimental_replaceField("strategy", field); + users.__experimental_replaceField("strategy", field); } catch (e) {} } diff --git a/app/src/data/prototype/index.ts b/app/src/data/prototype/index.ts index e9e868f..6a05f72 100644 --- a/app/src/data/prototype/index.ts +++ b/app/src/data/prototype/index.ts @@ -272,18 +272,22 @@ class EntityManagerPrototype> extends En } } -type Chained any, Rt = ReturnType> = ( - e: E -) => { - [K in keyof Rt]: Rt[K] extends (...args: any[]) => any - ? (...args: Parameters) => Rt +type Chained any>> = { + [K in keyof R]: R[K] extends (...args: any[]) => any + ? (...args: Parameters) => Chained : never; }; +type ChainedFn< + Fn extends (...args: any[]) => Record any>, + Return extends ReturnType = ReturnType +> = (e: Entity) => { + [K in keyof Return]: (...args: Parameters) => Chained; +}; export function em>( entities: Entities, schema?: ( - fns: { relation: Chained; index: Chained }, + fns: { relation: ChainedFn; index: ChainedFn }, entities: Entities ) => void ) { diff --git a/app/src/media/AppMedia.ts b/app/src/media/AppMedia.ts index 789dae9..97f0a9b 100644 --- a/app/src/media/AppMedia.ts +++ b/app/src/media/AppMedia.ts @@ -1,8 +1,17 @@ import type { PrimaryFieldType } from "core"; -import { EntityIndex, type EntityManager } from "data"; +import { type Entity, EntityIndex, type EntityManager } from "data"; import { type FileUploadedEventData, Storage, type StorageAdapter } from "media"; import { Module } from "modules/Module"; -import { type FieldSchema, boolean, datetime, entity, json, number, text } from "../data/prototype"; +import { + type FieldSchema, + boolean, + datetime, + em, + entity, + json, + number, + text +} from "../data/prototype"; import { MediaController } from "./api/MediaController"; import { ADAPTERS, buildMediaSchema, type mediaConfigSchema, registry } from "./media-schema"; @@ -17,6 +26,7 @@ export class AppMedia extends Module { private _storage?: Storage; override async build() { + console.log("building"); if (!this.config.enabled) { this.setBuilt(); return; @@ -38,18 +48,13 @@ export class AppMedia extends Module { this.setupListeners(); this.ctx.server.route(this.basepath, new MediaController(this).getController()); - // @todo: add check for media entity - const mediaEntity = this.getMediaEntity(); - if (!this.ctx.em.hasEntity(mediaEntity)) { - this.ctx.em.addEntity(mediaEntity); - } - - const pathIndex = new EntityIndex(mediaEntity, [mediaEntity.field("path")!], true); - if (!this.ctx.em.hasIndex(pathIndex)) { - this.ctx.em.addIndex(pathIndex); - } - - // @todo: check indices + const mediaEntity = this.getMediaEntity(true); + const name = mediaEntity.name as "media"; + this.ensureSchema( + em({ [name]: mediaEntity }, ({ index }, { media }) => { + index(media).on(["path"], true).on(["reference"]); + }) + ); } catch (e) { console.error(e); throw new Error( @@ -94,13 +99,13 @@ export class AppMedia extends Module { metadata: json() }; - getMediaEntity() { + getMediaEntity(forceCreate?: boolean): Entity<"media", typeof AppMedia.mediaFields> { const entity_name = this.config.entity_name; - if (!this.em.hasEntity(entity_name)) { - return entity(entity_name, AppMedia.mediaFields, undefined, "system"); + if (forceCreate || !this.em.hasEntity(entity_name)) { + return entity(entity_name as "media", AppMedia.mediaFields, undefined, "system"); } - return this.em.entity(entity_name); + return this.em.entity(entity_name) as any; } get em(): EntityManager { diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index e9e2933..e304c4a 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -3,7 +3,7 @@ import type { Guard } from "auth"; import { SchemaObject } from "core"; import type { EventManager } from "core/events"; import type { Static, TSchema } from "core/utils"; -import type { Connection, EntityManager } from "data"; +import type { Connection, Entity, EntityIndex, EntityManager, em as prototypeEm } from "data"; import type { Hono } from "hono"; export type ServerEnv = { @@ -21,6 +21,7 @@ export type ModuleBuildContext = { em: EntityManager; emgr: EventManager; guard: Guard; + flags: (typeof Module)["ctx_flags"]; }; export abstract class Module> { @@ -43,6 +44,13 @@ export abstract class Module { return to; } @@ -129,4 +137,41 @@ export abstract class Module> { return this.config; } + + // @todo: add a method to signal the requirement of database sync!!! + + protected ensureEntity(entity: Entity) { + // check fields + if (!this.ctx.em.hasEntity(entity.name)) { + this.ctx.em.addEntity(entity); + this.ctx.flags.sync_required = true; + return; + } + + const instance = this.ctx.em.entity(entity.name); + + // if exists, check all fields required are there + // @todo: check if the field also equal + for (const field of entity.fields) { + const _field = instance.field(field.name); + if (!_field) { + instance.addField(field); + this.ctx.flags.sync_required = true; + } + } + } + + protected ensureIndex(index: EntityIndex) { + if (!this.ctx.em.hasIndex(index)) { + this.ctx.em.addIndex(index); + this.ctx.flags.sync_required = true; + } + } + + protected ensureSchema>(schema: Schema): Schema { + Object.values(schema.entities ?? {}).forEach(this.ensureEntity.bind(this)); + schema.indices?.forEach(this.ensureIndex.bind(this)); + + return schema; + } } diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index 558b3d8..af6da0d 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -1,4 +1,3 @@ -import type { App } from "App"; import { Guard } from "auth"; import { BkndError, DebugLogger } from "core"; import { EventManager } from "core/events"; @@ -34,7 +33,7 @@ import { AppAuth } from "../auth/AppAuth"; import { AppData } from "../data/AppData"; import { AppFlows } from "../flows/AppFlows"; import { AppMedia } from "../media/AppMedia"; -import type { Module, ModuleBuildContext, ServerEnv } from "./Module"; +import { Module, type ModuleBuildContext, type ServerEnv } from "./Module"; export type { ModuleBuildContext }; @@ -230,7 +229,8 @@ export class ModuleManager { server: this.server, em: this.em, emgr: this.emgr, - guard: this.guard + guard: this.guard, + flags: Module.ctx_flags }; } @@ -415,7 +415,14 @@ export class ModuleManager { } this._built = true; - this.logger.log("modules built"); + this.logger.log("modules built", ctx.flags); + + if (ctx.flags.sync_required) { + this.logger.log("db sync requested"); + await ctx.em.schema().sync({ force: true }); + await this.save(); + ctx.flags.sync_required = false; // reset + } } async build() { diff --git a/app/vite.dev.ts b/app/vite.dev.ts index b48e450..6050997 100644 --- a/app/vite.dev.ts +++ b/app/vite.dev.ts @@ -1,4 +1,10 @@ -import { serve } from "./src/adapter/vite"; +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); const credentials = { url: import.meta.env.VITE_DB_URL!, @@ -8,10 +14,22 @@ if (!credentials.url) { throw new Error("Missing VITE_DB_URL env variable. Add it to .env file"); } -export default serve({ - connection: { - type: "libsql", - config: credentials - }, - forceDev: true -}); +const connection = new LibsqlConnection(createClient(credentials)); + +export default { + async fetch(request: Request) { + const app = App.create({ connection }); + + app.emgr.onEvent( + App.Events.AppBuiltEvent, + async () => { + app.registerAdminController({ forceDev: true }); + app.module.server.client.get("/assets/*", serveStatic({ root: "./" })); + }, + "sync" + ); + await app.build(); + + return app.fetch(request); + } +}; From e94e8d8bd1cb174b1ddcf261357821d7a851af82 Mon Sep 17 00:00:00 2001 From: dswbx Date: Fri, 10 Jan 2025 15:51:47 +0100 Subject: [PATCH 16/30] Refactor entity handling to preserve config while overriding type Reworked `ensureEntity` to replace entities while maintaining their configuration and allowing type adjustments. Updated tests to verify type persistence and synchronization of entity properties. --- app/__test__/modules/AppAuth.spec.ts | 15 ++++------- app/__test__/modules/AppMedia.spec.ts | 8 +++--- app/__test__/modules/Module.spec.ts | 31 ++++++++++++++++------- app/__test__/modules/module-test-suite.ts | 3 ++- app/package.json | 2 +- app/src/auth/AppAuth.ts | 12 ++++----- app/src/data/entities/Entity.ts | 2 +- app/src/data/entities/EntityManager.ts | 10 ++++++++ app/src/media/AppMedia.ts | 5 ++-- app/src/modules/Module.ts | 16 +++++++----- 10 files changed, 63 insertions(+), 41 deletions(-) diff --git a/app/__test__/modules/AppAuth.spec.ts b/app/__test__/modules/AppAuth.spec.ts index 849d8dd..11b1d03 100644 --- a/app/__test__/modules/AppAuth.spec.ts +++ b/app/__test__/modules/AppAuth.spec.ts @@ -121,15 +121,10 @@ describe("AppAuth", () => { await app.build(); - const userfields = app.modules.em.entity("users").fields.map((f) => f.name); - expect(userfields).toContain("additional"); - expect(userfields).toEqual([ - "id", - "additional", - "email", - "strategy", - "strategy_value", - "role" - ]); + const e = app.modules.em.entity("users"); + const fields = e.fields.map((f) => f.name); + expect(e.type).toBe("system"); + expect(fields).toContain("additional"); + expect(fields).toEqual(["id", "email", "strategy", "strategy_value", "role", "additional"]); }); }); diff --git a/app/__test__/modules/AppMedia.spec.ts b/app/__test__/modules/AppMedia.spec.ts index c1fc2f9..19fa73b 100644 --- a/app/__test__/modules/AppMedia.spec.ts +++ b/app/__test__/modules/AppMedia.spec.ts @@ -33,11 +33,12 @@ describe("AppMedia", () => { await app.build(); - const fields = app.modules.em.entity("media").fields.map((f) => f.name); + const e = app.modules.em.entity("media"); + const fields = e.fields.map((f) => f.name); + expect(e.type).toBe("system"); expect(fields).toContain("additional"); expect(fields).toEqual([ "id", - "additional", "path", "folder", "mime_type", @@ -47,7 +48,8 @@ describe("AppMedia", () => { "modified_at", "reference", "entity_id", - "metadata" + "metadata", + "additional" ]); }); }); diff --git a/app/__test__/modules/Module.spec.ts b/app/__test__/modules/Module.spec.ts index b53dcfa..572c5a1 100644 --- a/app/__test__/modules/Module.spec.ts +++ b/app/__test__/modules/Module.spec.ts @@ -68,7 +68,8 @@ describe("Module", async () => { return { entities: _em.entities.map((e) => ({ name: e.name, - fields: e.fields.map((f) => f.name) + fields: e.fields.map((f) => f.name), + type: e.type })), indices: _em.indices.map((i) => ({ name: i.name, @@ -105,7 +106,8 @@ describe("Module", async () => { entities: [ { name: "u", - fields: ["id", "name"] + fields: ["id", "name"], + type: "regular" } ], indices: [] @@ -124,7 +126,8 @@ describe("Module", async () => { entities: [ { name: "u", - fields: ["id", "name"] + fields: ["id", "name"], + type: "regular" } ], indices: [] @@ -139,9 +142,14 @@ describe("Module", async () => { // this should only add the field "important" m.prt.ensureEntity( - entity("u", { - important: text() - }) + entity( + "u", + { + important: text() + }, + undefined, + "system" + ) ); expect(m.ctx.flags.sync_required).toBe(true); @@ -149,11 +157,15 @@ describe("Module", async () => { entities: [ { name: "u", - fields: ["id", "name", "important"] + // ensured properties must come first + fields: ["id", "important", "name"], + // ensured type must be present + type: "system" }, { name: "p", - fields: ["id", "title"] + fields: ["id", "title"], + type: "regular" } ], indices: [] @@ -177,7 +189,8 @@ describe("Module", async () => { entities: [ { name: "u", - fields: ["id", "name", "title"] + fields: ["id", "name", "title"], + type: "regular" } ], indices: [ diff --git a/app/__test__/modules/module-test-suite.ts b/app/__test__/modules/module-test-suite.ts index 5c1cce7..cf4926a 100644 --- a/app/__test__/modules/module-test-suite.ts +++ b/app/__test__/modules/module-test-suite.ts @@ -5,7 +5,7 @@ import { Guard } from "../../src/auth"; import { EventManager } from "../../src/core/events"; import { Default, stripMark } from "../../src/core/utils"; import { EntityManager } from "../../src/data"; -import type { Module, ModuleBuildContext } from "../../src/modules/Module"; +import { Module, type ModuleBuildContext } from "../../src/modules/Module"; import { getDummyConnection } from "../helper"; export function makeCtx(overrides?: Partial): ModuleBuildContext { @@ -16,6 +16,7 @@ export function makeCtx(overrides?: Partial): ModuleBuildCon em: new EntityManager([], dummyConnection), emgr: new EventManager(), guard: new Guard(), + flags: Module.ctx_flags, ...overrides }; } diff --git a/app/package.json b/app/package.json index da85eac..1bb93d4 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "type": "module", "sideEffects": false, "bin": "./dist/cli/index.js", - "version": "0.4.0", + "version": "0.5.0-rc5", "scripts": { "build:all": "NODE_ENV=production bun run build.ts --minify --types --clean && bun run build:cli", "dev": "vite", diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index 8899495..a0105a6 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -250,13 +250,11 @@ export class AppAuth extends Module { }; registerEntities() { - const name = this.config.entity_name as "users"; - const { - entities: { users } - } = this.ensureSchema( + const users = this.getUsersEntity(true); + this.ensureSchema( em( { - [name]: entity(name, AppAuth.usersFields) + [users.name as "users"]: users }, ({ index }, { users }) => { index(users).on(["email"], true).on(["strategy"]).on(["strategy_value"]); @@ -267,13 +265,13 @@ export class AppAuth extends Module { try { const roles = Object.keys(this.config.roles ?? {}); const field = make("role", enumm({ enum: roles })); - users.__experimental_replaceField("role", field); + users.__replaceField("role", field); } catch (e) {} try { const strategies = Object.keys(this.config.strategies ?? {}); const field = make("strategy", enumm({ enum: strategies })); - users.__experimental_replaceField("strategy", field); + users.__replaceField("strategy", field); } catch (e) {} } diff --git a/app/src/data/entities/Entity.ts b/app/src/data/entities/Entity.ts index aa3d75c..a87d609 100644 --- a/app/src/data/entities/Entity.ts +++ b/app/src/data/entities/Entity.ts @@ -140,7 +140,7 @@ export class Entity< return this.fields.find((field) => field.name === name); } - __experimental_replaceField(name: string, field: Field) { + __replaceField(name: string, field: Field) { const index = this.fields.findIndex((f) => f.name === name); if (index === -1) { throw new Error(`Field "${name}" not found on entity "${this.name}"`); diff --git a/app/src/data/entities/EntityManager.ts b/app/src/data/entities/EntityManager.ts index fea93aa..1e2030e 100644 --- a/app/src/data/entities/EntityManager.ts +++ b/app/src/data/entities/EntityManager.ts @@ -99,6 +99,16 @@ export class EntityManager { this.entities.push(entity); } + __replaceEntity(entity: Entity, name: string | undefined = entity.name) { + const entityIndex = this._entities.findIndex((e) => e.name === name); + + if (entityIndex === -1) { + throw new Error(`Entity "${name}" not found and cannot be replaced`); + } + + this._entities[entityIndex] = entity; + } + entity(e: Entity | keyof TBD | string): Entity { let entity: Entity | undefined; if (typeof e === "string") { diff --git a/app/src/media/AppMedia.ts b/app/src/media/AppMedia.ts index 97f0a9b..fc9ba42 100644 --- a/app/src/media/AppMedia.ts +++ b/app/src/media/AppMedia.ts @@ -48,10 +48,9 @@ export class AppMedia extends Module { this.setupListeners(); this.ctx.server.route(this.basepath, new MediaController(this).getController()); - const mediaEntity = this.getMediaEntity(true); - const name = mediaEntity.name as "media"; + const media = this.getMediaEntity(true); this.ensureSchema( - em({ [name]: mediaEntity }, ({ index }, { media }) => { + em({ [media.name as "media"]: media }, ({ index }, { media }) => { index(media).on(["path"], true).on(["reference"]); }) ); diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index e304c4a..2a4dad0 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -3,7 +3,8 @@ import type { Guard } from "auth"; import { SchemaObject } from "core"; import type { EventManager } from "core/events"; import type { Static, TSchema } from "core/utils"; -import type { Connection, Entity, EntityIndex, EntityManager, em as prototypeEm } from "data"; +import type { Connection, EntityIndex, EntityManager, em as prototypeEm } from "data"; +import { Entity } from "data"; import type { Hono } from "hono"; export type ServerEnv = { @@ -138,8 +139,6 @@ export abstract class Module Date: Fri, 10 Jan 2025 17:28:43 +0100 Subject: [PATCH 17/30] Fix entity referencing issue during post-seeded relational fetch --- .gitignore | 1 + app/package.json | 2 +- app/src/core/errors.ts | 10 ++++++-- app/src/data/entities/EntityManager.ts | 12 +++++----- app/src/data/entities/query/Repository.ts | 7 ++++-- app/src/data/helper.ts | 22 +++++++++++++++++- app/src/media/AppMedia.ts | 1 - app/src/modules/Module.ts | 4 +++- app/src/modules/ModuleManager.ts | 27 ++++++++++++++++------ app/src/ui/components/table/DataTable.tsx | 10 ++++++-- app/vite.dev.ts | 28 ++++++++++++++++++----- 11 files changed, 95 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 2232350..fe4c90f 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ packages/media/.env **/*/vite.config.ts.timestamp* .history **/*/.db/* +**/*/.configs/* **/*/*.db **/*/*.db-shm **/*/*.db-wal diff --git a/app/package.json b/app/package.json index 1bb93d4..c4674bc 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "type": "module", "sideEffects": false, "bin": "./dist/cli/index.js", - "version": "0.5.0-rc5", + "version": "0.5.0-rc6", "scripts": { "build:all": "NODE_ENV=production bun run build.ts --minify --types --clean && bun run build:cli", "dev": "vite", diff --git a/app/src/core/errors.ts b/app/src/core/errors.ts index 860bd9d..d9a1cdc 100644 --- a/app/src/core/errors.ts +++ b/app/src/core/errors.ts @@ -1,6 +1,7 @@ export class Exception extends Error { code = 400; override name = "Exception"; + protected _context = undefined; constructor(message: string, code?: number) { super(message); @@ -9,11 +10,16 @@ export class Exception extends Error { } } + context(context: any) { + this._context = context; + return this; + } + toJSON() { return { error: this.message, - type: this.name - //message: this.message + type: this.name, + context: this._context }; } } diff --git a/app/src/data/entities/EntityManager.ts b/app/src/data/entities/EntityManager.ts index 1e2030e..f8dfd7b 100644 --- a/app/src/data/entities/EntityManager.ts +++ b/app/src/data/entities/EntityManager.ts @@ -107,15 +107,15 @@ export class EntityManager { } this._entities[entityIndex] = entity; + + // caused issues because this.entity() was using a reference (for when initial config was given) } entity(e: Entity | keyof TBD | string): Entity { - let entity: Entity | undefined; - if (typeof e === "string") { - entity = this.entities.find((entity) => entity.name === e); - } else if (e instanceof Entity) { - entity = e; - } + // make sure to always retrieve by name + const entity = this.entities.find((entity) => + e instanceof Entity ? entity.name === e.name : entity.name === e + ); if (!entity) { // @ts-ignore diff --git a/app/src/data/entities/query/Repository.ts b/app/src/data/entities/query/Repository.ts index 171fc3b..a6dc576 100644 --- a/app/src/data/entities/query/Repository.ts +++ b/app/src/data/entities/query/Repository.ts @@ -58,7 +58,7 @@ export class Repository 0) { throw new InvalidSearchParamsException( `Invalid select field(s): ${invalid.join(", ")}` - ); + ).context({ + entity: entity.name, + valid: validated.select + }); } validated.select = options.select; diff --git a/app/src/data/helper.ts b/app/src/data/helper.ts index 74497b0..e465247 100644 --- a/app/src/data/helper.ts +++ b/app/src/data/helper.ts @@ -1,4 +1,4 @@ -import type { EntityData, Field } from "data"; +import type { EntityData, EntityManager, Field } from "data"; import { transform } from "lodash-es"; export function getDefaultValues(fields: Field[], data: EntityData): EntityData { @@ -48,3 +48,23 @@ export function getChangeSet( {} as typeof formData ); } + +export function readableEmJson(_em: EntityManager) { + return { + entities: _em.entities.map((e) => ({ + name: e.name, + fields: e.fields.map((f) => f.name), + type: e.type + })), + indices: _em.indices.map((i) => ({ + name: i.name, + entity: i.entity.name, + fields: i.fields.map((f) => f.name), + unique: i.unique + })), + relations: _em.relations.all.map((r) => ({ + name: r.getName(), + ...r.toJSON() + })) + }; +} diff --git a/app/src/media/AppMedia.ts b/app/src/media/AppMedia.ts index fc9ba42..c759479 100644 --- a/app/src/media/AppMedia.ts +++ b/app/src/media/AppMedia.ts @@ -26,7 +26,6 @@ export class AppMedia extends Module { private _storage?: Storage; override async build() { - console.log("building"); if (!this.config.enabled) { this.setBuilt(); return; diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index 2a4dad0..21bc5d2 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -46,10 +46,12 @@ export abstract class Module { diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index af6da0d..d5840c2 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -400,8 +400,8 @@ export class ModuleManager { }); } - private async buildModules(options?: { graceful?: boolean }) { - this.logger.log("buildModules() triggered", options?.graceful, this._built); + private async buildModules(options?: { graceful?: boolean; ignoreFlags?: boolean }) { + this.logger.log("buildModules() triggered", options, this._built); if (options?.graceful && this._built) { this.logger.log("skipping build (graceful)"); return; @@ -417,12 +417,25 @@ export class ModuleManager { this._built = true; this.logger.log("modules built", ctx.flags); - if (ctx.flags.sync_required) { - this.logger.log("db sync requested"); - await ctx.em.schema().sync({ force: true }); - await this.save(); - ctx.flags.sync_required = false; // reset + if (options?.ignoreFlags !== true) { + if (ctx.flags.sync_required) { + ctx.flags.sync_required = false; + this.logger.log("db sync requested"); + + // sync db + await ctx.em.schema().sync({ force: true }); + await this.save(); + } + + if (ctx.flags.ctx_reload_required) { + ctx.flags.ctx_reload_required = false; + this.logger.log("ctx reload requested"); + this.ctx(true); + } } + + // reset all falgs + ctx.flags = Module.ctx_flags; } async build() { diff --git a/app/src/ui/components/table/DataTable.tsx b/app/src/ui/components/table/DataTable.tsx index 8aa664f..01e40bf 100644 --- a/app/src/ui/components/table/DataTable.tsx +++ b/app/src/ui/components/table/DataTable.tsx @@ -125,12 +125,18 @@ export function DataTable = Record ) : null} - {!data || data.length === 0 ? ( + {!data || !Array.isArray(data) || data.length === 0 ? (

- {Array.isArray(data) ? "No data to show" : "Loading..."} + {Array.isArray(data) ? ( + "No data to show" + ) : !data ? ( + "Loading..." + ) : ( +
{JSON.stringify(data, null, 2)}
+ )}
diff --git a/app/vite.dev.ts b/app/vite.dev.ts index 6050997..16e73cd 100644 --- a/app/vite.dev.ts +++ b/app/vite.dev.ts @@ -1,3 +1,4 @@ +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"; @@ -6,20 +7,35 @@ import { StorageLocalAdapter } from "./src/media/storage/adapters/StorageLocalAd registries.media.register("local", StorageLocalAdapter); -const credentials = { - url: import.meta.env.VITE_DB_URL!, - authToken: import.meta.env.VITE_DB_TOKEN! -}; +const run_example: string | boolean = false; +//run_example = "ex-admin-rich"; + +const credentials = run_example + ? { + url: `file:.configs/${run_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)); +let initialConfig: any = undefined; +if (run_example) { + const { version, ...config } = JSON.parse( + await readFile(`.configs/${run_example}.json`, "utf-8") + ); + initialConfig = config; +} + export default { async fetch(request: Request) { - const app = App.create({ connection }); - + const app = App.create({ connection, initialConfig }); app.emgr.onEvent( App.Events.AppBuiltEvent, async () => { From c7d983942f2e70bc9a67ef87d8cb102e5ea8b9df Mon Sep 17 00:00:00 2001 From: dswbx Date: Fri, 10 Jan 2025 18:04:40 +0100 Subject: [PATCH 18/30] Add loading indicator for admin asset initialization Introduced a "loading" div to indicate when admin assets are being fetched. Updated rendering logic and styles in related components to account for this state. Prepared groundwork for potential view transitions. --- app/src/modules/server/AdminController.tsx | 23 ++++++++++++-- app/src/ui/Admin.tsx | 2 +- app/src/ui/components/wouter/Link.tsx | 26 +++++++++++----- app/src/ui/lib/routes.ts | 36 ++++++++++++++++------ app/src/ui/main.tsx | 5 ++- 5 files changed, 71 insertions(+), 21 deletions(-) diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index e7e60fe..be75698 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -140,11 +140,13 @@ export class AdminController extends Controller { } } + const theme = configs.server.admin.color_scheme ?? "light"; + return ( {/* dnd complains otherwise */} {html``} - + )} - +
-
+
+
+ Initializing... +
+