@cosmicdrift/kumiko-dev-server 0.66.0 → 0.67.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.
Files changed (2) hide show
  1. package/package.json +3 -3
  2. package/src/run-dev-app.ts +22 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-dev-server",
3
- "version": "0.66.0",
3
+ "version": "0.67.0",
4
4
  "description": "Development server bootstrap for Kumiko apps. Bundles the client, mints dev-JWTs, injects the resolved AppSchema, and seeds an admin. Not for production.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -50,8 +50,8 @@
50
50
  "kumiko-schema-check": "./bin/kumiko-schema-check.ts"
51
51
  },
52
52
  "dependencies": {
53
- "@cosmicdrift/kumiko-bundled-features": "0.66.0",
54
- "@cosmicdrift/kumiko-framework": "0.66.0",
53
+ "@cosmicdrift/kumiko-bundled-features": "0.67.0",
54
+ "@cosmicdrift/kumiko-framework": "0.67.0",
55
55
  "ts-morph": "^28.0.0"
56
56
  },
57
57
  "publishConfig": {
@@ -234,18 +234,28 @@ export async function runDevApp(options: RunDevAppOptions): Promise<KumikoServer
234
234
  const finalEffectiveFeatures: EffectiveFeaturesResolver | undefined =
235
235
  options.effectiveFeatures ??
236
236
  (tierResolverUsage
237
- ? (tenantId: TenantId) => {
238
- // Defensive: Server starts AFTER onAfterSetup completes, so the
239
- // resolver is filled before any request comes in. Throwing here
240
- // means a programming error (boot order) rather than silent
241
- // "all-features-on" misbehavior.
242
- if (!tierResolverHolder.resolver) {
243
- throw new Error(
244
- "tier-resolver: extension found but resolver not yet built — boot order issue?",
245
- );
246
- }
247
- return tierResolverHolder.resolver(tenantId);
248
- }
237
+ ? Object.assign(
238
+ (tenantId: TenantId) => {
239
+ // Defensive: Server starts AFTER onAfterSetup completes, so the
240
+ // resolver is filled before any request comes in. Throwing here
241
+ // means a programming error (boot order) rather than silent
242
+ // "all-features-on" misbehavior.
243
+ if (!tierResolverHolder.resolver) {
244
+ throw new Error(
245
+ "tier-resolver: extension found but resolver not yet built — boot order issue?",
246
+ );
247
+ }
248
+ return tierResolverHolder.resolver(tenantId);
249
+ },
250
+ {
251
+ // Late-bind: der echte trialGate hängt erst nach plugin.build() am
252
+ // holder.resolver. Delegieren (nicht kopieren), weil dieses
253
+ // Wrapper-Closure vor build() konstruiert wird. Kein Trial → false.
254
+ trialGate: (tenantId: TenantId, featureName: string): Promise<boolean> =>
255
+ tierResolverHolder.resolver?.trialGate?.(tenantId, featureName) ??
256
+ Promise.resolve(false),
257
+ },
258
+ )
249
259
  : undefined);
250
260
 
251
261
  // configResolver-default fürs config-feature — im auth-mode immer