@cosmicdrift/kumiko-dev-server 0.388.0 → 0.389.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.
- package/dist/create-kumiko-server-stack.js +2 -1
- package/dist/create-kumiko-server-stylesheet.js +7 -9
- package/dist/framework-version.js +2 -1
- package/dist/managed-files/registry.js +5 -1
- package/dist/run-dev-app-auth.js +1 -0
- package/dist/run-dev-app-config.js +1 -1
- package/dist/run-dev-app.d.ts +7 -3
- package/dist/run-dev-app.js +5 -5
- package/dist/scaffold-app.d.ts +2 -1
- package/dist/scaffold-app.js +29 -2
- package/dist/setup-test-stack-from-features.d.ts +1 -0
- package/dist/setup-test-stack-from-features.js +6 -2
- package/package.json +15 -10
- package/src/changes.json +31 -0
- package/templates/deploy/Dockerfile.template +3 -2
- package/templates/managed/ci-public.yml.template +2 -2
- package/templates/managed/kumiko-schema.ts.template +1 -0
|
@@ -2,7 +2,7 @@ import { resolveAnonymousAccessFromRegistry } from "@cosmicdrift/kumiko-bundled-
|
|
|
2
2
|
import { createEventsTable } from "@cosmicdrift/kumiko-framework/event-store";
|
|
3
3
|
import { createMetricsForFactory } from "@cosmicdrift/kumiko-framework/observability";
|
|
4
4
|
import { startDevJobRunners } from "@cosmicdrift/kumiko-server-runtime/boot/job-run-logger";
|
|
5
|
-
import { makeDispatchSystemQuery, makeDispatchSystemWrite, } from "@cosmicdrift/kumiko-server-runtime/extra-routes-deps";
|
|
5
|
+
import { makeDispatchSystemQuery, makeDispatchSystemWrite, makeFilesForTenant, } from "@cosmicdrift/kumiko-server-runtime/extra-routes-deps";
|
|
6
6
|
import { pushEntityProjectionTables, setupTestStack, } from "@cosmicdrift/kumiko-testing/stack";
|
|
7
7
|
import { logInfo } from "./dev-server-runtime.js";
|
|
8
8
|
import { isPersistentDevDb } from "./is-persistent-dev-db.js";
|
|
@@ -60,6 +60,7 @@ export async function bootDevStack(options, dbMode) {
|
|
|
60
60
|
// so application code sees the same interface in development and production.
|
|
61
61
|
redis: stack.redis.redis,
|
|
62
62
|
registry: stack.registry,
|
|
63
|
+
filesForTenant: makeFilesForTenant(stack.context),
|
|
63
64
|
metricsFor: createMetricsForFactory(stack.observability.meter),
|
|
64
65
|
dispatchSystemWrite: makeDispatchSystemWrite(stack.dispatcher),
|
|
65
66
|
dispatchSystemQuery: makeDispatchSystemQuery(stack.dispatcher),
|
|
@@ -3,6 +3,7 @@ import { spawn } from "node:child_process";
|
|
|
3
3
|
import { existsSync, mkdtempSync } from "node:fs";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join, resolve } from "node:path";
|
|
6
|
+
import { resolveInstalledSync } from "@cosmicdrift/kumiko-server-runtime/resolve-installed-package";
|
|
6
7
|
import { canResolveTailwindStylesheet, resolveTailwindCli, } from "@cosmicdrift/kumiko-server-runtime/resolve-tailwind-cli";
|
|
7
8
|
import { hasBun, logError, logInfo } from "./dev-server-runtime.js";
|
|
8
9
|
// Duplicated in packages/testing/src/e2e/constants.ts: the Playwright config
|
|
@@ -44,18 +45,15 @@ export function resolveStylesheet(options) {
|
|
|
44
45
|
// silently rather than reporting an error.
|
|
45
46
|
return undefined;
|
|
46
47
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (!canResolveTailwindStylesheet(resolved, { bun: Bun, cwd: process.cwd() })) {
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
return resolved;
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
48
|
+
const resolved = resolveInstalledSync("@cosmicdrift/kumiko-renderer/web/styles.css", process.cwd());
|
|
49
|
+
if (resolved === undefined) {
|
|
55
50
|
logError("[kumiko-server] couldn't auto-resolve @cosmicdrift/kumiko-renderer/web/styles.css — " +
|
|
56
|
-
"pass `stylesheet: <path>` or `stylesheet: false` explicitly."
|
|
51
|
+
"pass `stylesheet: <path>` or `stylesheet: false` explicitly.");
|
|
57
52
|
return undefined;
|
|
58
53
|
}
|
|
54
|
+
return canResolveTailwindStylesheet(resolved, { bun: Bun, cwd: process.cwd() })
|
|
55
|
+
? resolved
|
|
56
|
+
: undefined;
|
|
59
57
|
}
|
|
60
58
|
// The E2E template can only reach an app's own server entry through its env,
|
|
61
59
|
// so the env has to count whenever the option is left undefined.
|
|
@@ -13,6 +13,7 @@ function isDevServerManifest(value) {
|
|
|
13
13
|
}
|
|
14
14
|
// All @cosmicdrift packages release in lockstep (changesets fixed-group), so
|
|
15
15
|
// the dev-server's own version is the framework version.
|
|
16
|
+
// Exact (no caret): `kumiko check managed` rejects ranges on @cosmicdrift pins.
|
|
16
17
|
export function resolveFrameworkVersion(startDir = import.meta.dir) {
|
|
17
18
|
let dir = startDir;
|
|
18
19
|
while (true) {
|
|
@@ -21,7 +22,7 @@ export function resolveFrameworkVersion(startDir = import.meta.dir) {
|
|
|
21
22
|
// A corrupt or foreign package.json on the way up must not abort the search.
|
|
22
23
|
const manifest = parseJsonSafe(readFileSync(candidate, "utf-8"), undefined);
|
|
23
24
|
if (isDevServerManifest(manifest))
|
|
24
|
-
return
|
|
25
|
+
return manifest.version;
|
|
25
26
|
}
|
|
26
27
|
const parent = dirname(dir);
|
|
27
28
|
if (parent === dir)
|
|
@@ -92,6 +92,7 @@ function renderReleaseWorkflow(facts) {
|
|
|
92
92
|
infraRef: infraRef ?? DEFAULT_INFRA_REF,
|
|
93
93
|
}, { privateDeploy: visibility === "private", publicRollout: visibility === "public" });
|
|
94
94
|
}
|
|
95
|
+
const COMPOSE_ONLY_DEPLOY_FILE = "migrate-step.sh";
|
|
95
96
|
export function renderManagedTemplates(facts) {
|
|
96
97
|
const deploy = renderDeployFiles({
|
|
97
98
|
appName: facts.appName,
|
|
@@ -99,7 +100,10 @@ export function renderManagedTemplates(facts) {
|
|
|
99
100
|
ensuredRegistryConfigFiles: [BUNFIG_FILES.unit],
|
|
100
101
|
});
|
|
101
102
|
return [
|
|
102
|
-
...deploy.files
|
|
103
|
+
...deploy.files
|
|
104
|
+
// Managed apps migrate through the k3s release.yml InitContainer; migrate-step.sh is compose-only.
|
|
105
|
+
.filter((file) => file.output !== COMPOSE_ONLY_DEPLOY_FILE)
|
|
106
|
+
.map((file) => marked(`deploy/${file.output}`, file.content, "#", file.output.endsWith(".sh"))),
|
|
103
107
|
marked(".husky/pre-push", readTemplate("husky-pre-push.template"), "#", true),
|
|
104
108
|
marked(".github/workflows/cache-cleanup.yml", readTemplate("cache-cleanup.yml.template"), "#"),
|
|
105
109
|
marked(".github/workflows/release.yml", renderReleaseWorkflow(facts), "#"),
|
package/dist/run-dev-app-auth.js
CHANGED
|
@@ -148,6 +148,7 @@ export async function runDevAfterSetup(stack, ctx) {
|
|
|
148
148
|
admin: effectiveAuth?.admin,
|
|
149
149
|
shortcutSeeds: wiring.shortcutSeeds,
|
|
150
150
|
cipher: bootCrypto.configCipher,
|
|
151
|
+
processName: "runDevApp",
|
|
151
152
|
});
|
|
152
153
|
for (const seed of config.stackSeeds) {
|
|
153
154
|
await seed(stack);
|
|
@@ -86,7 +86,7 @@ export async function resolveDevBootConfig(options, bootFailure) {
|
|
|
86
86
|
warn: (message) => createFallbackLogger("runDevApp").warn(message),
|
|
87
87
|
});
|
|
88
88
|
const extraRoutes = collectDevExtraRoutes(options, unsubscribeRoutes, wiring);
|
|
89
|
-
const features = composeAppFeatures(options.features, wiring.features, effectiveAuth);
|
|
89
|
+
const features = composeAppFeatures(options.features, wiring.features, effectiveAuth, options.bundledLists);
|
|
90
90
|
return { stackSeeds, wiring, envSource, effectiveAuth, unsubscribeLinks, extraRoutes, features };
|
|
91
91
|
}
|
|
92
92
|
// An explicitly wired file provider (options.files) satisfies the
|
package/dist/run-dev-app.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SeedAdminOptions } from "@cosmicdrift/kumiko-bundled-features/auth-email-password/seeding";
|
|
2
2
|
import type { PostAuthLandingResolver } from "@cosmicdrift/kumiko-framework/api";
|
|
3
3
|
import type { KmsAdapter } from "@cosmicdrift/kumiko-framework/crypto";
|
|
4
|
-
import { type FeatureDefinition, type Registry, type ValidateBootOptions } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
|
+
import { type BundledListsOptions, type FeatureDefinition, type Registry, type ValidateBootOptions } from "@cosmicdrift/kumiko-framework/engine";
|
|
5
5
|
import type { ComposedEnvSchema } from "@cosmicdrift/kumiko-framework/env";
|
|
6
6
|
import type { ErrorDocsConfig } from "@cosmicdrift/kumiko-framework/errors";
|
|
7
7
|
import type { EnvelopeCipher, MasterKeyProvider } from "@cosmicdrift/kumiko-framework/secrets";
|
|
@@ -11,7 +11,7 @@ import type { TestStack } from "@cosmicdrift/kumiko-testing/stack";
|
|
|
11
11
|
import { type CreateKumikoServerOptions, type KumikoServerHandle } from "./create-kumiko-server.ts";
|
|
12
12
|
export type { AccountLockoutSetup, AccountUnlockSetup, AuthMailOptions, EmailVerificationSetup, InviteSetup, PasswordResetSetup, SignupSetup, } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
|
|
13
13
|
import type { AccountLockoutSetup, AccountUnlockSetup, AuthMailOptions, EmailVerificationSetup, InviteSetup, PasswordResetSetup, SignupSetup } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
|
|
14
|
-
import { type UnsubscribeOption } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
|
|
14
|
+
import { type ConfigOverridesInput, type UnsubscribeOption } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
|
|
15
15
|
export type RunDevAppAuthOptions = {
|
|
16
16
|
/** Admin user to seed at boot. Idempotent — re-runs in persistent-DB
|
|
17
17
|
* mode reuse the existing user. */
|
|
@@ -78,6 +78,8 @@ export type RunDevAppOptions = {
|
|
|
78
78
|
readonly features: readonly FeatureDefinition[];
|
|
79
79
|
/** Opt-in boot-validator warnings — see ValidateBootOptions. */
|
|
80
80
|
readonly validateBootOptions?: ValidateBootOptions;
|
|
81
|
+
/** One table block for every list of the bundled features, see ComposeFeaturesOptions.bundledLists. */
|
|
82
|
+
readonly bundledLists?: BundledListsOptions;
|
|
81
83
|
/** Browser entry module, bundled to /client.js. Mutually exclusive with
|
|
82
84
|
* `clientEntries`. */
|
|
83
85
|
readonly clientEntry?: string;
|
|
@@ -124,6 +126,8 @@ export type RunDevAppOptions = {
|
|
|
124
126
|
* no locale signal. Merged into AppContext before extraContext (app wins). */
|
|
125
127
|
readonly defaultLocale?: string;
|
|
126
128
|
readonly extraContext?: CreateKumikoServerOptions["extraContext"];
|
|
129
|
+
/** App-level config values, same semantics and merge as RunProdAppOptions["appOverrides"]. */
|
|
130
|
+
readonly appOverrides?: ConfigOverridesInput;
|
|
127
131
|
/** MasterKeyProvider for the automatically wired `ctx.secrets`. Defaults to
|
|
128
132
|
* `createEnvMasterKeyProvider`; override it for KMS backends. Only relevant
|
|
129
133
|
* when the secrets feature is mounted. Symmetric with runProdApp. */
|
|
@@ -200,4 +204,4 @@ export type RunDevAppOptions = {
|
|
|
200
204
|
readonly errorDocs?: ErrorDocsConfig;
|
|
201
205
|
};
|
|
202
206
|
export declare function runDevApp(options: RunDevAppOptions): Promise<KumikoServerHandle>;
|
|
203
|
-
export declare function mergeConfigResolverDefault(ctx: CreateKumikoServerOptions["extraContext"], registry: Registry, envSource: Record<string, string | undefined>, cipher?: EnvelopeCipher): CreateKumikoServerOptions["extraContext"];
|
|
207
|
+
export declare function mergeConfigResolverDefault(ctx: CreateKumikoServerOptions["extraContext"], registry: Registry, envSource: Record<string, string | undefined>, cipher?: EnvelopeCipher, appOverrides?: ConfigOverridesInput): CreateKumikoServerOptions["extraContext"];
|
package/dist/run-dev-app.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// For maximum control, such as custom auth wiring, a different membership
|
|
12
12
|
// query, or a custom LoginRateLimiter, use `createKumikoServer` directly from
|
|
13
13
|
// @cosmicdrift/kumiko-dev-server.
|
|
14
|
-
import {
|
|
14
|
+
import { createConfigResolver } from "@cosmicdrift/kumiko-bundled-features/config";
|
|
15
15
|
import { parseTrustedProxyHopsEnv, TRUSTED_PROXY_HOPS_ENV, } from "@cosmicdrift/kumiko-framework/api";
|
|
16
16
|
import { findTierResolverUsage, } from "@cosmicdrift/kumiko-framework/engine";
|
|
17
17
|
import { createKumikoServer, } from "./create-kumiko-server.js";
|
|
@@ -19,7 +19,7 @@ import { createDevLateBindings, createLateBoundEffectiveFeatures, runDevAfterSet
|
|
|
19
19
|
import { configureDevBootCrypto, resolveDevAuthRegistry, resolveDevBootConfig, validateDevBoot, } from "./run-dev-app-config.js";
|
|
20
20
|
import { buildDevServerOptions } from "./run-dev-app-server-options.js";
|
|
21
21
|
import { renderWelcomeBanner } from "./welcome-banner.js";
|
|
22
|
-
import { addConfigAccessorFactory, buildBootExtraContext, loggerFromExtraContext, } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
|
|
22
|
+
import { addConfigAccessorFactory, buildBootExtraContext, buildConfigOverrides, loggerFromExtraContext, } from "@cosmicdrift/kumiko-server-runtime/run-prod-app";
|
|
23
23
|
export async function runDevApp(options) {
|
|
24
24
|
const bootFailure = { release: undefined };
|
|
25
25
|
try {
|
|
@@ -105,7 +105,7 @@ function renderDevWelcomeBanner(options, config, handle) {
|
|
|
105
105
|
function buildDevExtraContext(options, config, registry, bootCrypto) {
|
|
106
106
|
const { features, envSource, unsubscribeLinks } = config;
|
|
107
107
|
const cfgExtra = registry
|
|
108
|
-
? mergeConfigResolverDefault(options.extraContext, registry, envSource, bootCrypto.configCipher)
|
|
108
|
+
? mergeConfigResolverDefault(options.extraContext, registry, envSource, bootCrypto.configCipher, options.appOverrides)
|
|
109
109
|
: options.extraContext;
|
|
110
110
|
return (deps) => {
|
|
111
111
|
const base = typeof cfgExtra === "function" ? cfgExtra(deps) : (cfgExtra ?? {});
|
|
@@ -133,10 +133,10 @@ function buildDevExtraContext(options, config, registry, bootCrypto) {
|
|
|
133
133
|
// pins that the dev configResolver-default carries the ENV→app-override bridge
|
|
134
134
|
// and that a caller-supplied configResolver still overrides it. Not re-exported
|
|
135
135
|
// from the package barrel (index.ts lists only runDevApp).
|
|
136
|
-
export function mergeConfigResolverDefault(ctx, registry, envSource, cipher) {
|
|
136
|
+
export function mergeConfigResolverDefault(ctx, registry, envSource, cipher, appOverrides) {
|
|
137
137
|
const defaults = {
|
|
138
138
|
configResolver: createConfigResolver({
|
|
139
|
-
appOverrides:
|
|
139
|
+
appOverrides: buildConfigOverrides(registry, envSource, appOverrides),
|
|
140
140
|
...(cipher && { cipher }),
|
|
141
141
|
}),
|
|
142
142
|
};
|
package/dist/scaffold-app.d.ts
CHANGED
|
@@ -27,7 +27,8 @@ export type ScaffoldAppOptions = {
|
|
|
27
27
|
* (the CLI's ctx.cwd) MUST pass it so the scaffold lands where the
|
|
28
28
|
* command's output claims it does. */
|
|
29
29
|
readonly cwd?: string;
|
|
30
|
-
/**
|
|
30
|
+
/** Exact version pin for @cosmicdrift/* deps. Default: the running framework version
|
|
31
|
+
* (resolveFrameworkVersion); scaffoldApp throws when that cannot be resolved. */
|
|
31
32
|
readonly frameworkVersion?: string;
|
|
32
33
|
/** Bundled-features to mount in run-config.ts. Default: secrets + auth-foundation + sessions
|
|
33
34
|
* (the historical foundation). create-kumiko-app passes the picker output
|
package/dist/scaffold-app.js
CHANGED
|
@@ -21,7 +21,9 @@ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
|
21
21
|
import { dirname, join, resolve } from "node:path";
|
|
22
22
|
import { APP_CONFIG_FILE } from "@cosmicdrift/kumiko-framework/config";
|
|
23
23
|
import { collectTableMetas, generateMigration, writeSnapshotJson, } from "@cosmicdrift/kumiko-framework/db";
|
|
24
|
+
import { escapeHtml } from "@cosmicdrift/kumiko-renderer/headless";
|
|
24
25
|
import { composeFeatures } from "@cosmicdrift/kumiko-server-runtime/compose-features";
|
|
26
|
+
import { resolveFrameworkVersion } from "./framework-version.js";
|
|
25
27
|
import { isKebabSegment } from "./kebab.js";
|
|
26
28
|
import { CURRENT_INFRA_REF, PREPARE_SCRIPT, resolveManagedAppFacts, syncManagedFiles, } from "./managed-files/index.js";
|
|
27
29
|
import { renderAgentsMd, renderClaudeMd, renderMountedFeatureList } from "./scaffold-agent-docs.js";
|
|
@@ -45,7 +47,10 @@ export async function scaffoldApp(options) {
|
|
|
45
47
|
if (existsSync(destination)) {
|
|
46
48
|
throw new Error(`scaffoldApp: ${destination} already exists — refusing to overwrite`);
|
|
47
49
|
}
|
|
48
|
-
const version = options.frameworkVersion ??
|
|
50
|
+
const version = options.frameworkVersion ?? resolveFrameworkVersion();
|
|
51
|
+
if (version === undefined) {
|
|
52
|
+
throw new Error("scaffoldApp: cannot resolve the framework version; pass frameworkVersion explicitly");
|
|
53
|
+
}
|
|
49
54
|
const testSetup = options.testSetup?.({ appName: options.name, frameworkVersion: version });
|
|
50
55
|
mkdirSync(join(destination, "bin"), { recursive: true });
|
|
51
56
|
mkdirSync(join(destination, "src"), { recursive: true });
|
|
@@ -84,6 +89,9 @@ export async function scaffoldApp(options) {
|
|
|
84
89
|
files.push("src/client.tsx");
|
|
85
90
|
write(join(destination, "src", "styles.css"), renderStylesCss());
|
|
86
91
|
files.push("src/styles.css");
|
|
92
|
+
mkdirSync(join(destination, "public"), { recursive: true });
|
|
93
|
+
write(join(destination, "public", "index.html"), renderIndexHtml(options.name));
|
|
94
|
+
files.push("public/index.html");
|
|
87
95
|
write(join(destination, ".env.example"), renderEnvExample(options.name));
|
|
88
96
|
files.push(".env.example");
|
|
89
97
|
write(join(destination, "docker-compose.yml"), renderDockerCompose());
|
|
@@ -161,7 +169,7 @@ function renderPackageJson(name, version, testSetup, infraRef) {
|
|
|
161
169
|
"@tailwindcss/cli": "^4.3.0",
|
|
162
170
|
"@types/react": "^19.2.0",
|
|
163
171
|
"@types/react-dom": "^19.2.0",
|
|
164
|
-
"bun-types": "^1.4.
|
|
172
|
+
"bun-types": "^1.4.4",
|
|
165
173
|
tailwindcss: "^4.3.0",
|
|
166
174
|
typescript: "^6.0.3",
|
|
167
175
|
...testSetup?.devDependencies,
|
|
@@ -552,6 +560,8 @@ services:
|
|
|
552
560
|
# Pinned to the project's own compose-file tag (663/1) — Alpine variant
|
|
553
561
|
# (~90MB vs ~400MB) and a reproducible patch version, bump on PG18 minors.
|
|
554
562
|
image: postgres:18.3-alpine
|
|
563
|
+
# Bun.SQL dials its whole pool eagerly; the default of 100 is too tight for app + tests.
|
|
564
|
+
command: postgres -c max_connections=300
|
|
555
565
|
environment:
|
|
556
566
|
POSTGRES_USER: postgres
|
|
557
567
|
POSTGRES_PASSWORD: postgres
|
|
@@ -660,6 +670,23 @@ Files whose first line reads \`kumiko-managed\` (deploy/, .github/workflows/,
|
|
|
660
670
|
For full docs see https://docs.kumiko.rocks.
|
|
661
671
|
`;
|
|
662
672
|
}
|
|
673
|
+
// No inline script: CSP is script-src 'self'.
|
|
674
|
+
function renderIndexHtml(appName) {
|
|
675
|
+
return `<!doctype html>
|
|
676
|
+
<html lang="en">
|
|
677
|
+
<head>
|
|
678
|
+
<meta charset="utf-8" />
|
|
679
|
+
<meta name="viewport" content="width=device-width,initial-scale=1,interactive-widget=resizes-content" />
|
|
680
|
+
<title>${escapeHtml(appName)}</title>
|
|
681
|
+
<link rel="stylesheet" href="/styles.css" />
|
|
682
|
+
</head>
|
|
683
|
+
<body>
|
|
684
|
+
<div id="root"></div>
|
|
685
|
+
<script type="module" src="/client.js"></script>
|
|
686
|
+
</body>
|
|
687
|
+
</html>
|
|
688
|
+
`;
|
|
689
|
+
}
|
|
663
690
|
function renderStylesCss() {
|
|
664
691
|
return [
|
|
665
692
|
'@import "@cosmicdrift/kumiko-renderer/web/styles.css";',
|
|
@@ -5,6 +5,7 @@ export type TestStackPreset = "config" | "template-resolver";
|
|
|
5
5
|
export type SetupTestStackFromFeaturesOptions = Omit<TestStackOptions, "features"> & {
|
|
6
6
|
readonly includeBundled?: boolean;
|
|
7
7
|
readonly authOptions?: ComposeFeaturesOptions["authOptions"];
|
|
8
|
+
readonly bundledLists?: ComposeFeaturesOptions["bundledLists"];
|
|
8
9
|
readonly presets?: readonly TestStackPreset[];
|
|
9
10
|
};
|
|
10
11
|
export declare function mergeExtraContext(base: TestStackOptions["extraContext"], presets: readonly TestStackPreset[]): TestStackOptions["extraContext"];
|
|
@@ -36,8 +36,12 @@ export function mergeExtraContext(base, presets) {
|
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
export async function setupTestStackFromFeatures(appFeatures, options = {}) {
|
|
39
|
-
const { includeBundled = false, authOptions, presets = [], ...stackOptions } = options;
|
|
40
|
-
const features = composeFeatures(appFeatures, {
|
|
39
|
+
const { includeBundled = false, authOptions, bundledLists, presets = [], ...stackOptions } = options;
|
|
40
|
+
const features = composeFeatures(appFeatures, {
|
|
41
|
+
includeBundled,
|
|
42
|
+
authOptions,
|
|
43
|
+
...(bundledLists && { bundledLists }),
|
|
44
|
+
});
|
|
41
45
|
const extraContext = mergeExtraContext(stackOptions.extraContext, presets);
|
|
42
46
|
// Same run-logger wiring as prod, so jobs that declare tenantVisibleFailure
|
|
43
47
|
// write their failure rows in tests too.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-dev-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.389.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": "MIT",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -77,18 +77,23 @@
|
|
|
77
77
|
"kumiko-upgrade": "./bin/kumiko-upgrade.ts"
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
-
"@cosmicdrift/kumiko-bundled-features": "0.
|
|
81
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
82
|
-
"@cosmicdrift/kumiko-renderer": "0.
|
|
83
|
-
"@cosmicdrift/kumiko-renderer-mail-html": "0.
|
|
84
|
-
"@cosmicdrift/kumiko-guards": "0.
|
|
85
|
-
"@cosmicdrift/kumiko-server-runtime": "0.
|
|
86
|
-
"@cosmicdrift/kumiko-testing": "0.
|
|
87
|
-
"@cosmicdrift/kumiko-types": "0.
|
|
88
|
-
"bun-types": "^1.3.13",
|
|
80
|
+
"@cosmicdrift/kumiko-bundled-features": "0.389.0",
|
|
81
|
+
"@cosmicdrift/kumiko-framework": "0.389.0",
|
|
82
|
+
"@cosmicdrift/kumiko-renderer": "0.389.0",
|
|
83
|
+
"@cosmicdrift/kumiko-renderer-mail-html": "0.389.0",
|
|
84
|
+
"@cosmicdrift/kumiko-guards": "0.389.0",
|
|
85
|
+
"@cosmicdrift/kumiko-server-runtime": "0.389.0",
|
|
86
|
+
"@cosmicdrift/kumiko-testing": "0.389.0",
|
|
87
|
+
"@cosmicdrift/kumiko-types": "0.389.0",
|
|
89
88
|
"ts-morph": "^28.0.0",
|
|
90
89
|
"zod": "^4.4.3"
|
|
91
90
|
},
|
|
91
|
+
"peerDependencies": {
|
|
92
|
+
"bun-types": "^1.4.4"
|
|
93
|
+
},
|
|
94
|
+
"devDependencies": {
|
|
95
|
+
"bun-types": "^1.4.4"
|
|
96
|
+
},
|
|
92
97
|
"publishConfig": {
|
|
93
98
|
"registry": "https://registry.npmjs.org",
|
|
94
99
|
"access": "public",
|
package/src/changes.json
CHANGED
|
@@ -1,4 +1,35 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.389.0",
|
|
4
|
+
"type": "improvement",
|
|
5
|
+
"title": "Scaffolded apps pin Bun 1.4.4",
|
|
6
|
+
"detail": "The deploy Dockerfile template, the managed public CI workflow and the scaffolded bun-types range move from Bun 1.4.0 to 1.4.4, the minimum the Bun.SQL driver needs. The managed CI workflow updates on the next sync; the deploy Dockerfile is only written at scaffold time.",
|
|
7
|
+
"migration": "Raise BUN_VERSION in an existing deploy Dockerfile to 1.4.4 and bun-types to ^1.4.4 by hand."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"version": "0.389.0",
|
|
11
|
+
"type": "improvement",
|
|
12
|
+
"title": "Scaffolded docker-compose raises Postgres max_connections to 300",
|
|
13
|
+
"detail": "Bun.SQL dials its whole pool eagerly, so the default limit of 100 is too tight for an app plus its tests. Existing apps can add command postgres -c max_connections=300 to the postgres service."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"version": "0.389.0",
|
|
17
|
+
"type": "fix",
|
|
18
|
+
"title": "Fresh scaffolds build with bun run build",
|
|
19
|
+
"detail": "create-kumiko-app now writes public/index.html with the /styles.css and /client.js placeholders. Without it kumiko-build stopped with a missing-template error, so the scaffolded Dockerfile could not build either."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"version": "0.389.0",
|
|
23
|
+
"type": "fix",
|
|
24
|
+
"title": "Scaffolded apps get exact framework pins",
|
|
25
|
+
"detail": "resolveFrameworkVersion no longer prefixes ^ and scaffoldApp no longer falls back to \"*\", so a new app is green in kumiko check managed. Without a resolvable version and without an explicit frameworkVersion, scaffoldApp throws."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"version": "0.389.0",
|
|
29
|
+
"type": "improvement",
|
|
30
|
+
"title": "migrate-step.sh leaves the managed file set",
|
|
31
|
+
"detail": "Managed apps run migrations as the k3s InitContainer from release.yml, so deploy/migrate-step.sh is neither scaffolded nor synced for them. Delete it if present. kumiko-init-deploy keeps generating it for compose self-hosting."
|
|
32
|
+
},
|
|
2
33
|
{
|
|
3
34
|
"version": "0.388.0",
|
|
4
35
|
"type": "improvement",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#
|
|
12
12
|
# Build context: repository root (the full source tree is only used in the build stage).
|
|
13
13
|
|
|
14
|
-
ARG BUN_VERSION=1.4.
|
|
14
|
+
ARG BUN_VERSION=1.4.4
|
|
15
15
|
{{#hasPrivateGhPackages}}
|
|
16
16
|
# Registry auth for @cosmicdriftgamestudio: CI passes the token as
|
|
17
17
|
# NPM_AUTH_TOKEN via --build-arg. Multi-stage ARG scoping needs the
|
|
@@ -69,7 +69,8 @@ RUN bun install --production --frozen-lockfile
|
|
|
69
69
|
# Client build (static assets) — served by runProdApp.staticDir.
|
|
70
70
|
COPY --from=build --chown=app:app /app/dist ./dist
|
|
71
71
|
|
|
72
|
-
# Checked-in SQL migrations for the pre-deploy `kumiko schema apply` step
|
|
72
|
+
# Checked-in SQL migrations for the pre-deploy `kumiko schema apply` step
|
|
73
|
+
# (k3s InitContainer from release.yml, or migrate-step.sh on compose hosts).
|
|
73
74
|
# The shipped `kumiko-schema` bin reads `${INIT_CWD}/kumiko/migrations/*.sql`
|
|
74
75
|
# (see ENV INIT_CWD=/app below). kumiko/schema.ts is NOT needed at runtime
|
|
75
76
|
# (only generate reads it; apply is checksum-tracked SQL only).
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
fetch-depth: 0
|
|
32
32
|
- uses: oven-sh/setup-bun@v2
|
|
33
33
|
with:
|
|
34
|
-
bun-version: "1.4.
|
|
34
|
+
bun-version: "1.4.4"
|
|
35
35
|
- run: bun install --frozen-lockfile
|
|
36
36
|
- run: bun run typecheck
|
|
37
37
|
- run: bun run lint
|
|
@@ -81,7 +81,7 @@ jobs:
|
|
|
81
81
|
- uses: actions/checkout@v7
|
|
82
82
|
- uses: oven-sh/setup-bun@v2
|
|
83
83
|
with:
|
|
84
|
-
bun-version: "1.4.
|
|
84
|
+
bun-version: "1.4.4"
|
|
85
85
|
- run: bun install --frozen-lockfile
|
|
86
86
|
- name: Create test database
|
|
87
87
|
env:
|
|
@@ -22,6 +22,7 @@ const HAS_AUTH =
|
|
|
22
22
|
|
|
23
23
|
export const FEATURES: readonly FeatureDefinition[] = composeFeatures([...CONFIGURED_FEATURES], {
|
|
24
24
|
includeBundled: HAS_AUTH,
|
|
25
|
+
...(appConfig.bundledLists && { bundledLists: appConfig.bundledLists }),
|
|
25
26
|
});
|
|
26
27
|
|
|
27
28
|
// `kumiko check` validates the boot with the options kumiko.config.ts declares.
|