diff --git a/app/src/App.ts b/app/src/App.ts index d716c1a..ab4b87a 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -66,17 +66,17 @@ export class App { // respond to events, such as "onUpdated". // this is important if multiple changes are done, and then build() is called manually if (!this.emgr.enabled) { - console.warn("[APP] config updated, but event manager is disabled, skip."); + console.warn("App config updated, but event manager is disabled, skip."); return; } - console.log("[APP] config updated", key); + console.log("App config updated", key); // @todo: potentially double syncing await this.build({ sync: true }); await this.emgr.emit(new AppConfigUpdatedEvent({ app: this })); }, onFirstBoot: async () => { - console.log("[APP] first boot"); + console.log("App first boot"); this.trigger_first_boot = true; }, onServerInit: async (server) => { @@ -185,7 +185,7 @@ export function createApp(config: CreateAppConfig = {}) { } else if (typeof config.connection === "object") { if ("type" in config.connection) { console.warn( - "[WARN] Using deprecated connection type 'libsql', use the 'config' object directly." + "Using deprecated connection type 'libsql', use the 'config' object directly." ); connection = new LibsqlConnection(config.connection.config); } else { @@ -193,7 +193,7 @@ export function createApp(config: CreateAppConfig = {}) { } } else { connection = new LibsqlConnection({ url: ":memory:" }); - console.warn("[!] No connection provided, using in-memory database"); + console.warn("No connection provided, using in-memory database"); } } catch (e) { console.error("Could not create connection", e); diff --git a/app/src/cli/commands/run/platform.ts b/app/src/cli/commands/run/platform.ts index 86758dc..eda86e4 100644 --- a/app/src/cli/commands/run/platform.ts +++ b/app/src/cli/commands/run/platform.ts @@ -32,7 +32,7 @@ export async function attachServeStatic(app: any, platform: Platform) { export async function startServer(server: Platform, app: any, options: { port: number }) { const port = options.port; - console.log(`(using ${server} serve)`); + console.log(`Using ${server} serve`); switch (server) { case "node": { @@ -54,7 +54,7 @@ export async function startServer(server: Platform, app: any, options: { port: n } const url = `http://localhost:${port}`; - console.log(`Server listening on ${url}`); + console.info("Server listening on", url); await open(url); } diff --git a/app/src/cli/commands/run/run.ts b/app/src/cli/commands/run/run.ts index a34a65c..2f078ad 100644 --- a/app/src/cli/commands/run/run.ts +++ b/app/src/cli/commands/run/run.ts @@ -2,10 +2,12 @@ import type { Config } from "@libsql/client/node"; import { App, type CreateAppConfig } from "App"; import { StorageLocalAdapter } from "adapter/node"; import type { CliBkndConfig, CliCommand } from "cli/types"; +import { replaceConsole } from "cli/utils/cli"; import { Option } from "commander"; import { config } from "core"; import dotenv from "dotenv"; import { registries } from "modules/registries"; +import c from "picocolors"; import { PLATFORMS, type Platform, @@ -27,6 +29,13 @@ export const run: CliCommand = (program) => { .default(config.server.default_port) .argParser((v) => Number.parseInt(v)) ) + .addOption( + new Option("-m, --memory", "use in-memory database").conflicts([ + "config", + "db-url", + "db-token" + ]) + ) .addOption(new Option("-c, --config ", "config file")) .addOption( new Option("--db-url ", "database url, can be any valid libsql url").conflicts( @@ -97,33 +106,44 @@ export async function makeConfigApp(config: CliBkndConfig, platform?: Platform) async function action(options: { port: number; + memory?: boolean; config?: string; dbUrl?: string; dbToken?: string; server: Platform; }) { + replaceConsole(); const configFilePath = await getConfigPath(options.config); let app: App | undefined = undefined; if (options.dbUrl) { + console.info("Using connection from", c.cyan("--db-url")); const connection = options.dbUrl ? { url: options.dbUrl, authToken: options.dbToken } : undefined; app = await makeApp({ connection, server: { platform: options.server } }); } else if (configFilePath) { - console.log("[INFO] Using config from:", configFilePath); + console.info("Using config from", c.cyan(configFilePath)); const config = (await import(configFilePath).then((m) => m.default)) as CliBkndConfig; app = await makeConfigApp(config, options.server); + } else if (options.memory) { + console.info("Using", c.cyan("in-memory"), "connection"); + app = await makeApp({ server: { platform: options.server } }); } else { const credentials = getConnectionCredentialsFromEnv(); if (credentials) { - console.log("[INFO] Using connection from environment"); + console.info("Using connection from env", c.cyan(credentials.url)); app = await makeConfigApp({ app: { connection: credentials } }, options.server); } } if (!app) { - app = await makeApp({ server: { platform: options.server } }); + const connection = { url: "file:data.db" } as Config; + console.info("Using connection", c.cyan(connection.url)); + app = await makeApp({ + connection, + server: { platform: options.server } + }); } await startServer(options.server, app, { port: options.port }); diff --git a/app/src/cli/utils/cli.ts b/app/src/cli/utils/cli.ts index 5b0d8e7..6e3a284 100644 --- a/app/src/cli/utils/cli.ts +++ b/app/src/cli/utils/cli.ts @@ -1,3 +1,6 @@ +import { isDebug } from "core"; +import c from "picocolors"; +import type { Formatter } from "picocolors/types"; const _SPEEDUP = process.env.LOCAL; const DEFAULT_WAIT = _SPEEDUP ? 0 : 250; @@ -54,3 +57,31 @@ export async function* typewriter( } } } + +function ifString(args: any[], c: Formatter) { + return args.map((a) => (typeof a === "string" ? c(a) : a)); +} + +const originalConsole = { + log: console.log, + info: console.info, + debug: console.debug, + warn: console.warn, + error: console.error +}; + +export const $console = { + log: (...args: any[]) => originalConsole.info(c.gray("[LOG] "), ...ifString(args, c.dim)), + info: (...args: any[]) => originalConsole.info(c.cyan("[INFO] "), ...args), + debug: (...args: any[]) => isDebug() && originalConsole.info(c.yellow("[DEBUG]"), ...args), + warn: (...args: any[]) => originalConsole.info(c.yellow("[WARN] "), ...ifString(args, c.yellow)), + error: (...args: any[]) => originalConsole.info(c.red("[ERROR]"), ...ifString(args, c.red)) +}; + +export function replaceConsole() { + console.log = $console.log; + console.info = $console.info; + console.debug = $console.debug; + console.warn = $console.warn; + console.error = $console.error; +} diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index ff27a75..d567fd2 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -181,7 +181,7 @@ export class DataController extends Controller { //console.log("request", c.req.raw); const { entity, context } = c.req.param(); if (!this.entityExists(entity)) { - console.log("not found", entity, definedEntities); + console.warn("not found:", entity, definedEntities); return c.notFound(); } const _entity = this.em.entity(entity); @@ -208,7 +208,7 @@ export class DataController extends Controller { //console.log("request", c.req.raw); const { entity } = c.req.param(); if (!this.entityExists(entity)) { - console.log("not found", entity, definedEntities); + console.warn("not found:", entity, definedEntities); return c.notFound(); } const options = c.req.valid("query") as RepoQuery;