diff --git a/.changeset/config.json b/.changeset/config.json index 6551b0c..82461fa 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -6,5 +6,6 @@ "linked": [], "access": "public", "baseBranch": "main", - "updateInternalDependencies": "patch" + "updateInternalDependencies": "patch", + "ignore": ["@btravstack/start-*", "@btravstack-examples/*"] } diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 9f93df7..636a66c 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -1,8 +1,5 @@ { "$schema": "./node_modules/oxfmt/configuration_schema.json", "ignorePatterns": ["pnpm-lock.yaml", "packages/*/docs/**", "**/generated/**"], - "organizeImports": { - "sortImports": true, - "separateGroups": true - } + "sortImports": true } diff --git a/.oxlintrc.json b/.oxlintrc.json index cff97bf..37638ce 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,8 +1,5 @@ { "$schema": "./node_modules/oxlint/configuration_schema.json", - "ignorePatterns": ["**/*.test-d.ts", "**/generated/**"], - "rules": { - "@typescript-eslint/no-explicit-any": "error", - "typescript/consistent-type-definitions": ["error", "type"] - } + "extends": ["./node_modules/@btravstack/oxlint/base.json"], + "ignorePatterns": ["**/*.test-d.ts", "**/generated/**"] } diff --git a/commitlint.config.js b/commitlint.config.js index fa584fb..bcaf99f 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1 @@ -export default { extends: ["@commitlint/config-conventional"] }; +export default { extends: ["@btravstack/commitlint"] }; diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index eecbcc8..d0c50ff 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,4 +1,5 @@ import Theme from "@btravstack/theme"; + import "./custom.css"; export default Theme; diff --git a/examples/start-amqp-worker/package.json b/examples/start-amqp-worker/package.json index 405c448..3c1284b 100644 --- a/examples/start-amqp-worker/package.json +++ b/examples/start-amqp-worker/package.json @@ -18,7 +18,7 @@ "zod": "catalog:" }, "devDependencies": { - "@btravstack/tsconfig": "workspace:*", + "@btravstack/tsconfig": "catalog:", "@testcontainers/rabbitmq": "catalog:", "@types/node": "catalog:", "tsx": "catalog:", diff --git a/examples/start-amqp-worker/src/infra/logger.ts b/examples/start-amqp-worker/src/infra/logger.ts index a647edc..49fdcf7 100644 --- a/examples/start-amqp-worker/src/infra/logger.ts +++ b/examples/start-amqp-worker/src/infra/logger.ts @@ -1,7 +1,7 @@ import { Layer } from "demesne"; -import { Config } from "../config.js"; import { Logger } from "../application/ports.js"; +import { Config } from "../config.js"; export const LoggerLive = Layer.inject(Logger, { config: Config }, ({ config }) => ({ info: (msg) => { diff --git a/examples/start-amqp-worker/src/infra/payments.ts b/examples/start-amqp-worker/src/infra/payments.ts index bfcefff..9b8ad81 100644 --- a/examples/start-amqp-worker/src/infra/payments.ts +++ b/examples/start-amqp-worker/src/infra/payments.ts @@ -5,9 +5,9 @@ import { Layer } from "demesne"; import { Err, Ok } from "unthrown"; +import { Payments } from "../application/ports.js"; import { Config } from "../config.js"; import { PaymentDeclined } from "../domain.js"; -import { Payments } from "../application/ports.js"; let counter = 0; diff --git a/examples/start-amqp-worker/src/server.ts b/examples/start-amqp-worker/src/server.ts index b9363dc..37c2de5 100644 --- a/examples/start-amqp-worker/src/server.ts +++ b/examples/start-amqp-worker/src/server.ts @@ -1,17 +1,17 @@ +import { runConsumer } from "@btravstack/start-amqp"; // Entry point — connect to the broker (the URL is a deployment endpoint, read at process // bootstrap), assemble the graph with the real Payments adapter, and run the consume loop under // `runHost`: it subscribes on build and, on SIGINT/SIGTERM, closes the scope (cancelling // subscriptions) before the connection is closed. Startup failures are a static union. import { runHost } from "@btravstack/start-kernel"; -import { runConsumer } from "@btravstack/start-amqp"; import { Layer } from "demesne"; import { Logger } from "./application/ports.js"; import { bootstrap } from "./bootstrap.js"; +import { ConfigLive } from "./config.js"; import { CHARGE_QUEUE } from "./consumer.js"; import { createAmqpDriver } from "./infra/amqp-driver.js"; import { PaymentsLive } from "./infra/payments.js"; -import { ConfigLive } from "./config.js"; const driver = await createAmqpDriver(process.env["AMQP_URL"] ?? "amqp://localhost"); diff --git a/examples/start-amqp-worker/src/worker.integration.ts b/examples/start-amqp-worker/src/worker.integration.ts index 3006100..53c17fd 100644 --- a/examples/start-amqp-worker/src/worker.integration.ts +++ b/examples/start-amqp-worker/src/worker.integration.ts @@ -1,3 +1,5 @@ +import { runConsumer } from "@btravstack/start-amqp"; +import { runHost } from "@btravstack/start-kernel"; // Integration: the WHOLE consumer against a real RabbitMQ (testcontainers), through the REAL // amqplib driver — the exact wiring `server.ts` runs. A publisher connection pushes messages onto // the queue; the consumer must pick them up, run the demesne-wired handler, and settle them: @@ -6,16 +8,14 @@ // • a malformed body → ContractError → dead-letter (poison message, no loop) // A requeue-loop bug would keep messageCount > 0 — the drain assertions are the regression net. import { RabbitMQContainer, type StartedRabbitMQContainer } from "@testcontainers/rabbitmq"; -import { runHost } from "@btravstack/start-kernel"; -import { runConsumer } from "@btravstack/start-amqp"; -import { Layer } from "demesne"; import * as amqplib from "amqplib"; +import { Layer } from "demesne"; import { fromSafePromise } from "unthrown"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; import { bootstrap } from "./bootstrap.js"; -import { CHARGE_QUEUE } from "./consumer.js"; import { ConfigLive } from "./config.js"; +import { CHARGE_QUEUE } from "./consumer.js"; import { type AmqpConnection, createAmqpDriver } from "./infra/amqp-driver.js"; import { PaymentsLive } from "./infra/payments.js"; diff --git a/examples/start-api-todo/package.json b/examples/start-api-todo/package.json index 2bda3eb..edf0b6c 100644 --- a/examples/start-api-todo/package.json +++ b/examples/start-api-todo/package.json @@ -17,7 +17,7 @@ "zod": "catalog:" }, "devDependencies": { - "@btravstack/tsconfig": "workspace:*", + "@btravstack/tsconfig": "catalog:", "@types/node": "catalog:", "tsx": "catalog:", "typescript": "catalog:", diff --git a/examples/start-api-todo/src/app.ts b/examples/start-api-todo/src/app.ts index 9653293..b5dc441 100644 --- a/examples/start-api-todo/src/app.ts +++ b/examples/start-api-todo/src/app.ts @@ -5,8 +5,8 @@ import { httpListener, ListenConfig } from "@btravstack/start-api"; import { Layer } from "demesne"; -import { Config, ConfigLive } from "./config.js"; import { bootstrap } from "./bootstrap.js"; +import { Config, ConfigLive } from "./config.js"; import { TodoRepoLive } from "./infra/adapters.js"; const ListenConfigLive = Layer.inject(ListenConfig, { config: Config }, ({ config }) => ({ diff --git a/examples/start-api-todo/src/infra/adapters.ts b/examples/start-api-todo/src/infra/adapters.ts index 7527b14..6b0b2d4 100644 --- a/examples/start-api-todo/src/infra/adapters.ts +++ b/examples/start-api-todo/src/infra/adapters.ts @@ -4,9 +4,9 @@ import { Layer } from "demesne"; import { Err, Ok } from "unthrown"; +import { Logger, TodoRepository } from "../application/ports.js"; import { Config } from "../config.js"; import { type Todo, TodoNotFound } from "../domain.js"; -import { Logger, TodoRepository } from "../application/ports.js"; export const LoggerLive = Layer.inject(Logger, { config: Config }, ({ config }) => ({ info: (msg) => { diff --git a/examples/start-orpc-prisma/package.json b/examples/start-orpc-prisma/package.json index 3e08e92..deeb99d 100644 --- a/examples/start-orpc-prisma/package.json +++ b/examples/start-orpc-prisma/package.json @@ -26,7 +26,7 @@ "zod": "catalog:" }, "devDependencies": { - "@btravstack/tsconfig": "workspace:*", + "@btravstack/tsconfig": "catalog:", "@orpc/client": "catalog:", "@testcontainers/postgresql": "catalog:", "@types/node": "catalog:", diff --git a/examples/start-orpc-prisma/src/app.integration.ts b/examples/start-orpc-prisma/src/app.integration.ts index 9e1ae85..517dfb3 100644 --- a/examples/start-orpc-prisma/src/app.integration.ts +++ b/examples/start-orpc-prisma/src/app.integration.ts @@ -5,12 +5,12 @@ // closes, Prisma disconnects and the port stops accepting. import { execFileSync } from "node:child_process"; -import { PostgreSqlContainer, type StartedPostgreSqlContainer } from "@testcontainers/postgresql"; import { HttpServer } from "@btravstack/start-api"; import { runHost } from "@btravstack/start-kernel"; import { createORPCClient } from "@orpc/client"; import { RPCLink } from "@orpc/client/fetch"; import type { RouterClient } from "@orpc/server"; +import { PostgreSqlContainer, type StartedPostgreSqlContainer } from "@testcontainers/postgresql"; import { createResultClient } from "@unthrown/orpc/client"; import { fromSafePromise } from "unthrown"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; diff --git a/examples/start-orpc-prisma/src/app.test.ts b/examples/start-orpc-prisma/src/app.test.ts index 136bec9..29eb389 100644 --- a/examples/start-orpc-prisma/src/app.test.ts +++ b/examples/start-orpc-prisma/src/app.test.ts @@ -1,20 +1,18 @@ -// End-to-end test with NO database. It goes through the SAME `bootstrap` as the server, swapping -// only the repository for an in-memory fake (the port drops in without Prisma/Postgres). It drives -// the real app through a TYPED oRPC client whose fetch loops straight back into the Hono app — a -// genuine request/response cycle, JSON serialization and typed-error inference included, without a -// socket. -import { describe, expect, it } from "vitest"; - +import { HttpApp } from "@btravstack/start-api"; // Registers the Result / AsyncResult matchers. import "@unthrown/vitest"; - -import { HttpApp } from "@btravstack/start-api"; import { createORPCClient } from "@orpc/client"; import { RPCLink } from "@orpc/client/fetch"; import type { RouterClient } from "@orpc/server"; import { createResultClient } from "@unthrown/orpc/client"; import { Layer, type ServiceOf } from "demesne"; import { Err, Ok } from "unthrown"; +// End-to-end test with NO database. It goes through the SAME `bootstrap` as the server, swapping +// only the repository for an in-memory fake (the port drops in without Prisma/Postgres). It drives +// the real app through a TYPED oRPC client whose fetch loops straight back into the Hono app — a +// genuine request/response cycle, JSON serialization and typed-error inference included, without a +// socket. +import { describe, expect, it } from "vitest"; import { TodoRepository } from "./application/ports.js"; import { bootstrap } from "./bootstrap.js"; diff --git a/examples/start-orpc-prisma/src/app.ts b/examples/start-orpc-prisma/src/app.ts index f191136..f964f4b 100644 --- a/examples/start-orpc-prisma/src/app.ts +++ b/examples/start-orpc-prisma/src/app.ts @@ -5,8 +5,8 @@ import { httpListener, ListenConfig } from "@btravstack/start-api"; import { Layer } from "demesne"; -import { Config, ConfigLive } from "./config.js"; import { bootstrap } from "./bootstrap.js"; +import { Config, ConfigLive } from "./config.js"; import { DatabaseLive } from "./infra/prisma.js"; import { TodoRepoLive } from "./infra/todo-repository.js"; diff --git a/examples/start-orpc-prisma/src/http/router.ts b/examples/start-orpc-prisma/src/http/router.ts index 8fe4919..02df762 100644 --- a/examples/start-orpc-prisma/src/http/router.ts +++ b/examples/start-orpc-prisma/src/http/router.ts @@ -6,10 +6,10 @@ // domain→transport triage lives in one `mapErr` per procedure — the oRPC-native form of the // disposition map. import { HttpApp } from "@btravstack/start-api"; -import { type Context as DemesneContext, Layer, type ServiceOf } from "demesne"; import { os } from "@orpc/server"; import { RPCHandler } from "@orpc/server/fetch"; import { handlerResult } from "@unthrown/orpc/server"; +import { type Context as DemesneContext, Layer, type ServiceOf } from "demesne"; import { Hono } from "hono"; import { fromPromise, TaggedError } from "unthrown"; import { z } from "zod"; diff --git a/examples/start-orpc-prisma/src/infra/prisma.ts b/examples/start-orpc-prisma/src/infra/prisma.ts index ceca074..f3b5edf 100644 --- a/examples/start-orpc-prisma/src/infra/prisma.ts +++ b/examples/start-orpc-prisma/src/infra/prisma.ts @@ -4,9 +4,9 @@ // `$extends`ed with `@unthrown/prisma` so every query returns an `AsyncResult` (the `try*` methods) // whose error channel is the P-codes it can hit. import { PrismaPg } from "@prisma/adapter-pg"; +import { unthrownPrisma } from "@unthrown/prisma"; import { type Context, Layer, Tag } from "demesne"; import { fromPromise, TaggedError } from "unthrown"; -import { unthrownPrisma } from "@unthrown/prisma"; import { Config, type ConfigId } from "../config.js"; import { PrismaClient } from "../generated/prisma/client.ts"; diff --git a/examples/start-temporal-worker/package.json b/examples/start-temporal-worker/package.json index ae12ebe..6b96b55 100644 --- a/examples/start-temporal-worker/package.json +++ b/examples/start-temporal-worker/package.json @@ -20,7 +20,7 @@ "zod": "catalog:" }, "devDependencies": { - "@btravstack/tsconfig": "workspace:*", + "@btravstack/tsconfig": "catalog:", "@temporalio/client": "catalog:", "@types/node": "catalog:", "testcontainers": "catalog:", diff --git a/examples/start-temporal-worker/src/infra/logger.ts b/examples/start-temporal-worker/src/infra/logger.ts index bd675a9..6109316 100644 --- a/examples/start-temporal-worker/src/infra/logger.ts +++ b/examples/start-temporal-worker/src/infra/logger.ts @@ -1,7 +1,7 @@ import { Layer } from "demesne"; -import { Config } from "../config.js"; import { Logger } from "../application/ports.js"; +import { Config } from "../config.js"; export const LoggerLive = Layer.inject(Logger, { config: Config }, ({ config }) => ({ info: (msg) => { diff --git a/examples/start-temporal-worker/src/infra/payments.ts b/examples/start-temporal-worker/src/infra/payments.ts index 725ee1a..11e13e7 100644 --- a/examples/start-temporal-worker/src/infra/payments.ts +++ b/examples/start-temporal-worker/src/infra/payments.ts @@ -3,9 +3,9 @@ import { Layer } from "demesne"; import { Err, Ok } from "unthrown"; +import { Payments } from "../application/ports.js"; import { Config } from "../config.js"; import { PaymentDeclined } from "../domain.js"; -import { Payments } from "../application/ports.js"; let counter = 0; diff --git a/examples/start-temporal-worker/src/worker.integration.ts b/examples/start-temporal-worker/src/worker.integration.ts index 1085c77..bc1c8c0 100644 --- a/examples/start-temporal-worker/src/worker.integration.ts +++ b/examples/start-temporal-worker/src/worker.integration.ts @@ -1,3 +1,7 @@ +import { ActivityRegistry } from "@btravstack/start-temporal"; +import { Client, Connection } from "@temporalio/client"; +import { NativeConnection, Worker } from "@temporalio/worker"; +import { Layer } from "demesne"; // Integration: the WHOLE worker against a real Temporal dev server (testcontainers, the // `temporalio/temporal` CLI image running `server start-dev`). The REAL @temporalio Worker is // created exactly as `worker.ts` does — demesne-built activity registry, ApplicationFailure @@ -7,17 +11,13 @@ // • an over-limit → PaymentDeclined → non-retryable ApplicationFailure → workflow FAILS // immediately (no retry storm), surfacing the domain reason import { GenericContainer, type StartedTestContainer } from "testcontainers"; -import { Client, Connection } from "@temporalio/client"; -import { NativeConnection, Worker } from "@temporalio/worker"; -import { Layer } from "demesne"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; -import { ActivityRegistry } from "@btravstack/start-temporal"; import { bootstrap } from "./bootstrap.js"; import { ConfigLive } from "./config.js"; import type { ChargeCommand, Receipt } from "./domain.js"; -import { toApplicationFailures } from "./infra/temporal.js"; import { PaymentsLive } from "./infra/payments.js"; +import { toApplicationFailures } from "./infra/temporal.js"; import { workflowsPath } from "./workflows-path.js"; type OrderWorkflow = (command: ChargeCommand) => Promise; diff --git a/examples/start-temporal-worker/src/worker.ts b/examples/start-temporal-worker/src/worker.ts index 4ef90a5..afbd46c 100644 --- a/examples/start-temporal-worker/src/worker.ts +++ b/examples/start-temporal-worker/src/worker.ts @@ -8,8 +8,8 @@ import { Layer } from "demesne"; import { bootstrap } from "./bootstrap.js"; import { ConfigLive } from "./config.js"; -import { toApplicationFailures } from "./infra/temporal.js"; import { PaymentsLive } from "./infra/payments.js"; +import { toApplicationFailures } from "./infra/temporal.js"; import { workflowsPath } from "./workflows-path.js"; const built = await Layer.build(Layer.provideTo(bootstrap(PaymentsLive), ConfigLive)); diff --git a/knip.json b/knip.json index c701382..a2c767b 100644 --- a/knip.json +++ b/knip.json @@ -2,6 +2,7 @@ "$schema": "https://unpkg.com/knip@6/schema.json", "ignoreExportsUsedInFile": true, "ignore": ["**/*.test-d.ts"], + "ignoreDependencies": ["@btravstack/oxlint"], "workspaces": { "packages/*": { "project": ["src/**/*.ts"], diff --git a/package.json b/package.json index a990af5..a2eabaf 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,10 @@ "version": "changeset version" }, "devDependencies": { + "@btravstack/commitlint": "catalog:", + "@btravstack/oxlint": "catalog:", "@changesets/cli": "catalog:", "@commitlint/cli": "catalog:", - "@commitlint/config-conventional": "catalog:", "knip": "catalog:", "lefthook": "catalog:", "oxfmt": "catalog:", diff --git a/packages/start-amqp/package.json b/packages/start-amqp/package.json index addf66f..dc0690b 100644 --- a/packages/start-amqp/package.json +++ b/packages/start-amqp/package.json @@ -58,8 +58,8 @@ "devDependencies": { "@arethetypeswrong/cli": "catalog:", "@btravstack/start-kernel": "workspace:*", - "@btravstack/tsconfig": "workspace:*", - "@btravstack/typedoc": "workspace:*", + "@btravstack/tsconfig": "catalog:", + "@btravstack/typedoc": "catalog:", "@types/node": "catalog:", "@vitest/coverage-v8": "catalog:", "demesne": "catalog:", diff --git a/packages/start-api/package.json b/packages/start-api/package.json index f574b9d..25ff763 100644 --- a/packages/start-api/package.json +++ b/packages/start-api/package.json @@ -61,8 +61,8 @@ "devDependencies": { "@arethetypeswrong/cli": "catalog:", "@btravstack/start-kernel": "workspace:*", - "@btravstack/tsconfig": "workspace:*", - "@btravstack/typedoc": "workspace:*", + "@btravstack/tsconfig": "catalog:", + "@btravstack/typedoc": "catalog:", "@types/node": "catalog:", "@vitest/coverage-v8": "catalog:", "demesne": "catalog:", diff --git a/packages/start-kernel/package.json b/packages/start-kernel/package.json index 8147e2d..e7d24d2 100644 --- a/packages/start-kernel/package.json +++ b/packages/start-kernel/package.json @@ -56,8 +56,8 @@ }, "devDependencies": { "@arethetypeswrong/cli": "catalog:", - "@btravstack/tsconfig": "workspace:*", - "@btravstack/typedoc": "workspace:*", + "@btravstack/tsconfig": "catalog:", + "@btravstack/typedoc": "catalog:", "@types/node": "catalog:", "@unthrown/vitest": "catalog:", "@vitest/coverage-v8": "catalog:", diff --git a/packages/start-kernel/src/config.spec.ts b/packages/start-kernel/src/config.spec.ts index 0d1297a..c0a1fc4 100644 --- a/packages/start-kernel/src/config.spec.ts +++ b/packages/start-kernel/src/config.spec.ts @@ -1,5 +1,4 @@ import "@unthrown/vitest"; - import { Layer } from "demesne"; import { describe, expect, it } from "vitest"; import { z } from "zod"; diff --git a/packages/start-kernel/src/contract.spec.ts b/packages/start-kernel/src/contract.spec.ts index cae870f..c435d43 100644 --- a/packages/start-kernel/src/contract.spec.ts +++ b/packages/start-kernel/src/contract.spec.ts @@ -1,5 +1,4 @@ import "@unthrown/vitest"; - import { describe, expect, it } from "vitest"; import { z } from "zod"; diff --git a/packages/start-kernel/src/handler.spec.ts b/packages/start-kernel/src/handler.spec.ts index b967d25..99cf6b9 100644 --- a/packages/start-kernel/src/handler.spec.ts +++ b/packages/start-kernel/src/handler.spec.ts @@ -1,5 +1,4 @@ import "@unthrown/vitest"; - import { type Context, Layer, Tag } from "demesne"; import { type AsyncResult, Err, Ok, TaggedError } from "unthrown"; import { describe, expect, it } from "vitest"; diff --git a/packages/start-kernel/src/host.spec.ts b/packages/start-kernel/src/host.spec.ts index fedf510..c0bf237 100644 --- a/packages/start-kernel/src/host.spec.ts +++ b/packages/start-kernel/src/host.spec.ts @@ -1,5 +1,4 @@ import "@unthrown/vitest"; - import { Layer, Tag } from "demesne"; import { Ok } from "unthrown"; import { describe, expect, it } from "vitest"; diff --git a/packages/start-temporal/package.json b/packages/start-temporal/package.json index 3533012..22eb58d 100644 --- a/packages/start-temporal/package.json +++ b/packages/start-temporal/package.json @@ -59,8 +59,8 @@ "devDependencies": { "@arethetypeswrong/cli": "catalog:", "@btravstack/start-kernel": "workspace:*", - "@btravstack/tsconfig": "workspace:*", - "@btravstack/typedoc": "workspace:*", + "@btravstack/tsconfig": "catalog:", + "@btravstack/typedoc": "catalog:", "@types/node": "catalog:", "@vitest/coverage-v8": "catalog:", "demesne": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d88cadd..c3d10aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,18 +9,27 @@ catalogs: '@arethetypeswrong/cli': specifier: 0.18.5 version: 0.18.5 + '@btravstack/commitlint': + specifier: 0.1.0 + version: 0.1.0 + '@btravstack/oxlint': + specifier: 0.1.0 + version: 0.1.0 '@btravstack/theme': specifier: 1.7.0 version: 1.7.0 + '@btravstack/tsconfig': + specifier: 0.1.0 + version: 0.1.0 + '@btravstack/typedoc': + specifier: 0.1.0 + version: 0.1.0 '@changesets/cli': specifier: 2.31.0 version: 2.31.0 '@commitlint/cli': specifier: 21.2.1 version: 21.2.1 - '@commitlint/config-conventional': - specifier: 21.2.0 - version: 21.2.0 '@hono/node-server': specifier: 2.0.8 version: 2.0.8 @@ -134,6 +143,7 @@ catalogs: version: 4.4.3 overrides: + fast-uri@<3.1.4: 3.1.4 brace-expansion@2: 2.1.2 vite@<6.4.3: 6.4.3 '@hono/node-server@1': 1.19.13 @@ -142,15 +152,18 @@ importers: .: devDependencies: + '@btravstack/commitlint': + specifier: 'catalog:' + version: 0.1.0(@commitlint/cli@21.2.1(@types/node@26.1.1)(conventional-commits-parser@7.0.1)(typescript@6.0.3)) + '@btravstack/oxlint': + specifier: 'catalog:' + version: 0.1.0(oxlint@1.73.0) '@changesets/cli': specifier: 'catalog:' version: 2.31.0(@types/node@26.1.1) '@commitlint/cli': specifier: 'catalog:' version: 21.2.1(@types/node@26.1.1)(conventional-commits-parser@7.0.1)(typescript@6.0.3) - '@commitlint/config-conventional': - specifier: 'catalog:' - version: 21.2.0 knip: specifier: 'catalog:' version: 6.26.0 @@ -198,8 +211,8 @@ importers: version: 4.4.3 devDependencies: '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@testcontainers/rabbitmq': specifier: 'catalog:' version: 12.0.4 @@ -235,8 +248,8 @@ importers: version: 4.4.3 devDependencies: '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@types/node': specifier: 'catalog:' version: 26.1.1 @@ -290,8 +303,8 @@ importers: version: 4.4.3 devDependencies: '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@orpc/client': specifier: 'catalog:' version: 2.0.0-beta.15 @@ -345,8 +358,8 @@ importers: version: 4.4.3 devDependencies: '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@temporalio/client': specifier: 'catalog:' version: 1.20.2 @@ -375,11 +388,11 @@ importers: specifier: workspace:* version: link:../start-kernel '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@btravstack/typedoc': - specifier: workspace:* - version: link:../../tools/typedoc + specifier: 'catalog:' + version: 0.1.0(typedoc-plugin-markdown@4.12.0(typedoc@0.28.20(typescript@6.0.3)))(typedoc@0.28.20(typescript@6.0.3)) '@types/node': specifier: 'catalog:' version: 26.1.1 @@ -430,11 +443,11 @@ importers: specifier: workspace:* version: link:../start-kernel '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@btravstack/typedoc': - specifier: workspace:* - version: link:../../tools/typedoc + specifier: 'catalog:' + version: 0.1.0(typedoc-plugin-markdown@4.12.0(typedoc@0.28.20(typescript@6.0.3)))(typedoc@0.28.20(typescript@6.0.3)) '@types/node': specifier: 'catalog:' version: 26.1.1 @@ -475,11 +488,11 @@ importers: specifier: 'catalog:' version: 0.18.5 '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@btravstack/typedoc': - specifier: workspace:* - version: link:../../tools/typedoc + specifier: 'catalog:' + version: 0.1.0(typedoc-plugin-markdown@4.12.0(typedoc@0.28.20(typescript@6.0.3)))(typedoc@0.28.20(typescript@6.0.3)) '@types/node': specifier: 'catalog:' version: 26.1.1 @@ -526,11 +539,11 @@ importers: specifier: workspace:* version: link:../start-kernel '@btravstack/tsconfig': - specifier: workspace:* - version: link:../../tools/tsconfig + specifier: 'catalog:' + version: 0.1.0 '@btravstack/typedoc': - specifier: workspace:* - version: link:../../tools/typedoc + specifier: 'catalog:' + version: 0.1.0(typedoc-plugin-markdown@4.12.0(typedoc@0.28.20(typescript@6.0.3)))(typedoc@0.28.20(typescript@6.0.3)) '@types/node': specifier: 'catalog:' version: 26.1.1 @@ -565,10 +578,6 @@ importers: specifier: 'catalog:' version: 4.4.3 - tools/tsconfig: {} - - tools/typedoc: {} - packages: '@algolia/abtesting@1.21.2': @@ -694,6 +703,18 @@ packages: '@braidai/lang@1.1.2': resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} + '@btravstack/commitlint@0.1.0': + resolution: {integrity: sha512-fFSIJJd35VQsToBooQ6vtXmJdkCERDL9eNAyya5r98DgzEPybfuzpmN32WdDkB8TaQ8lpVuiBQ7Qf+4z6FlkRw==} + engines: {node: '>=20'} + peerDependencies: + '@commitlint/cli': '>=21' + + '@btravstack/oxlint@0.1.0': + resolution: {integrity: sha512-/UIfVydE3nEExRqE03vUoAAQSdPqVNOzZl0QSa9ikXftezoLQfNgJcFCKW6+D2cJnM180JR0o0W7dmkQHhLogQ==} + engines: {node: '>=20'} + peerDependencies: + oxlint: '>=1' + '@btravstack/theme@1.7.0': resolution: {integrity: sha512-EcBvQruZdsiL/zuNsu7Y1r2FeMDv0J5LZJx7ikO6cFvNRzKCc63A7582gVmfJNQlGJIg0cUCjQXB4Tm1YHtyug==} peerDependencies: @@ -703,6 +724,17 @@ packages: vue: optional: true + '@btravstack/tsconfig@0.1.0': + resolution: {integrity: sha512-xRkISG6jY5vLpaDJCptyOjvmUeyH6M/i6shhoE6WFGBc+JToc/dyO/511Zi6NPYVTHamNbxOG/e6dpclBWIz2A==} + engines: {node: '>=20'} + + '@btravstack/typedoc@0.1.0': + resolution: {integrity: sha512-cAhj15iqJwPQ+Z+I/Kc1Bafu9HqfS2D/uaU7czPecaCgZpH5F8LUfNRmTZppkvnTMpDX0La+UrdIUyNHHLqtIg==} + engines: {node: '>=20'} + peerDependencies: + typedoc: '>=0.28' + typedoc-plugin-markdown: '>=4' + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -3585,8 +3617,8 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-uri@3.1.3: - resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + fast-uri@3.1.4: + resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -5368,12 +5400,28 @@ snapshots: '@braidai/lang@1.1.2': {} + '@btravstack/commitlint@0.1.0(@commitlint/cli@21.2.1(@types/node@26.1.1)(conventional-commits-parser@7.0.1)(typescript@6.0.3))': + dependencies: + '@commitlint/cli': 21.2.1(@types/node@26.1.1)(conventional-commits-parser@7.0.1)(typescript@6.0.3) + '@commitlint/config-conventional': 21.2.0 + + '@btravstack/oxlint@0.1.0(oxlint@1.73.0)': + dependencies: + oxlint: 1.73.0 + '@btravstack/theme@1.7.0(vitepress@1.6.4(@algolia/client-search@5.55.2)(@types/node@26.1.1)(jiti@2.7.0)(postcss@8.5.16)(terser@5.48.0)(tsx@4.23.1)(typescript@6.0.3)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))': dependencies: vitepress: 1.6.4(@algolia/client-search@5.55.2)(@types/node@26.1.1)(jiti@2.7.0)(postcss@8.5.16)(terser@5.48.0)(tsx@4.23.1)(typescript@6.0.3)(yaml@2.9.0) optionalDependencies: vue: 3.5.39(typescript@6.0.3) + '@btravstack/tsconfig@0.1.0': {} + + '@btravstack/typedoc@0.1.0(typedoc-plugin-markdown@4.12.0(typedoc@0.28.20(typescript@6.0.3)))(typedoc@0.28.20(typescript@6.0.3))': + dependencies: + typedoc: 0.28.20(typescript@6.0.3) + typedoc-plugin-markdown: 4.12.0(typedoc@0.28.20(typescript@6.0.3)) + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -7377,7 +7425,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.3 + fast-uri: 3.1.4 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7967,7 +8015,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-uri@3.1.3: {} + fast-uri@3.1.4: {} fastq@1.20.1: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a4a7f8a..c978b04 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,16 +6,18 @@ strictPeerDependencies: true packages: - packages/* - - tools/* - examples/* - docs catalog: "@arethetypeswrong/cli": 0.18.5 + "@btravstack/commitlint": 0.1.0 + "@btravstack/oxlint": 0.1.0 "@btravstack/theme": 1.7.0 + "@btravstack/tsconfig": 0.1.0 + "@btravstack/typedoc": 0.1.0 "@changesets/cli": 2.31.0 "@commitlint/cli": 21.2.1 - "@commitlint/config-conventional": 21.2.0 "@hono/node-server": 2.0.8 "@orpc/client": 2.0.0-beta.15 "@orpc/contract": 2.0.0-beta.15 @@ -59,6 +61,11 @@ catalog: # tooling; each override pulls the dep to its first fixed release without # disturbing unrelated version lines. overrides: + # GHSA-v2hh-gcrm-f6hx (High): fast-uri host confusion via literal backslash + # authority delimiter. Only the vulnerable <3.1.4 line is present (transitive, + # dev/build tooling); 3.1.4 is the first patched release. Newly disclosed. + # fast-uri is added to minimumReleaseAgeExclude below (3.1.4 is <7 days old). + "fast-uri@<3.1.4": "3.1.4" # GHSA-3jxr-9vmj-r5cp: brace-expansion ReDoS. The vulnerable 2.x line reaches us # via testcontainers > archiver > glob > minimatch; 2.1.2 is the patched release. "brace-expansion@2": "2.1.2" @@ -109,7 +116,15 @@ minimumReleaseAgeStrict: true # their own repos on their own cadence; a fresh release can be newer than the 7-day window. # Exclude them so the peers resolve, while the delay still guards everything else. minimumReleaseAgeExclude: + # First-party shared config (@btravstack scope): adopt immediately, skip the delay. + - "@btravstack/commitlint" + - "@btravstack/oxlint" - "@btravstack/theme" + - "@btravstack/tsconfig" + - "@btravstack/typedoc" + # Temporary: fast-uri 3.1.4 (the GHSA-v2hh-gcrm-f6hx override above) is younger + # than the 7-day cutoff. Remove once 3.1.4 is 7 days old (published 2026-07-19). + - fast-uri - demesne - unthrown - "@unthrown/orpc" diff --git a/tools/tsconfig/base.json b/tools/tsconfig/base.json deleted file mode 100644 index c3f9782..0000000 --- a/tools/tsconfig/base.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "module": "NodeNext", - "moduleResolution": "NodeNext", - - "target": "ES2022", - "lib": ["ES2023"], - "types": ["node"], - - "resolveJsonModule": true, - "allowJs": true, - "checkJs": false, - "noEmit": true, - "declaration": true, - "declarationMap": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "skipLibCheck": true, - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "allowUnusedLabels": false, - "allowUnreachableCode": false, - "exactOptionalPropertyTypes": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noPropertyAccessFromIndexSignature": true, - "noUncheckedIndexedAccess": true - }, - "exclude": ["node_modules", "dist"] -} diff --git a/tools/tsconfig/package.json b/tools/tsconfig/package.json deleted file mode 100644 index 0387d76..0000000 --- a/tools/tsconfig/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@btravstack/tsconfig", - "version": "0.0.0", - "private": true, - "description": "Shared TypeScript configuration for btravstack start packages", - "license": "MIT", - "author": "Benoit TRAVERS ", - "files": [ - "base.json" - ], - "type": "module", - "exports": { - "./base.json": "./base.json" - } -} diff --git a/tools/typedoc/base.json b/tools/typedoc/base.json deleted file mode 100644 index 88521e4..0000000 --- a/tools/typedoc/base.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://typedoc.org/schema.json", - "plugin": ["typedoc-plugin-markdown"], - "outputFileStrategy": "modules", - "flattenOutputFiles": true, - "entryFileName": "index.md", - "hideGenerator": true, - "excludePrivate": true, - "excludeProtected": true, - "excludeInternal": true, - "readme": "none", - "githubPages": false, - "useCodeBlocks": true, - "useHTMLEncodedBrackets": true, - "sanitizeComments": true, - "parametersFormat": "table", - "propertiesFormat": "table", - "enumMembersFormat": "table", - "typeDeclarationFormat": "table", - "skipErrorChecking": true -} diff --git a/tools/typedoc/package.json b/tools/typedoc/package.json deleted file mode 100644 index c34771f..0000000 --- a/tools/typedoc/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@btravstack/typedoc", - "version": "0.0.0", - "private": true, - "description": "Shared TypeDoc configuration for btravstack start packages", - "license": "MIT", - "author": "Benoit TRAVERS ", - "files": [ - "base.json" - ], - "type": "module", - "exports": { - "./base.json": "./base.json" - } -}