diff --git a/.changeset/giant-mails-tap.md b/.changeset/giant-mails-tap.md new file mode 100644 index 000000000..5ad0560bf --- /dev/null +++ b/.changeset/giant-mails-tap.md @@ -0,0 +1,6 @@ +--- +"blitz": patch +"@blitzjs/next": patch +--- + +Add BlitzLogger plugin and allow customizing logging diff --git a/apps/toolkit-app-passportjs/app/blitz-server.ts b/apps/toolkit-app-passportjs/app/blitz-server.ts index 37f87cd20..2ae3e854d 100644 --- a/apps/toolkit-app-passportjs/app/blitz-server.ts +++ b/apps/toolkit-app-passportjs/app/blitz-server.ts @@ -2,6 +2,7 @@ import { setupBlitzServer } from "@blitzjs/next" import { AuthServerPlugin, PrismaStorage } from "@blitzjs/auth" import db from "db" import { simpleRolesIsAuthorized } from "@blitzjs/auth" +import { BlitzLogger } from "blitz" const { gSSP, gSP, api } = setupBlitzServer({ plugins: [ @@ -11,6 +12,7 @@ const { gSSP, gSP, api } = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({}), }) export { gSSP, gSP, api } diff --git a/apps/toolkit-app/app/blitz-server.ts b/apps/toolkit-app/app/blitz-server.ts index b911a664b..63925562e 100644 --- a/apps/toolkit-app/app/blitz-server.ts +++ b/apps/toolkit-app/app/blitz-server.ts @@ -3,6 +3,7 @@ import { setupBlitzServer } from "@blitzjs/next" import { AuthServerPlugin, PrismaStorage } from "@blitzjs/auth" import db from "db" import { simpleRolesIsAuthorized } from "@blitzjs/auth" +import { BlitzLogger } from "blitz" const { gSSP, gSP, api } = setupBlitzServer({ plugins: [ @@ -12,6 +13,7 @@ const { gSSP, gSP, api } = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({}), }) export { gSSP, gSP, api } diff --git a/apps/toolkit-app/pages/index.tsx b/apps/toolkit-app/pages/index.tsx index 00c2dddf0..021f0fb4e 100644 --- a/apps/toolkit-app/pages/index.tsx +++ b/apps/toolkit-app/pages/index.tsx @@ -7,6 +7,7 @@ import logout from "app/auth/mutations/logout" import logo from "public/logo.png" import { useMutation } from "@blitzjs/rpc" import { Routes, BlitzPage } from "@blitzjs/next" +import { getSession, useSession } from "@blitzjs/auth" /* * This file is just for a pleasant getting started page for your new app. @@ -271,6 +272,4 @@ const Home: BlitzPage = () => { ) } -Home.authenticate = true - export default Home diff --git a/apps/web/app/blitz-server.ts b/apps/web/app/blitz-server.ts index 960e50160..d26e2e7b0 100644 --- a/apps/web/app/blitz-server.ts +++ b/apps/web/app/blitz-server.ts @@ -1,7 +1,8 @@ import {setupBlitzServer} from "@blitzjs/next" import {AuthServerPlugin, PrismaStorage} from "@blitzjs/auth" -import db from "db" import {simpleRolesIsAuthorized} from "@blitzjs/auth" +import {BlitzLogger} from "blitz" +import db from "db" const {gSSP, gSP, api} = setupBlitzServer({ plugins: [ @@ -11,6 +12,10 @@ const {gSSP, gSP, api} = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({ + colorizePrettyLogs: true, + prefix: ["[blitz]>>>>>"], + }), }) export {gSSP, gSP, api} diff --git a/integration-tests/auth/app/blitz-server.ts b/integration-tests/auth/app/blitz-server.ts index 7e18245aa..fae209335 100644 --- a/integration-tests/auth/app/blitz-server.ts +++ b/integration-tests/auth/app/blitz-server.ts @@ -2,6 +2,7 @@ import {setupBlitzServer} from "@blitzjs/next" import {AuthServerPlugin, PrismaStorage} from "@blitzjs/auth" import {simpleRolesIsAuthorized} from "@blitzjs/auth" import db from "../db/index" +import {BlitzLogger} from "blitz" const {gSSP, gSP, api} = setupBlitzServer({ plugins: [ @@ -11,6 +12,7 @@ const {gSSP, gSP, api} = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({}), }) export {gSSP, gSP, api} diff --git a/integration-tests/get-initial-props/app/blitz-server.ts b/integration-tests/get-initial-props/app/blitz-server.ts index bc44d6957..2115f0137 100644 --- a/integration-tests/get-initial-props/app/blitz-server.ts +++ b/integration-tests/get-initial-props/app/blitz-server.ts @@ -2,6 +2,7 @@ import {setupBlitzServer} from "@blitzjs/next" import {AuthServerPlugin, PrismaStorage} from "@blitzjs/auth" import {simpleRolesIsAuthorized} from "@blitzjs/auth" import db from "../db" +import {BlitzLogger} from "blitz" const {gSSP, gSP, api} = setupBlitzServer({ plugins: [ @@ -11,6 +12,7 @@ const {gSSP, gSP, api} = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({}), }) export {gSSP, gSP, api} diff --git a/integration-tests/middleware/app/blitz-server.ts b/integration-tests/middleware/app/blitz-server.ts index 50f78167d..0090f2b56 100644 --- a/integration-tests/middleware/app/blitz-server.ts +++ b/integration-tests/middleware/app/blitz-server.ts @@ -1,7 +1,9 @@ import {setupBlitzServer} from "@blitzjs/next" +import {BlitzLogger} from "blitz" const {gSSP, gSP, api} = setupBlitzServer({ plugins: [], + logger: BlitzLogger({}), }) export {gSSP, gSP, api} diff --git a/integration-tests/no-suspense/app/blitz-server.ts b/integration-tests/no-suspense/app/blitz-server.ts index fee97c3cd..05817b751 100644 --- a/integration-tests/no-suspense/app/blitz-server.ts +++ b/integration-tests/no-suspense/app/blitz-server.ts @@ -2,6 +2,7 @@ import {setupBlitzServer} from "@blitzjs/next" import {AuthServerPlugin, PrismaStorage} from "@blitzjs/auth" import {simpleRolesIsAuthorized} from "@blitzjs/auth" import db from "../db/index" +import {BlitzLogger} from "blitz" const {gSSP, gSP, api} = setupBlitzServer({ plugins: [ @@ -11,6 +12,7 @@ const {gSSP, gSP, api} = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({}), }) export {gSSP, gSP, api} diff --git a/integration-tests/react-query-utils/app/blitz-server.ts b/integration-tests/react-query-utils/app/blitz-server.ts index 7793a8dc9..379376b86 100644 --- a/integration-tests/react-query-utils/app/blitz-server.ts +++ b/integration-tests/react-query-utils/app/blitz-server.ts @@ -2,6 +2,7 @@ import {setupBlitzServer} from "@blitzjs/next" import {AuthServerPlugin, PrismaStorage} from "@blitzjs/auth" import {simpleRolesIsAuthorized} from "@blitzjs/auth" import db from "../db" +import {BlitzLogger} from "blitz" const {gSSP, gSP, api} = setupBlitzServer({ plugins: [ @@ -11,6 +12,7 @@ const {gSSP, gSP, api} = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({}), }) export {gSSP, gSP, api} diff --git a/integration-tests/trailing-slash/app/blitz-server.ts b/integration-tests/trailing-slash/app/blitz-server.ts index bc44d6957..2115f0137 100644 --- a/integration-tests/trailing-slash/app/blitz-server.ts +++ b/integration-tests/trailing-slash/app/blitz-server.ts @@ -2,6 +2,7 @@ import {setupBlitzServer} from "@blitzjs/next" import {AuthServerPlugin, PrismaStorage} from "@blitzjs/auth" import {simpleRolesIsAuthorized} from "@blitzjs/auth" import db from "../db" +import {BlitzLogger} from "blitz" const {gSSP, gSP, api} = setupBlitzServer({ plugins: [ @@ -11,6 +12,7 @@ const {gSSP, gSP, api} = setupBlitzServer({ isAuthorized: simpleRolesIsAuthorized, }), ], + logger: BlitzLogger({}), }) export {gSSP, gSP, api} diff --git a/packages/blitz-next/src/index-server.ts b/packages/blitz-next/src/index-server.ts index 4b6a4ee89..4233f67d2 100644 --- a/packages/blitz-next/src/index-server.ts +++ b/packages/blitz-next/src/index-server.ts @@ -7,7 +7,7 @@ import type { NextApiRequest, NextApiResponse, } from "next" -import type { +import { AddParameters, AsyncFunc, BlitzServerPlugin, @@ -15,6 +15,8 @@ import type { FirstParam, RequestMiddleware, MiddlewareResponse, + BlitzLogger, + initializeLogger, } from "blitz" import {handleRequestWithMiddleware, startWatcher, stopWatcher} from "blitz" import { @@ -50,6 +52,7 @@ export type NextApiHandler = ( type SetupBlitzOptions = { plugins: BlitzServerPlugin[] onError?: (err: Error) => void + logger: ReturnType } export type Redirect = @@ -127,7 +130,9 @@ const prefetchQueryFactory = ( } } -export const setupBlitzServer = ({plugins, onError}: SetupBlitzOptions) => { +export const setupBlitzServer = ({plugins, onError, logger}: SetupBlitzOptions) => { + initializeLogger(logger) + const middlewares = plugins.flatMap((p) => p.requestMiddlewares) const contextMiddleware = plugins.flatMap((p) => p.contextMiddleware).filter(Boolean) diff --git a/packages/blitz/src/index-server.ts b/packages/blitz/src/index-server.ts index 3ac5730e1..1b22fb6d8 100644 --- a/packages/blitz/src/index-server.ts +++ b/packages/blitz/src/index-server.ts @@ -7,7 +7,7 @@ export * from "./types" export * from "./utils/run-prisma" export * from "./middleware" export * from "./paginate" -export {baseLogger, newLine, log} from "./logging" +export * from "./logging" export {startWatcher, stopWatcher} from "./cli/utils/routes-manifest" export interface MiddlewareResponse extends ServerResponse { diff --git a/packages/blitz/src/logging.ts b/packages/blitz/src/logging.ts index cb85e0884..19e7d7de6 100644 --- a/packages/blitz/src/logging.ts +++ b/packages/blitz/src/logging.ts @@ -1,47 +1,29 @@ -import {ISettingsParam, Logger} from "tslog" +import {ISettingsParam, Logger, TLogLevelName} from "tslog" import c from "chalk" import {Table} from "console-table-printer" import ora from "ora" import readline from "readline" -export type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal" +export type BlitzLoggerSettings = ISettingsParam +export type BlitzLogLevel = TLogLevelName -declare module globalThis { +declare namespace globalThis { let _blitz_baseLogger: Logger - let _blitz_logLevel: LogLevel + let _blitz_logLevel: BlitzLogLevel } -export const newLine = () => { - const logLevel: LogLevel = globalThis._blitz_logLevel - - switch (logLevel) { - case "trace": - case "debug": - case "info": - console.log(" ") - break - case "warn": - case "error": - case "fatal": - default: - //nothing - break - } -} - -export const baseLogger = (options?: ISettingsParam): Logger => { +export const baseLogger = (options: BlitzLoggerSettings = {}): Logger => { if (globalThis._blitz_baseLogger) return globalThis._blitz_baseLogger - let config - try { - config = {} as any // todo: loadConfigAtRuntime() - } catch { - config = {} - } + globalThis._blitz_baseLogger = BlitzLogger(options) - globalThis._blitz_baseLogger = new Logger({ - minLevel: config?.log?.level || "info", - type: config?.log?.type || "pretty", + return globalThis._blitz_baseLogger +} + +export const BlitzLogger = (settings: BlitzLoggerSettings = {}) => { + const baseLogger = new Logger({ + minLevel: "info", + type: "pretty", dateTimePattern: process.env.NODE_ENV === "production" ? "year-month-day hour:minute:second.millisecond" @@ -61,10 +43,14 @@ export const baseLogger = (options?: ISettingsParam): Logger => { }, maskValuesOfKeys: ["password", "passwordConfirmation"], exposeErrorCodeFrame: process.env.NODE_ENV !== "production", - ...options, + ...settings, }) - return globalThis._blitz_baseLogger + return baseLogger +} + +export const initializeLogger = (logger: Logger) => { + globalThis._blitz_baseLogger = logger } export const table = Table @@ -76,6 +62,24 @@ const blitzBrightBrandColor = "8a3df0" // Using bright brand color so it's better for dark terminals const brandColor = blitzBrightBrandColor +export const newLine = () => { + const logLevel: BlitzLogLevel = globalThis._blitz_logLevel + + switch (logLevel) { + case "trace": + case "debug": + case "info": + console.log(" ") + break + case "warn": + case "error": + case "fatal": + default: + //nothing + break + } +} + const withBrand = (str: string) => { return c.hex(brandColor).bold(str) } diff --git a/packages/blitz/src/middleware.ts b/packages/blitz/src/middleware.ts index c18c19d32..4c8a877f0 100644 --- a/packages/blitz/src/middleware.ts +++ b/packages/blitz/src/middleware.ts @@ -56,61 +56,6 @@ export async function handleRequestWithMiddleware< } } -// export type InvokeWithMiddlewareConfig = { -// req: IncomingMessage -// res: ServerResponse -// middleware?: Middleware[] -// [prop: string]: any -// } - -// export async function invokeWithMiddleware< -// T extends AsyncFunc, -// TInput = FirstParam, -// TResult = PromiseReturnType -// >( -// resolver: T, -// params: TInput, -// ctx: InvokeWithMiddlewareConfig -// ): Promise { -// if (!ctx.req) { -// throw new Error( -// 'You must provide `req` in third argument of invokeWithMiddleware()' -// ) -// } -// if (!ctx.res) { -// throw new Error( -// 'You must provide `res` in third argument of invokeWithMiddleware()' -// ) -// } - -// const rpcResolver = (resolver as unknown) as any // todo: as RpcResolver - -// const resolverName = -// rpcResolver._resolverName ?? (rpcResolver as any).default?._resolverName - -// try { -// // todo -// // const log = baseLogger().getChildLogger({ -// // prefix: [resolverName + '()'], -// // }) -// console.log("\n") -// console.info(chalk.dim('Starting with input:'), params) -// const startTime = Date.now() - -// const result = await interopDefault(rpcResolver)(params, res.blitzCtx) - -// const duration = Date.now() - startTime -// console.info(chalk.dim(`Finished in ${prettyMs(duration)}`)) -// console.log("/n") - -// res.blitzResult = result // todo: remove? -// } catch (error) { -// throw error -// } - -// return (ctx.res as MiddlewareResponse).blitzResult as TResult -// } - /** * If the middleware function doesn't declare receiving the `next` callback * assume that it's synchronous and invoke `next` ourselves diff --git a/packages/generator/templates/app/app/blitz-server.ts b/packages/generator/templates/app/app/blitz-server.ts index cff80f17e..d89437bd7 100644 --- a/packages/generator/templates/app/app/blitz-server.ts +++ b/packages/generator/templates/app/app/blitz-server.ts @@ -1,16 +1,17 @@ -import { setupBlitzServer } from "@blitzjs/next" -import { AuthServerPlugin, PrismaStorage } from "@blitzjs/auth" -import { simpleRolesIsAuthorized } from "@blitzjs/auth" -import db from "db" -import { authConfig } from "./blitz-client" +import { setupBlitzServer } from '@blitzjs/next'; +import { AuthServerPlugin, PrismaStorage } from '@blitzjs/auth'; +import { simpleRolesIsAuthorized } from '@blitzjs/auth'; +import { BlitzLogger } from 'blitz'; +import db from 'db'; +import { authConfig } from './blitz-client'; export const { gSSP, gSP, api } = setupBlitzServer({ - plugins: [ - AuthServerPlugin({ - ...authConfig, - storage: PrismaStorage(db), - isAuthorized: simpleRolesIsAuthorized, - }), - ], -}) - + plugins: [ + AuthServerPlugin({ + ...authConfig, + storage: PrismaStorage(db), + isAuthorized: simpleRolesIsAuthorized + }) + ], + logger: BlitzLogger({}) +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a4345f87..c2e6cf3eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12857,7 +12857,7 @@ packages: pretty-format: 27.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.7.0_fxg3r7oju3tntkxsvleuiot4fa + ts-node: 10.7.0_6sxvnwysvlo53egjnie7htsx5a transitivePeerDependencies: - bufferutil - canvas @@ -18364,7 +18364,6 @@ packages: typescript: 4.7.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: false /ts-node/10.7.0_fxg3r7oju3tntkxsvleuiot4fa: resolution: @@ -18398,6 +18397,7 @@ packages: typescript: 4.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + dev: false /ts-node/10.7.0_typescript@4.6.3: resolution: