From 355e79714c8ca432485488a7b6d0bb548ef3c725 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Thu, 2 Jul 2026 13:11:18 +0900 Subject: [PATCH 1/4] Set mise log level to trace in CI workflow Change the mise log_level from debug to trace in the setup-mise action, and add MISE_LOG_LEVEL environment variable to the run steps for both the check and test jobs. This ensures mise outputs more detailed logs when runner.debug is enabled, helping diagnose CI issues. --- .github/workflows/main.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 9f6b568..80abb3d 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -15,8 +15,10 @@ jobs: with: cache: true experimental: true - log_level: ${{ runner.debug == '1' && 'debug' || 'info' }} + log_level: ${{ runner.debug == '1' && 'trace' || 'info' }} - run: mise build && mise check + env: + MISE_LOG_LEVEL: ${{ runner.debug == '1' && 'trace' || 'info' }} test: strategy: @@ -30,5 +32,7 @@ jobs: with: cache: true experimental: true - log_level: ${{ runner.debug == '1' && 'debug' || 'info' }} + log_level: ${{ runner.debug == '1' && 'trace' || 'info' }} - run: mise test + env: + MISE_LOG_LEVEL: ${{ runner.debug == '1' && 'trace' || 'info' }} From b32897f81ba2e9a031ab6350df18fdc8d22f2684 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Fri, 3 Jul 2026 11:28:45 +0900 Subject: [PATCH 2/4] Integrate LogTape for structured logging Add LogTape logging throughout the application stack: - CLI: --log-level/-L and --log-output options via @optique/logtape integration (loggingOptions with level: "option") - Database: Drizzle ORM queries logged via @logtape/drizzle-orm - GraphQL Yoga: request/response logging via @logtape/graphql-yoga - Server: configure() with console sink at startup in packages/drfed/src/index.ts Update the dev task in mise.toml and scripts/dev.mts to pass --log-level (defaulting to "debug") and --log-output through to the development server process. --- .oxlintrc.json | 1 + mise.toml | 8 ++++ packages/drfed/package.json | 3 ++ packages/drfed/src/index.ts | 31 ++++++++++++++ packages/drfed/src/parser.ts | 5 +++ packages/graphql/package.json | 2 + packages/graphql/src/index.ts | 2 + packages/models/package.json | 1 + pnpm-lock.yaml | 78 +++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 7 ++++ scripts/dev.mts | 28 +++++++++---- 11 files changed, 159 insertions(+), 7 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 3e6e0a8..082f348 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -39,6 +39,7 @@ "import/consistent-type-specifier-style": "off", "import/exports-last": "off", "import/group-exports": "off", + "import/max-dependencies": ["warn", { "max": 20 }], "import/no-default-export": "off", "import/no-named-export": "off", "import/no-namespace": "off", diff --git a/mise.toml b/mise.toml index 6c218de..cc2382d 100644 --- a/mise.toml +++ b/mise.toml @@ -93,4 +93,12 @@ pnpm exec drizzle-kit generate ...$name ...$custom [tasks.dev] description = "Run the development server" +usage = ''' +flag "-L --log-level " { + choices "trace" "debug" "info" "warn" "error" "fatal" + default "debug" + help "Set log level" +} +flag "--log-output " help="Write logs to a file" +''' run = "node scripts/dev.mts" diff --git a/packages/drfed/package.json b/packages/drfed/package.json index a67061f..edd3f9e 100644 --- a/packages/drfed/package.json +++ b/packages/drfed/package.json @@ -68,7 +68,10 @@ "@drfed/graphql": "workspace:*", "@drfed/models": "workspace:*", "@electric-sql/pglite": "catalog:", + "@logtape/drizzle-orm": "catalog:", + "@logtape/logtape": "catalog:", "@optique/core": "^1.1.0", + "@optique/logtape": "catalog:", "@optique/run": "^1.1.0", "drizzle-orm": "catalog:", "pg": "catalog:", diff --git a/packages/drfed/src/index.ts b/packages/drfed/src/index.ts index d59d78d..c40bc5d 100644 --- a/packages/drfed/src/index.ts +++ b/packages/drfed/src/index.ts @@ -13,10 +13,13 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +import { AsyncLocalStorage } from "node:async_hooks"; import process from "node:process"; import { createYogaServer } from "@drfed/graphql"; import { migrate } from "@drfed/models"; +import { configure, getConsoleSink } from "@logtape/logtape"; +import { createLoggingConfig } from "@optique/logtape"; import { run } from "@optique/run"; import { serve } from "srvx"; @@ -25,6 +28,7 @@ import metadata from "../package.json" with { type: "json" }; import type { Options } from "./parser.ts"; import program from "./program.ts"; +// oxlint-disable-next-line max-lines-per-function export async function main(): Promise { const options: Options = run(program, { help: "option", @@ -35,6 +39,33 @@ export async function main(): Promise { value: metadata.version, }, }); + const loggingConfig = await createLoggingConfig( + options.logging, + {}, + { + contextLocalStorage: new AsyncLocalStorage(), + sinks: { + stderr: getConsoleSink({ + levelMap: { + trace: "error", + debug: "error", + info: "error", + warning: "error", + error: "error", + fatal: "error", + }, + }), + }, + loggers: [ + { + category: ["logtape", "meta"], + lowestLevel: "warning", + sinks: ["stderr"], + }, + ], + }, + ); + await configure(loggingConfig); if (options.drizzle.migrate) { await migrate({ credentials: options.drizzle.credentials }); } diff --git a/packages/drfed/src/parser.ts b/packages/drfed/src/parser.ts index 8c33f46..0a28bfc 100644 --- a/packages/drfed/src/parser.ts +++ b/packages/drfed/src/parser.ts @@ -14,12 +14,14 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import { relations, schema } from "@drfed/models"; +import { getLogger } from "@logtape/drizzle-orm"; import { merge, object, or } from "@optique/core/constructs"; import { message, optionNames } from "@optique/core/message"; import { map, withDefault } from "@optique/core/modifiers"; import type { InferValue } from "@optique/core/parser"; import { option } from "@optique/core/primitives"; import { socketAddress, url } from "@optique/core/valueparser"; +import { loggingOptions } from "@optique/logtape"; import { path } from "@optique/run/valueparser"; import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres"; import { drizzle as drizzlePglite } from "drizzle-orm/pglite"; @@ -43,6 +45,7 @@ const pgliteParser = map( connection: { dataDir: dbPath }, relations, schema, + logger: getLogger(), }), }), ); @@ -67,11 +70,13 @@ const postgresParser = map( }, relations, schema, + logger: getLogger(), }), }), ); export const parser = object({ + logging: loggingOptions({ level: "option", short: "-L" }), address: withDefault( option("--listen", "-l", socketAddress({ requirePort: true }), { description: message`The address to listen on.`, diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 8d06686..c7c0ec5 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -92,6 +92,8 @@ }, "dependencies": { "@drfed/models": "workspace:*", + "@logtape/graphql-yoga": "catalog:", + "@logtape/logtape": "catalog:", "@pothos/core": "^4.13.0", "@pothos/plugin-drizzle": "^0.17.4", "@pothos/plugin-relay": "^4.7.0", diff --git a/packages/graphql/src/index.ts b/packages/graphql/src/index.ts index f9c318e..ea95121 100644 --- a/packages/graphql/src/index.ts +++ b/packages/graphql/src/index.ts @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import type { Database } from "@drfed/models"; +import { getYogaLogger } from "@logtape/graphql-yoga"; import { type YogaServerInstance, createYoga, @@ -39,5 +40,6 @@ export function createYogaServer( }, plugins: [useExecutionCancellation()], schema, + logging: getYogaLogger(), }); } diff --git a/packages/models/package.json b/packages/models/package.json index 3133911..74a91ba 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -99,6 +99,7 @@ }, "dependencies": { "@electric-sql/pglite": "catalog:", + "@logtape/logtape": "catalog:", "drizzle-orm": "catalog:", "pg": "catalog:" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 296231c..f4608d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,18 @@ catalogs: '@electric-sql/pglite': specifier: ^0.5.3 version: 0.5.3 + '@logtape/drizzle-orm': + specifier: ^2.2.2 + version: 2.2.2 + '@logtape/graphql-yoga': + specifier: 2.3.0-dev.791 + version: 2.3.0-dev.791 + '@logtape/logtape': + specifier: ^2.2.2 + version: 2.2.2 + '@optique/logtape': + specifier: ^1.1.1 + version: 1.1.1 '@types/node': specifier: ^26.0.0 version: 26.0.0 @@ -41,9 +53,18 @@ importers: '@electric-sql/pglite': specifier: 'catalog:' version: 0.5.3 + '@logtape/drizzle-orm': + specifier: 'catalog:' + version: 2.2.2(@logtape/logtape@2.2.2) + '@logtape/logtape': + specifier: 'catalog:' + version: 2.2.2 '@optique/core': specifier: ^1.1.0 version: 1.1.0 + '@optique/logtape': + specifier: 'catalog:' + version: 1.1.1(@logtape/logtape@2.2.2) '@optique/run': specifier: ^1.1.0 version: 1.1.0 @@ -75,6 +96,12 @@ importers: '@drfed/models': specifier: workspace:* version: link:../models + '@logtape/graphql-yoga': + specifier: 'catalog:' + version: 2.3.0-dev.791(@logtape/logtape@2.2.2)(graphql-yoga@5.21.2(graphql@16.14.2))(graphql@16.14.2) + '@logtape/logtape': + specifier: 'catalog:' + version: 2.2.2 '@pothos/core': specifier: ^4.13.0 version: 4.13.0(graphql@16.14.2) @@ -115,6 +142,9 @@ importers: '@electric-sql/pglite': specifier: 'catalog:' version: 0.5.3 + '@logtape/logtape': + specifier: 'catalog:' + version: 2.2.2 drizzle-orm: specifier: 'catalog:' version: 1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@types/pg@8.20.0)(pg@8.21.0) @@ -411,6 +441,21 @@ packages: resolution: {integrity: sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ==} engines: {node: '>=12'} + '@logtape/drizzle-orm@2.2.2': + resolution: {integrity: sha512-Z/TrI5BbOCSJPmoyogy9RERtAxs/hlyI+e/uay1PSY68/ZddPqfudbS6MGgFylAiACprJ0d0zEiGeysUQUcQ2A==} + peerDependencies: + '@logtape/logtape': ^2.2.2 + + '@logtape/graphql-yoga@2.3.0-dev.791': + resolution: {integrity: sha512-PCYVPavz8SfADwB2CStMIPpGem5+jI0zqUYn8OC0qeAERYlRRwaBzvIqDoqIyfrsqATqgq/dF33ZMApOTaQ9/A==} + peerDependencies: + '@logtape/logtape': ^2.3.0-dev.791+61dcdb79 + graphql: ^15.2.0 || ^16.0.0 + graphql-yoga: ^5.0.0 + + '@logtape/logtape@2.2.2': + resolution: {integrity: sha512-4BOSQDaWWWqINO/mcFhZxtJDcnK97I+JxLlcd1Nfjbv74o2JLGeRRnLd62Tz1+Qf9rZ3sGNa5cTBhTWPq6XFzQ==} + '@napi-rs/wasm-runtime@1.1.5': resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} peerDependencies: @@ -421,6 +466,20 @@ packages: resolution: {integrity: sha512-eBqai76tHiFDoShlTNXN9AAPs9XznCJRrk4qmGhjZUSMmePCF9o1XU3okUHxHdDXXCHj4auKoIvCN79KNKErxA==} engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} + '@optique/core@1.1.1': + resolution: {integrity: sha512-tbZLdH5wEnh8IRG8KTmWPZCKHLmD4bXigoPdzoSUVi+V46qZTNEaTdqtR7EuEwhbPI0KQjLSYRZCxFTdr9OZkA==} + engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} + + '@optique/logtape@1.1.1': + resolution: {integrity: sha512-vpmMK0Y7dvrhQEXIGr+Pix+UXlJi4fp+NIX6s7xmpIjYfmms+lGw3dHPJhjJFoTthKJQCeBF88tjWAqwCJhVLg==} + engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} + peerDependencies: + '@logtape/file': ^2.0.4 + '@logtape/logtape': ^2.0.4 + peerDependenciesMeta: + '@logtape/file': + optional: true + '@optique/run@1.1.0': resolution: {integrity: sha512-dcuqqqU1Cpm9CLGEkCkpT/cpJ6H6a+hs0rP+iD8Tgwb+CPPZtX/hCfdIrqYyZ2RtYLxgc3S6KqC81AZAwEUPew==} engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} @@ -1199,6 +1258,18 @@ snapshots: dependencies: jsbi: 4.3.2 + '@logtape/drizzle-orm@2.2.2(@logtape/logtape@2.2.2)': + dependencies: + '@logtape/logtape': 2.2.2 + + '@logtape/graphql-yoga@2.3.0-dev.791(@logtape/logtape@2.2.2)(graphql-yoga@5.21.2(graphql@16.14.2))(graphql@16.14.2)': + dependencies: + '@logtape/logtape': 2.2.2 + graphql: 16.14.2 + graphql-yoga: 5.21.2(graphql@16.14.2) + + '@logtape/logtape@2.2.2': {} + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': dependencies: '@emnapi/core': 1.11.0 @@ -1208,6 +1279,13 @@ snapshots: '@optique/core@1.1.0': {} + '@optique/core@1.1.1': {} + + '@optique/logtape@1.1.1(@logtape/logtape@2.2.2)': + dependencies: + '@logtape/logtape': 2.2.2 + '@optique/core': 1.1.1 + '@optique/run@1.1.0': dependencies: '@optique/core': 1.1.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cb61ad7..2e2d916 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,9 +6,16 @@ allowBuilds: catalog: "@electric-sql/pglite": ^0.5.3 + "@logtape/drizzle-orm": ^2.2.2 + "@logtape/graphql-yoga": 2.3.0-dev.791 + "@logtape/logtape": ^2.2.2 + "@optique/logtape": ^1.1.1 "@types/node": ^26.0.0 "@types/pg": ^8.20.0 drizzle-orm: 1.0.0-beta.22 pg: ^8.21.0 tsdown: ^0.22.3 typescript: ^6.0.3 + +minimumReleaseAgeExclude: + - "@logtape/graphql-yoga@2.3.0-dev.791" diff --git a/scripts/dev.mts b/scripts/dev.mts index 3623da8..877f306 100644 --- a/scripts/dev.mts +++ b/scripts/dev.mts @@ -247,15 +247,29 @@ try { await waitForBuilds(buildExit); + const serverArgs: string[] = [ + "--watch", + "bin/drfed-server.mjs", + "--pglite-data-path", + "../../.pgdata", + "--listen=0.0.0.0:8888", + ]; + + const logLevel = process.env.usage_log_level; + if (logLevel != null && logLevel !== "") { + serverArgs.push("--log-level", logLevel); + } else { + serverArgs.push("--log-level", "debug"); + } + + const logOutput = process.env.usage_log_output; + if (logOutput != null && logOutput !== "") { + serverArgs.push("--log-output", logOutput); + } + serverProcess = spawnManaged( process.execPath, - [ - "--watch", - "bin/drfed-server.mjs", - "--pglite-data-path", - "../../.pgdata", - "--listen=0.0.0.0:8888", - ], + serverArgs, join(root, "packages", "drfed"), ); const serverExit = await waitForExit(serverProcess); From a9245e967862358c9f9422267625fc6dcac9eb53 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Fri, 3 Jul 2026 17:20:39 +0900 Subject: [PATCH 3/4] Integrate @logtape/testing-node for test logging Replace all node:test describe/it imports with @logtape/testing-node/autoload, which integrates log output with the test runner for better debugging. Update @logtape/logtape and @logtape/graphql-yoga to 2.3.0-dev.840 to match the testing-node dependency. Add LOGTAPE_TEST_MODE and LOGTAPE_TEST_LOWEST_LEVEL environment variables to both CI workflow and local mise test task to control when and at what level log output is shown during tests. --- .github/workflows/main.yaml | 2 + mise.toml | 2 + packages/drfed/package.json | 1 + packages/graphql/package.json | 1 + packages/graphql/src/account.test.ts | 2 +- packages/graphql/src/harness-smoke.test.ts | 2 +- packages/graphql/src/instance.test.ts | 2 +- packages/models/package.json | 1 + packages/models/src/email.test.ts | 2 +- pnpm-lock.yaml | 75 +++++++++++++++------- pnpm-workspace.yaml | 10 ++- 11 files changed, 71 insertions(+), 29 deletions(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 80abb3d..5e4377a 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -36,3 +36,5 @@ jobs: - run: mise test env: MISE_LOG_LEVEL: ${{ runner.debug == '1' && 'trace' || 'info' }} + LOGTAPE_TEST_MODE: ${{ runner.debug == '1' && 'always' || 'on-failure' }} + LOGTAPE_TEST_LOWEST_LEVEL: ${{ runner.debug == '1' && 'trace' || 'debug' }} diff --git a/mise.toml b/mise.toml index cc2382d..9b30f40 100644 --- a/mise.toml +++ b/mise.toml @@ -66,6 +66,8 @@ run = "pnpm run --parallel --recursive build" description = "Run tests" depends = ["build"] run = "pnpm run --parallel --recursive test" +env.LOGTAPE_TEST_MODE = "on-failure" +env.LOGTAPE_TEST_LOWEST_LEVEL = "debug" [tasks.bump] description = "Bump all package versions" diff --git a/packages/drfed/package.json b/packages/drfed/package.json index edd3f9e..31ff52a 100644 --- a/packages/drfed/package.json +++ b/packages/drfed/package.json @@ -59,6 +59,7 @@ "build": "tsdown" }, "devDependencies": { + "@logtape/testing-node": "catalog:", "@types/node": "catalog:", "@types/pg": "catalog:", "tsdown": "catalog:", diff --git a/packages/graphql/package.json b/packages/graphql/package.json index c7c0ec5..0ca4f60 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -86,6 +86,7 @@ }, "devDependencies": { "@electric-sql/pglite": "catalog:", + "@logtape/testing-node": "catalog:", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:" diff --git a/packages/graphql/src/account.test.ts b/packages/graphql/src/account.test.ts index 2ec82a4..060dc6a 100644 --- a/packages/graphql/src/account.test.ts +++ b/packages/graphql/src/account.test.ts @@ -14,9 +14,9 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import assert from "node:assert/strict"; -import { describe, it } from "node:test"; import { type Database, schema } from "@drfed/models"; +import { describe, it } from "@logtape/testing-node/autoload"; import { withTestHarness } from "./harness.test.ts"; diff --git a/packages/graphql/src/harness-smoke.test.ts b/packages/graphql/src/harness-smoke.test.ts index d1e0c8b..a3e677d 100644 --- a/packages/graphql/src/harness-smoke.test.ts +++ b/packages/graphql/src/harness-smoke.test.ts @@ -14,9 +14,9 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import assert from "node:assert/strict"; -import { describe, it } from "node:test"; import { schema } from "@drfed/models"; +import { describe, it } from "@logtape/testing-node/autoload"; import { withTemporaryDatabase, withTestHarness } from "./harness.test.ts"; diff --git a/packages/graphql/src/instance.test.ts b/packages/graphql/src/instance.test.ts index 5479556..af6ea55 100644 --- a/packages/graphql/src/instance.test.ts +++ b/packages/graphql/src/instance.test.ts @@ -14,9 +14,9 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import assert from "node:assert/strict"; -import { describe, it } from "node:test"; import { type Database, schema } from "@drfed/models"; +import { describe, it } from "@logtape/testing-node/autoload"; import { withTestHarness } from "./harness.test.ts"; diff --git a/packages/models/package.json b/packages/models/package.json index 74a91ba..54eeaeb 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -91,6 +91,7 @@ "test": "node --test" }, "devDependencies": { + "@logtape/testing-node": "catalog:", "@types/node": "catalog:", "@types/pg": "catalog:", "drizzle-kit": "1.0.0-beta.22", diff --git a/packages/models/src/email.test.ts b/packages/models/src/email.test.ts index 710d3ca..0587663 100644 --- a/packages/models/src/email.test.ts +++ b/packages/models/src/email.test.ts @@ -14,9 +14,9 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import assert from "node:assert/strict"; -import { describe, it } from "node:test"; import { normalizeEmail } from "@drfed/models/email"; +import { describe, it } from "@logtape/testing-node/autoload"; describe("normalizeEmail()", () => { it("with valid email", () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f4608d7..d6a3bec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,11 +13,14 @@ catalogs: specifier: ^2.2.2 version: 2.2.2 '@logtape/graphql-yoga': - specifier: 2.3.0-dev.791 - version: 2.3.0-dev.791 + specifier: 2.3.0-dev.840 + version: 2.3.0-dev.840 '@logtape/logtape': - specifier: ^2.2.2 - version: 2.2.2 + specifier: 2.3.0-dev.840 + version: 2.3.0-dev.840 + '@logtape/testing-node': + specifier: 2.3.0-dev.840 + version: 2.3.0-dev.840 '@optique/logtape': specifier: ^1.1.1 version: 1.1.1 @@ -55,16 +58,16 @@ importers: version: 0.5.3 '@logtape/drizzle-orm': specifier: 'catalog:' - version: 2.2.2(@logtape/logtape@2.2.2) + version: 2.2.2(@logtape/logtape@2.3.0-dev.840) '@logtape/logtape': specifier: 'catalog:' - version: 2.2.2 + version: 2.3.0-dev.840 '@optique/core': specifier: ^1.1.0 version: 1.1.0 '@optique/logtape': specifier: 'catalog:' - version: 1.1.1(@logtape/logtape@2.2.2) + version: 1.1.1(@logtape/logtape@2.3.0-dev.840) '@optique/run': specifier: ^1.1.0 version: 1.1.0 @@ -78,6 +81,9 @@ importers: specifier: ^0.11.16 version: 0.11.16 devDependencies: + '@logtape/testing-node': + specifier: 'catalog:' + version: 2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840) '@types/node': specifier: 'catalog:' version: 26.0.0 @@ -98,10 +104,10 @@ importers: version: link:../models '@logtape/graphql-yoga': specifier: 'catalog:' - version: 2.3.0-dev.791(@logtape/logtape@2.2.2)(graphql-yoga@5.21.2(graphql@16.14.2))(graphql@16.14.2) + version: 2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840)(graphql-yoga@5.21.2(graphql@16.14.2))(graphql@16.14.2) '@logtape/logtape': specifier: 'catalog:' - version: 2.2.2 + version: 2.3.0-dev.840 '@pothos/core': specifier: ^4.13.0 version: 4.13.0(graphql@16.14.2) @@ -127,6 +133,9 @@ importers: '@electric-sql/pglite': specifier: 'catalog:' version: 0.5.3 + '@logtape/testing-node': + specifier: 'catalog:' + version: 2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840) '@types/node': specifier: 'catalog:' version: 26.0.0 @@ -144,7 +153,7 @@ importers: version: 0.5.3 '@logtape/logtape': specifier: 'catalog:' - version: 2.2.2 + version: 2.3.0-dev.840 drizzle-orm: specifier: 'catalog:' version: 1.0.0-beta.22(@electric-sql/pglite@0.5.3)(@types/pg@8.20.0)(pg@8.21.0) @@ -152,6 +161,9 @@ importers: specifier: 'catalog:' version: 8.21.0 devDependencies: + '@logtape/testing-node': + specifier: 'catalog:' + version: 2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840) '@types/node': specifier: 'catalog:' version: 26.0.0 @@ -446,15 +458,25 @@ packages: peerDependencies: '@logtape/logtape': ^2.2.2 - '@logtape/graphql-yoga@2.3.0-dev.791': - resolution: {integrity: sha512-PCYVPavz8SfADwB2CStMIPpGem5+jI0zqUYn8OC0qeAERYlRRwaBzvIqDoqIyfrsqATqgq/dF33ZMApOTaQ9/A==} + '@logtape/graphql-yoga@2.3.0-dev.840': + resolution: {integrity: sha512-zL+RIlG5TPwC8iAWeW8Lh49rA6VUw9fYSFcXLvWIrTJ56xQPX0TzFQ6MMzAMMjw4GlSz8cs0HsHlI/rsHUT02w==} peerDependencies: - '@logtape/logtape': ^2.3.0-dev.791+61dcdb79 + '@logtape/logtape': ^2.3.0-dev.840+34e837bf graphql: ^15.2.0 || ^16.0.0 graphql-yoga: ^5.0.0 - '@logtape/logtape@2.2.2': - resolution: {integrity: sha512-4BOSQDaWWWqINO/mcFhZxtJDcnK97I+JxLlcd1Nfjbv74o2JLGeRRnLd62Tz1+Qf9rZ3sGNa5cTBhTWPq6XFzQ==} + '@logtape/logtape@2.3.0-dev.840': + resolution: {integrity: sha512-ozdG01RAKtEbDO9iDZDQOyUX9/4p1AcuHaxJtarDK22ngFU7vSxXyPGn9bf89pX358v2QXY+3+CqXWMlT6tiaQ==} + + '@logtape/testing-node@2.3.0-dev.840': + resolution: {integrity: sha512-85UWXs1LCVKbL6nrcR7tPeh5/stQYwrBCkEOuUOJ0ufkTG7l6TP+eNWlCr0P0hrG4NzjjP9GhOpIamrLXbvMtg==} + peerDependencies: + '@logtape/logtape': ^2.3.0-dev.840+34e837bf + + '@logtape/testing@2.3.0-dev.840': + resolution: {integrity: sha512-Hw75jN/90zwf1ooawhs1pVBhz1C/zhEASqFznClmlFk30Tlog/rYwc+yra6vdsB6buHb0jHmIe1NHoX2vV+PDw==} + peerDependencies: + '@logtape/logtape': ^2.3.0-dev.840+34e837bf '@napi-rs/wasm-runtime@1.1.5': resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} @@ -1258,17 +1280,26 @@ snapshots: dependencies: jsbi: 4.3.2 - '@logtape/drizzle-orm@2.2.2(@logtape/logtape@2.2.2)': + '@logtape/drizzle-orm@2.2.2(@logtape/logtape@2.3.0-dev.840)': dependencies: - '@logtape/logtape': 2.2.2 + '@logtape/logtape': 2.3.0-dev.840 - '@logtape/graphql-yoga@2.3.0-dev.791(@logtape/logtape@2.2.2)(graphql-yoga@5.21.2(graphql@16.14.2))(graphql@16.14.2)': + '@logtape/graphql-yoga@2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840)(graphql-yoga@5.21.2(graphql@16.14.2))(graphql@16.14.2)': dependencies: - '@logtape/logtape': 2.2.2 + '@logtape/logtape': 2.3.0-dev.840 graphql: 16.14.2 graphql-yoga: 5.21.2(graphql@16.14.2) - '@logtape/logtape@2.2.2': {} + '@logtape/logtape@2.3.0-dev.840': {} + + '@logtape/testing-node@2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840)': + dependencies: + '@logtape/logtape': 2.3.0-dev.840 + '@logtape/testing': 2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840) + + '@logtape/testing@2.3.0-dev.840(@logtape/logtape@2.3.0-dev.840)': + dependencies: + '@logtape/logtape': 2.3.0-dev.840 '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': dependencies: @@ -1281,9 +1312,9 @@ snapshots: '@optique/core@1.1.1': {} - '@optique/logtape@1.1.1(@logtape/logtape@2.2.2)': + '@optique/logtape@1.1.1(@logtape/logtape@2.3.0-dev.840)': dependencies: - '@logtape/logtape': 2.2.2 + '@logtape/logtape': 2.3.0-dev.840 '@optique/core': 1.1.1 '@optique/run@1.1.0': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2e2d916..f14ebc0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,8 +7,9 @@ allowBuilds: catalog: "@electric-sql/pglite": ^0.5.3 "@logtape/drizzle-orm": ^2.2.2 - "@logtape/graphql-yoga": 2.3.0-dev.791 - "@logtape/logtape": ^2.2.2 + "@logtape/graphql-yoga": 2.3.0-dev.840 + "@logtape/logtape": 2.3.0-dev.840 + "@logtape/testing-node": 2.3.0-dev.840 "@optique/logtape": ^1.1.1 "@types/node": ^26.0.0 "@types/pg": ^8.20.0 @@ -18,4 +19,7 @@ catalog: typescript: ^6.0.3 minimumReleaseAgeExclude: - - "@logtape/graphql-yoga@2.3.0-dev.791" + - "@logtape/graphql-yoga@2.3.0-dev.840" + - "@logtape/logtape@2.3.0-dev.840" + - "@logtape/testing-node@2.3.0-dev.840" + - "@logtape/testing@2.3.0-dev.840" From 8aa7ad50aa5ae850a7b6290667c6bb4749912e9c Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Fri, 3 Jul 2026 17:34:30 +0900 Subject: [PATCH 4/4] Add -d/--debug flag to mise run test task Replace static environment variables with a Nushell script that supports a --debug flag. When the flag is set, log output is shown at trace level always; otherwise it defaults to showing logs on failure at debug level. --- mise.toml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/mise.toml b/mise.toml index 9b30f40..eab0502 100644 --- a/mise.toml +++ b/mise.toml @@ -65,9 +65,20 @@ run = "pnpm run --parallel --recursive build" [tasks.test] description = "Run tests" depends = ["build"] -run = "pnpm run --parallel --recursive test" -env.LOGTAPE_TEST_MODE = "on-failure" -env.LOGTAPE_TEST_LOWEST_LEVEL = "debug" +usage = ''' +flag "-d --debug" help="Run tests in debug mode" +''' +run = ''' +#!/usr/bin/env nu +if "usage_debug" in $env { + $env.LOGTAPE_TEST_MODE = "always" + $env.LOGTAPE_TEST_LOWEST_LEVEL = "trace" +} else { + $env.LOGTAPE_TEST_MODE = "on-failure" + $env.LOGTAPE_TEST_LOWEST_LEVEL = "debug" +} +pnpm run --parallel --recursive test +''' [tasks.bump] description = "Bump all package versions"