@cosmicdrift/kumiko-bundled-features 0.151.1 → 0.152.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 +6 -6
- package/src/auth-mfa/feature.ts +1 -1
- package/src/config/__tests__/config.integration.test.ts +4 -4
- package/src/custom-fields/entity.ts +1 -1
- package/src/file-foundation/feature.ts +1 -1
- package/src/inbound-mail-foundation/entities.ts +1 -1
- package/src/jobs/job-run-table.ts +1 -1
- package/src/mail-foundation/feature.ts +1 -1
- package/src/secrets/table.ts +1 -1
- package/src/user-data-rights/feature.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-bundled-features",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.152.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.
|
|
119
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
120
|
-
"@cosmicdrift/kumiko-headless": "0.
|
|
121
|
-
"@cosmicdrift/kumiko-renderer": "0.
|
|
122
|
-
"@cosmicdrift/kumiko-renderer-web": "0.
|
|
118
|
+
"@cosmicdrift/kumiko-dispatcher-live": "0.152.0",
|
|
119
|
+
"@cosmicdrift/kumiko-framework": "0.152.0",
|
|
120
|
+
"@cosmicdrift/kumiko-headless": "0.152.0",
|
|
121
|
+
"@cosmicdrift/kumiko-renderer": "0.152.0",
|
|
122
|
+
"@cosmicdrift/kumiko-renderer-web": "0.152.0",
|
|
123
123
|
"@mollie/api-client": "^4.5.0",
|
|
124
124
|
"imapflow": "^1.3.3",
|
|
125
125
|
"mailparser": "^3.9.8",
|
package/src/auth-mfa/feature.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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),
|
|
@@ -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.
|
|
139
|
+
const providerConfigKey = r.config(
|
|
140
140
|
"provider",
|
|
141
141
|
createTenantConfig("text", {
|
|
142
142
|
default: "",
|
package/src/secrets/table.ts
CHANGED
|
@@ -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
|
|
|
@@ -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.
|
|
164
|
+
r.config(
|
|
165
165
|
"tenantModel",
|
|
166
166
|
createSystemConfig("select", {
|
|
167
167
|
default: "multi-user",
|