@cosmicdrift/kumiko-bundled-features 0.151.1 → 0.153.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-bundled-features",
3
- "version": "0.151.1",
3
+ "version": "0.153.0",
4
4
  "description": "Built-in features — tenant, user, auth, delivery. The stuff you'd rewrite anyway, already typed.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -115,11 +115,11 @@
115
115
  "./step-dispatcher": "./src/step-dispatcher/index.ts"
116
116
  },
117
117
  "dependencies": {
118
- "@cosmicdrift/kumiko-dispatcher-live": "0.151.1",
119
- "@cosmicdrift/kumiko-framework": "0.151.1",
120
- "@cosmicdrift/kumiko-headless": "0.151.1",
121
- "@cosmicdrift/kumiko-renderer": "0.151.1",
122
- "@cosmicdrift/kumiko-renderer-web": "0.151.1",
118
+ "@cosmicdrift/kumiko-dispatcher-live": "0.153.0",
119
+ "@cosmicdrift/kumiko-framework": "0.153.0",
120
+ "@cosmicdrift/kumiko-headless": "0.153.0",
121
+ "@cosmicdrift/kumiko-renderer": "0.153.0",
122
+ "@cosmicdrift/kumiko-renderer-web": "0.153.0",
123
123
  "@mollie/api-client": "^4.5.0",
124
124
  "imapflow": "^1.3.3",
125
125
  "mailparser": "^3.9.8",
@@ -84,7 +84,7 @@ export function createAuthMfaFeature(opts: AuthMfaFeatureOptions): FeatureDefini
84
84
  // the app boots clean and the first MFA login dies at runtime on an
85
85
  // unknown handler instead of failing at mount time.
86
86
  r.requires("tenant");
87
- r.configKey("required", mfaRequiredConfigKey());
87
+ r.config("required", mfaRequiredConfigKey());
88
88
 
89
89
  // Dormant custom-screen — the client maps MFA_ENABLE_SCREEN_ID to
90
90
  // MfaEnableScreen (see personal-access-tokens/feature.ts for the same
@@ -131,11 +131,11 @@ const ordersFeature = defineFeature("orders", (r) => {
131
131
  });
132
132
  });
133
133
 
134
- // r.configKey() shorthand — single-key sibling of r.config({keys}), same
134
+ // r.config() shorthand — single-key sibling of r.config({keys}), same
135
135
  // wiring end-to-end (registry → resolver → ctx.config). No seeds needed here.
136
136
  const configKeyDemoFeature = defineFeature("configkeydemo", (r) => {
137
137
  r.requires("config");
138
- const betaEnabled = r.configKey(
138
+ const betaEnabled = r.config(
139
139
  "betaEnabled",
140
140
  createTenantConfig("boolean", { default: false, write: access.roles("Admin") }),
141
141
  );
@@ -810,14 +810,14 @@ describe("ctx.config() in handler context", () => {
810
810
  // broad union instead of the narrowed primitive.
811
811
  expect(typeof probe.orders).toBe("number");
812
812
  expect(typeof probe.push).toBe("boolean");
813
- // r.configKey()'s handle goes through the exact same ctx.config() path.
813
+ // r.config()'s handle goes through the exact same ctx.config() path.
814
814
  // (value-level check — true vs. false — is covered by the next test,
815
815
  // which reads via configFn without the narrowing hazard of a plain
816
816
  // `undefined`-initialized probe field.)
817
817
  expect(typeof probe.betaEnabled).toBe("boolean");
818
818
  });
819
819
 
820
- test("r.configKey() value is settable/readable via ctx.config, same as r.config", async () => {
820
+ test("r.config() single-key form value is settable/readable via ctx.config", async () => {
821
821
  expect(configKeyDemoFeature.exports.betaEnabled.name).toBe("configkeydemo:config:beta-enabled");
822
822
 
823
823
  const configFn = createConfigAccessor(
@@ -78,7 +78,7 @@ export const fieldDefinitionEntity = createEntity({
78
78
  searchable: createBooleanField({ required: true }),
79
79
 
80
80
  // UI-Display-Order. Tenant kann seine Felder via UI sortieren.
81
- displayOrder: createNumberField({ required: true }),
81
+ displayOrder: createNumberField({ required: true, integer: true }),
82
82
 
83
83
  // Builder-Reuse: serialisierter r.field.X(opts)-Output als jsonb.
84
84
  // Beinhaltet type-options (enum-values, money-currency, embedded-schema),
@@ -54,7 +54,7 @@ export const fileFoundationFeature = defineFeature(FEATURE_NAME, (r) => {
54
54
  },
55
55
  });
56
56
 
57
- const providerConfigKey = r.configKey(
57
+ const providerConfigKey = r.config(
58
58
  "provider",
59
59
  createTenantConfig("text", {
60
60
  default: "",
@@ -83,7 +83,7 @@ export const mailThreadEntity = createEntity({
83
83
  threadKey: createTextField({ required: true, maxLength: 500 }),
84
84
  subject: createTextField({ maxLength: 4000, tenantOwned: true }),
85
85
  lastMessageAt: createTimestampField({ required: true }),
86
- messageCount: createNumberField({ required: true }),
86
+ messageCount: createNumberField({ required: true, integer: true }),
87
87
  },
88
88
  });
89
89
 
@@ -45,7 +45,7 @@ export const jobRunEntity = createEntity({
45
45
  status: createTextField({ required: true }),
46
46
  payload: createTextField(),
47
47
  error: createTextField(),
48
- attempt: createNumberField({ required: true, default: 1 }),
48
+ attempt: createNumberField({ required: true, default: 1, integer: true }),
49
49
  startedAt: createTimestampField({ required: true }),
50
50
  finishedAt: createTimestampField(),
51
51
  duration: createNumberField(),
@@ -136,7 +136,7 @@ export const mailFoundationFeature = defineFeature(FEATURE_NAME, (r) => {
136
136
  // values lives in the registered plugins, not here — Designer-UI can
137
137
  // render `getExtensionUsages("mailTransport").map(u => u.entityName)`
138
138
  // as the option-list.
139
- const providerConfigKey = r.configKey(
139
+ const providerConfigKey = r.config(
140
140
  "provider",
141
141
  createTenantConfig("text", {
142
142
  default: "",
@@ -49,7 +49,7 @@ export const tenantSecretEntity = createEntity({
49
49
  table: "read_tenant_secrets",
50
50
  fields: {
51
51
  key: createTextField({ required: true }),
52
- kekVersion: createNumberField({ required: true }),
52
+ kekVersion: createNumberField({ required: true, integer: true }),
53
53
  },
54
54
  });
55
55
 
@@ -19,7 +19,6 @@
19
19
  // 3. Idempotency: tenant-update fired keinen weiteren row
20
20
 
21
21
  import { afterAll, beforeAll, describe, expect, test } from "bun:test";
22
- import { composeFeatures } from "@cosmicdrift/kumiko-dev-server/compose-features";
23
22
  import { selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
24
23
  import { buildEntityTable } from "@cosmicdrift/kumiko-framework/db";
25
24
  import {
@@ -28,6 +27,7 @@ import {
28
27
  type TestStack,
29
28
  unsafePushTables,
30
29
  } from "@cosmicdrift/kumiko-framework/stack";
30
+ import { composeFeatures } from "@cosmicdrift/kumiko-server-runtime/compose-features";
31
31
  import { configValuesTable } from "../../config";
32
32
  import { TenantHandlers, tenantMembershipsTable, tenantTable } from "../../tenant";
33
33
  import { userTable } from "../../user";
@@ -20,7 +20,6 @@ import { tenantSecretsTable } from "@cosmicdrift/kumiko-bundled-features/secrets
20
20
  import { tenantMembershipsTable, tenantTable } from "@cosmicdrift/kumiko-bundled-features/tenant";
21
21
  import { seedTenant } from "@cosmicdrift/kumiko-bundled-features/tenant/seeding";
22
22
  import { userTable } from "@cosmicdrift/kumiko-bundled-features/user";
23
- import { composeFeatures } from "@cosmicdrift/kumiko-dev-server/compose-features";
24
23
  import { asRawClient } from "@cosmicdrift/kumiko-framework/bun-db";
25
24
  import { buildEntityTable } from "@cosmicdrift/kumiko-framework/db";
26
25
  import {
@@ -36,6 +35,7 @@ import {
36
35
  type TestStack,
37
36
  unsafePushTables,
38
37
  } from "@cosmicdrift/kumiko-framework/stack";
38
+ import { composeFeatures } from "@cosmicdrift/kumiko-server-runtime/compose-features";
39
39
  import type { TierMap } from "../compose-app";
40
40
  import { tierAssignmentEntity } from "../entity";
41
41
  import { createTierEngineFeature } from "../feature";
@@ -161,7 +161,7 @@ export function createUserDataRightsFeature(opts: UserDataRightsOptions = {}): F
161
161
  // "single-user" via appOverrides (TENANT_MODEL_CONFIG_KEY) so the forget
162
162
  // pipeline may erase the tenant's data as that user's personal data — still
163
163
  // gated by a runtime sole-member check in run-forget-cleanup.
164
- r.configKey(
164
+ r.config(
165
165
  "tenantModel",
166
166
  createSystemConfig("select", {
167
167
  default: "multi-user",