@cosmicdrift/kumiko-dev-server 0.368.0 → 0.369.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,7 @@ import type { TestStack } from "@cosmicdrift/kumiko-testing/stack";
9
9
  import { type CreateKumikoServerOptions, type KumikoServerHandle } from "./create-kumiko-server.js";
10
10
  export type { AccountLockoutSetup, AccountUnlockSetup, AuthMailOptions, EmailVerificationSetup, InviteSetup, PasswordResetSetup, SignupSetup, } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
11
11
  import type { AccountLockoutSetup, AccountUnlockSetup, AuthMailOptions, EmailVerificationSetup, InviteSetup, PasswordResetSetup, SignupSetup } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
12
+ import { type UnsubscribeOption } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
12
13
  export type RunDevAppAuthOptions = {
13
14
  /** Admin user to seed at boot. Idempotent — re-runs in persistent-DB
14
15
  * mode reuse the existing user. */
@@ -146,6 +147,10 @@ export type RunDevAppOptions = {
146
147
  * Hono-app gehängt, läuft VOR dem static-asset-Pfad. Symmetrisch zur
147
148
  * gleichnamigen Option in runProdApp. */
148
149
  readonly extraRoutes?: CreateKumikoServerOptions["extraRoutes"];
150
+ /** Framework-managed unsubscribe links and routes, same contract as
151
+ * `RunProdAppOptions.unsubscribe`; the link base URL comes from `auth.mail.baseUrl`
152
+ * or `APP_BASE_URL` (dev has no `auth.publicOrigin`). */
153
+ readonly unsubscribe?: UnsubscribeOption;
149
154
  /** Hook for app-wired co-running components — symmetric to
150
155
  * runProdApp.wire (kumiko-framework#3050). */
151
156
  readonly wire?: CreateKumikoServerOptions["wire"];
@@ -23,6 +23,7 @@ import { createInMemoryLoginRateLimiter, parseTrustedProxyHopsEnv, TRUSTED_PROXY
23
23
  import { configureBlindIndexKey, configurePiiSubjectKms, } from "@cosmicdrift/kumiko-framework/crypto";
24
24
  import { configureEntityFieldEncryption } from "@cosmicdrift/kumiko-framework/db";
25
25
  import { collectWriteHandlerQns, createRegistry, FILE_STORAGE_PROVIDER_BOOT_SENTINEL, FILE_STORAGE_PROVIDER_ENV, findTierResolverUsage, requireTierResolverPlugin, validateAppCustomScreenWriteQns, validateBoot, } from "@cosmicdrift/kumiko-framework/engine";
26
+ import { createFallbackLogger } from "@cosmicdrift/kumiko-framework/logging";
26
27
  import { warnIfNonUtcServerTimeZone } from "@cosmicdrift/kumiko-framework/time";
27
28
  import { applyBootSeeds } from "@cosmicdrift/kumiko-server-runtime/boot/apply-boot-seeds";
28
29
  import { resolveBootCrypto } from "@cosmicdrift/kumiko-server-runtime/boot/boot-crypto";
@@ -32,7 +33,7 @@ import { assertSessionBootInvariants } from "@cosmicdrift/kumiko-server-runtime/
32
33
  import { createKumikoServer, logInfo, } from "./create-kumiko-server.js";
33
34
  import { captureEphemeralDevPiiKms, resolveDevPiiKms } from "./resolve-dev-pii-kms.js";
34
35
  import { renderWelcomeBanner } from "./welcome-banner.js";
35
- import { addConfigAccessorFactory, buildBootExtraContext, loggerFromExtraContext, requireEnv, resolveAuthMail, } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
36
+ import { addConfigAccessorFactory, buildBootExtraContext, loggerFromExtraContext, requireEnv, resolveAuthMail, resolveUnsubscribeWiring, } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
36
37
  export async function runDevApp(options) {
37
38
  // Auto-mix Standard-Features im auth-mode via composeFeatures (single
38
39
  // source of truth — auch runProdApp und der per-app drizzle-Schema-
@@ -46,6 +47,16 @@ export async function runDevApp(options) {
46
47
  ? resolveAuthMail(options.auth, requireEnv("JWT_SECRET", envSource, "runDevApp"), envSource)
47
48
  : undefined;
48
49
  const composeAuthOptions = buildComposeAuthOptions(effectiveAuth);
50
+ const { unsubscribeLinks, unsubscribeRoutes } = resolveUnsubscribeWiring({
51
+ unsubscribe: options.unsubscribe,
52
+ publicOrigin: undefined,
53
+ mailBaseUrl: effectiveAuth?.mail?.baseUrl,
54
+ envSource,
55
+ warn: (message) => createFallbackLogger("runDevApp").warn(message),
56
+ });
57
+ const extraRoutes = unsubscribeRoutes.length === 0
58
+ ? options.extraRoutes
59
+ : [...(options.extraRoutes ?? []), ...unsubscribeRoutes];
49
60
  const features = composeFeatures(options.features, {
50
61
  includeBundled: !!effectiveAuth,
51
62
  ...(composeAuthOptions && { authOptions: composeAuthOptions }),
@@ -163,6 +174,7 @@ export async function runDevApp(options) {
163
174
  redis: deps.redis,
164
175
  crypto: bootCrypto,
165
176
  ...(bootLogger && { log: bootLogger }),
177
+ ...(unsubscribeLinks && { unsubscribeLinks }),
166
178
  });
167
179
  return {
168
180
  ...boot,
@@ -239,7 +251,7 @@ export async function runDevApp(options) {
239
251
  ...(extraContext !== undefined && { extraContext }),
240
252
  ...(options.anonymousAccess !== undefined && { anonymousAccess: options.anonymousAccess }),
241
253
  ...(options.files !== undefined && { files: options.files }),
242
- ...(options.extraRoutes !== undefined && { extraRoutes: options.extraRoutes }),
254
+ ...(extraRoutes !== undefined && { extraRoutes }),
243
255
  ...(options.wire !== undefined && { wire: options.wire }),
244
256
  ...(trustedProxyHops !== undefined && { trustedProxyHops }),
245
257
  ...(finalEffectiveFeatures !== undefined && {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-dev-server",
3
- "version": "0.368.0",
3
+ "version": "0.369.0",
4
4
  "description": "Dev-tooling for Kumiko apps: local dev-server bootstrap (runDevApp), scaffolding. Its compose-stacks/env-schema subpaths are consumed at prod boot too — see @cosmicdrift/kumiko-server-runtime for the prod runner itself.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -67,14 +67,14 @@
67
67
  "kumiko-upgrade": "./bin/kumiko-upgrade.ts"
68
68
  },
69
69
  "dependencies": {
70
- "@cosmicdrift/kumiko-bundled-features": "0.368.0",
71
- "@cosmicdrift/kumiko-framework": "0.368.0",
72
- "@cosmicdrift/kumiko-headless": "0.368.0",
73
- "@cosmicdrift/kumiko-renderer-mail-html": "0.368.0",
74
- "@cosmicdrift/kumiko-renderer-web": "0.368.0",
75
- "@cosmicdrift/kumiko-server-runtime": "0.368.0",
76
- "@cosmicdrift/kumiko-testing": "0.368.0",
77
- "@cosmicdrift/kumiko-types": "0.368.0",
70
+ "@cosmicdrift/kumiko-bundled-features": "0.369.0",
71
+ "@cosmicdrift/kumiko-framework": "0.369.0",
72
+ "@cosmicdrift/kumiko-headless": "0.369.0",
73
+ "@cosmicdrift/kumiko-renderer-mail-html": "0.369.0",
74
+ "@cosmicdrift/kumiko-renderer-web": "0.369.0",
75
+ "@cosmicdrift/kumiko-server-runtime": "0.369.0",
76
+ "@cosmicdrift/kumiko-testing": "0.369.0",
77
+ "@cosmicdrift/kumiko-types": "0.369.0",
78
78
  "bun-types": "^1.3.13",
79
79
  "ts-morph": "^28.0.0",
80
80
  "zod": "^4.4.3"