@cosmicdrift/kumiko-bundled-features 0.332.0 → 0.334.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/audit/handlers/list.query.js +4 -3
- package/dist/auth-email-password/handlers/invite-create.write.d.ts +2 -1
- package/dist/auth-email-password/handlers/invite-create.write.js +2 -2
- package/dist/auth-mfa/schema/user-mfa.d.ts +6 -0
- package/dist/billing-foundation/entities.d.ts +8 -0
- package/dist/billing-foundation/projection.d.ts +8 -0
- package/dist/cap-counter/entity.d.ts +1 -0
- package/dist/compliance-profiles/schema/profile-selection.d.ts +2 -2
- package/dist/config/table.d.ts +6 -0
- package/dist/config/web/i18n.js +12 -4
- package/dist/custom-fields/entity.d.ts +4 -0
- package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -0
- package/dist/delivery/tables.d.ts +6 -0
- package/dist/document-ingest-foundation/entity.d.ts +4 -0
- package/dist/file-provider-s3/feature.js +1 -1
- package/dist/folders/entity.d.ts +8 -0
- package/dist/form-draft/entity.d.ts +2 -0
- package/dist/inbound-mail-foundation/entities.d.ts +25 -0
- package/dist/inbound-mail-foundation/projection.d.ts +20 -0
- package/dist/jobs/job-run-table.d.ts +6 -0
- package/dist/ledger/entity.d.ts +16 -3
- package/dist/managed-pages/table.d.ts +12 -0
- package/dist/notes-history/entity.d.ts +12 -0
- package/dist/personal-access-tokens/schema/api-token.d.ts +6 -0
- package/dist/secrets/table.d.ts +1 -0
- package/dist/sessions/schema/user-session.d.ts +4 -0
- package/dist/subscription-stripe/feature.js +3 -3
- package/dist/tags/entity.d.ts +9 -0
- package/dist/template-resolver/table.d.ts +18 -8
- package/dist/template-resolver/user-content-table.d.ts +14 -4
- package/dist/tenant/constants.d.ts +1 -1
- package/dist/tenant/constants.js +7 -1
- package/dist/tenant/feature.d.ts +4 -1
- package/dist/tenant/feature.js +13 -4
- package/dist/tenant/handlers/update-member-roles.write.js +2 -2
- package/dist/tenant/i18n.js +2 -0
- package/dist/tenant/index.d.ts +1 -1
- package/dist/tenant/index.js +1 -1
- package/dist/tenant/invitation-table.d.ts +8 -2
- package/dist/tenant/membership-table.d.ts +4 -0
- package/dist/tenant/schema/tenant.d.ts +8 -2
- package/dist/tenant/screens.d.ts +59 -3
- package/dist/tenant/screens.js +54 -36
- package/dist/tenant-settings/feature.js +9 -6
- package/dist/tier-engine/entity.d.ts +2 -0
- package/dist/tier-engine/tier-resolver.d.ts +2 -0
- package/dist/user/schema/user.d.ts +14 -2
- package/dist/user-data-rights/run-user-export.js +6 -2
- package/dist/user-data-rights/schema/download-attempt.d.ts +14 -0
- package/dist/user-data-rights/schema/download-token.d.ts +8 -0
- package/dist/user-data-rights/schema/export-job.d.ts +8 -2
- package/package.json +9 -9
- package/src/tenant/changes.json +5 -0
|
@@ -10,6 +10,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
|
|
|
10
10
|
readonly filterable?: boolean;
|
|
11
11
|
readonly encrypted?: boolean;
|
|
12
12
|
readonly sensitive?: boolean;
|
|
13
|
+
readonly writeOnly?: boolean;
|
|
13
14
|
readonly readAsInstruction?: boolean;
|
|
14
15
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
15
16
|
readonly default?: string;
|
|
@@ -30,6 +31,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
|
|
|
30
31
|
readonly filterable?: boolean;
|
|
31
32
|
readonly encrypted?: boolean;
|
|
32
33
|
readonly sensitive?: boolean;
|
|
34
|
+
readonly writeOnly?: boolean;
|
|
33
35
|
readonly readAsInstruction?: boolean;
|
|
34
36
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
35
37
|
readonly default?: string;
|
|
@@ -50,6 +52,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
|
|
|
50
52
|
readonly filterable?: boolean;
|
|
51
53
|
readonly encrypted?: boolean;
|
|
52
54
|
readonly sensitive?: boolean;
|
|
55
|
+
readonly writeOnly?: boolean;
|
|
53
56
|
readonly readAsInstruction?: boolean;
|
|
54
57
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
55
58
|
readonly default?: string;
|
|
@@ -70,6 +73,7 @@ export declare function createNoteEntryEntity(access?: EntityDefinition["access"
|
|
|
70
73
|
readonly filterable?: boolean;
|
|
71
74
|
readonly encrypted?: boolean;
|
|
72
75
|
readonly sensitive?: boolean;
|
|
76
|
+
readonly writeOnly?: boolean;
|
|
73
77
|
readonly readAsInstruction?: boolean;
|
|
74
78
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
75
79
|
readonly default?: string;
|
|
@@ -108,6 +112,7 @@ export declare const noteEntryEntity: EntityDefinition<{
|
|
|
108
112
|
readonly filterable?: boolean;
|
|
109
113
|
readonly encrypted?: boolean;
|
|
110
114
|
readonly sensitive?: boolean;
|
|
115
|
+
readonly writeOnly?: boolean;
|
|
111
116
|
readonly readAsInstruction?: boolean;
|
|
112
117
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
113
118
|
readonly default?: string;
|
|
@@ -128,6 +133,7 @@ export declare const noteEntryEntity: EntityDefinition<{
|
|
|
128
133
|
readonly filterable?: boolean;
|
|
129
134
|
readonly encrypted?: boolean;
|
|
130
135
|
readonly sensitive?: boolean;
|
|
136
|
+
readonly writeOnly?: boolean;
|
|
131
137
|
readonly readAsInstruction?: boolean;
|
|
132
138
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
133
139
|
readonly default?: string;
|
|
@@ -148,6 +154,7 @@ export declare const noteEntryEntity: EntityDefinition<{
|
|
|
148
154
|
readonly filterable?: boolean;
|
|
149
155
|
readonly encrypted?: boolean;
|
|
150
156
|
readonly sensitive?: boolean;
|
|
157
|
+
readonly writeOnly?: boolean;
|
|
151
158
|
readonly readAsInstruction?: boolean;
|
|
152
159
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
153
160
|
readonly default?: string;
|
|
@@ -168,6 +175,7 @@ export declare const noteEntryEntity: EntityDefinition<{
|
|
|
168
175
|
readonly filterable?: boolean;
|
|
169
176
|
readonly encrypted?: boolean;
|
|
170
177
|
readonly sensitive?: boolean;
|
|
178
|
+
readonly writeOnly?: boolean;
|
|
171
179
|
readonly readAsInstruction?: boolean;
|
|
172
180
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
173
181
|
readonly default?: string;
|
|
@@ -206,6 +214,7 @@ export declare function createNoteMentionEntity(): EntityDefinition<{
|
|
|
206
214
|
readonly filterable?: boolean;
|
|
207
215
|
readonly encrypted?: boolean;
|
|
208
216
|
readonly sensitive?: boolean;
|
|
217
|
+
readonly writeOnly?: boolean;
|
|
209
218
|
readonly readAsInstruction?: boolean;
|
|
210
219
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
211
220
|
readonly default?: string;
|
|
@@ -226,6 +235,7 @@ export declare function createNoteMentionEntity(): EntityDefinition<{
|
|
|
226
235
|
readonly filterable?: boolean;
|
|
227
236
|
readonly encrypted?: boolean;
|
|
228
237
|
readonly sensitive?: boolean;
|
|
238
|
+
readonly writeOnly?: boolean;
|
|
229
239
|
readonly readAsInstruction?: boolean;
|
|
230
240
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
231
241
|
readonly default?: string;
|
|
@@ -248,6 +258,7 @@ export declare const noteMentionEntity: EntityDefinition<{
|
|
|
248
258
|
readonly filterable?: boolean;
|
|
249
259
|
readonly encrypted?: boolean;
|
|
250
260
|
readonly sensitive?: boolean;
|
|
261
|
+
readonly writeOnly?: boolean;
|
|
251
262
|
readonly readAsInstruction?: boolean;
|
|
252
263
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
253
264
|
readonly default?: string;
|
|
@@ -268,6 +279,7 @@ export declare const noteMentionEntity: EntityDefinition<{
|
|
|
268
279
|
readonly filterable?: boolean;
|
|
269
280
|
readonly encrypted?: boolean;
|
|
270
281
|
readonly sensitive?: boolean;
|
|
282
|
+
readonly writeOnly?: boolean;
|
|
271
283
|
readonly readAsInstruction?: boolean;
|
|
272
284
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
273
285
|
readonly default?: string;
|
|
@@ -9,6 +9,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
|
|
|
9
9
|
readonly filterable?: boolean;
|
|
10
10
|
readonly encrypted?: boolean;
|
|
11
11
|
readonly sensitive?: boolean;
|
|
12
|
+
readonly writeOnly?: boolean;
|
|
12
13
|
readonly readAsInstruction?: boolean;
|
|
13
14
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
14
15
|
readonly default?: string;
|
|
@@ -29,6 +30,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
|
|
|
29
30
|
readonly filterable?: boolean;
|
|
30
31
|
readonly encrypted?: boolean;
|
|
31
32
|
readonly sensitive?: boolean;
|
|
33
|
+
readonly writeOnly?: boolean;
|
|
32
34
|
readonly readAsInstruction?: boolean;
|
|
33
35
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
34
36
|
readonly default?: string;
|
|
@@ -49,6 +51,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
|
|
|
49
51
|
readonly filterable?: boolean;
|
|
50
52
|
readonly encrypted?: boolean;
|
|
51
53
|
readonly sensitive?: boolean;
|
|
54
|
+
readonly writeOnly?: boolean;
|
|
52
55
|
readonly readAsInstruction?: boolean;
|
|
53
56
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
54
57
|
readonly default?: string;
|
|
@@ -69,6 +72,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
|
|
|
69
72
|
readonly filterable?: boolean;
|
|
70
73
|
readonly encrypted?: boolean;
|
|
71
74
|
readonly sensitive?: boolean;
|
|
75
|
+
readonly writeOnly?: boolean;
|
|
72
76
|
readonly readAsInstruction?: boolean;
|
|
73
77
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
74
78
|
readonly default?: string;
|
|
@@ -89,6 +93,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
|
|
|
89
93
|
readonly filterable?: boolean;
|
|
90
94
|
readonly encrypted?: boolean;
|
|
91
95
|
readonly sensitive?: boolean;
|
|
96
|
+
readonly writeOnly?: boolean;
|
|
92
97
|
readonly readAsInstruction?: boolean;
|
|
93
98
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
94
99
|
readonly default?: string;
|
|
@@ -109,6 +114,7 @@ export declare const apiTokenEntity: import("@cosmicdrift/kumiko-types/fields").
|
|
|
109
114
|
readonly filterable?: boolean;
|
|
110
115
|
readonly encrypted?: boolean;
|
|
111
116
|
readonly sensitive?: boolean;
|
|
117
|
+
readonly writeOnly?: boolean;
|
|
112
118
|
readonly readAsInstruction?: boolean;
|
|
113
119
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
114
120
|
readonly default?: string;
|
package/dist/secrets/table.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare const tenantSecretEntity: import("@cosmicdrift/kumiko-types/field
|
|
|
14
14
|
readonly filterable?: boolean;
|
|
15
15
|
readonly encrypted?: boolean;
|
|
16
16
|
readonly sensitive?: boolean;
|
|
17
|
+
readonly writeOnly?: boolean;
|
|
17
18
|
readonly readAsInstruction?: boolean;
|
|
18
19
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
19
20
|
readonly default?: string;
|
|
@@ -9,6 +9,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
9
9
|
readonly filterable?: boolean;
|
|
10
10
|
readonly encrypted?: boolean;
|
|
11
11
|
readonly sensitive?: boolean;
|
|
12
|
+
readonly writeOnly?: boolean;
|
|
12
13
|
readonly readAsInstruction?: boolean;
|
|
13
14
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
14
15
|
readonly default?: string;
|
|
@@ -29,6 +30,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
29
30
|
readonly filterable?: boolean;
|
|
30
31
|
readonly encrypted?: boolean;
|
|
31
32
|
readonly sensitive?: boolean;
|
|
33
|
+
readonly writeOnly?: boolean;
|
|
32
34
|
readonly readAsInstruction?: boolean;
|
|
33
35
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
34
36
|
readonly default?: string;
|
|
@@ -109,6 +111,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
109
111
|
readonly filterable?: boolean;
|
|
110
112
|
readonly encrypted?: boolean;
|
|
111
113
|
readonly sensitive?: boolean;
|
|
114
|
+
readonly writeOnly?: boolean;
|
|
112
115
|
readonly readAsInstruction?: boolean;
|
|
113
116
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
114
117
|
readonly default?: string;
|
|
@@ -129,6 +132,7 @@ export declare const userSessionEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
129
132
|
readonly filterable?: boolean;
|
|
130
133
|
readonly encrypted?: boolean;
|
|
131
134
|
readonly sensitive?: boolean;
|
|
135
|
+
readonly writeOnly?: boolean;
|
|
132
136
|
readonly readAsInstruction?: boolean;
|
|
133
137
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
134
138
|
readonly default?: string;
|
|
@@ -135,9 +135,9 @@ export function createSubscriptionStripeFeature(options = {}) {
|
|
|
135
135
|
});
|
|
136
136
|
r.translations({
|
|
137
137
|
keys: {
|
|
138
|
-
"subscription-stripe.api-key": { en: "Stripe API
|
|
139
|
-
"subscription-stripe.webhook-secret": { en: "Stripe
|
|
140
|
-
"subscription-stripe.billing-live": { en: "
|
|
138
|
+
"subscription-stripe.api-key": { en: "Stripe API key" },
|
|
139
|
+
"subscription-stripe.webhook-secret": { en: "Stripe webhook secret" },
|
|
140
|
+
"subscription-stripe.billing-live": { en: "Live billing" },
|
|
141
141
|
"subscription-stripe.settings": { en: "Stripe" },
|
|
142
142
|
"screen:subscription-stripe-system.title": { en: "Stripe" },
|
|
143
143
|
},
|
package/dist/tags/entity.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare const tagEntity: EntityDefinition<{
|
|
|
10
10
|
readonly filterable?: boolean;
|
|
11
11
|
readonly encrypted?: boolean;
|
|
12
12
|
readonly sensitive?: boolean;
|
|
13
|
+
readonly writeOnly?: boolean;
|
|
13
14
|
readonly readAsInstruction?: boolean;
|
|
14
15
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
15
16
|
readonly default?: string;
|
|
@@ -30,6 +31,7 @@ export declare const tagEntity: EntityDefinition<{
|
|
|
30
31
|
readonly filterable?: boolean;
|
|
31
32
|
readonly encrypted?: boolean;
|
|
32
33
|
readonly sensitive?: boolean;
|
|
34
|
+
readonly writeOnly?: boolean;
|
|
33
35
|
readonly readAsInstruction?: boolean;
|
|
34
36
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
35
37
|
readonly default?: string;
|
|
@@ -50,6 +52,7 @@ export declare const tagEntity: EntityDefinition<{
|
|
|
50
52
|
readonly filterable?: boolean;
|
|
51
53
|
readonly encrypted?: boolean;
|
|
52
54
|
readonly sensitive?: boolean;
|
|
55
|
+
readonly writeOnly?: boolean;
|
|
53
56
|
readonly readAsInstruction?: boolean;
|
|
54
57
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
55
58
|
readonly default?: string;
|
|
@@ -72,6 +75,7 @@ export declare function createTagAssignmentEntity(access?: EntityDefinition["acc
|
|
|
72
75
|
readonly filterable?: boolean;
|
|
73
76
|
readonly encrypted?: boolean;
|
|
74
77
|
readonly sensitive?: boolean;
|
|
78
|
+
readonly writeOnly?: boolean;
|
|
75
79
|
readonly readAsInstruction?: boolean;
|
|
76
80
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
77
81
|
readonly default?: string;
|
|
@@ -92,6 +96,7 @@ export declare function createTagAssignmentEntity(access?: EntityDefinition["acc
|
|
|
92
96
|
readonly filterable?: boolean;
|
|
93
97
|
readonly encrypted?: boolean;
|
|
94
98
|
readonly sensitive?: boolean;
|
|
99
|
+
readonly writeOnly?: boolean;
|
|
95
100
|
readonly readAsInstruction?: boolean;
|
|
96
101
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
97
102
|
readonly default?: string;
|
|
@@ -112,6 +117,7 @@ export declare function createTagAssignmentEntity(access?: EntityDefinition["acc
|
|
|
112
117
|
readonly filterable?: boolean;
|
|
113
118
|
readonly encrypted?: boolean;
|
|
114
119
|
readonly sensitive?: boolean;
|
|
120
|
+
readonly writeOnly?: boolean;
|
|
115
121
|
readonly readAsInstruction?: boolean;
|
|
116
122
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
117
123
|
readonly default?: string;
|
|
@@ -134,6 +140,7 @@ export declare const tagAssignmentEntity: EntityDefinition<{
|
|
|
134
140
|
readonly filterable?: boolean;
|
|
135
141
|
readonly encrypted?: boolean;
|
|
136
142
|
readonly sensitive?: boolean;
|
|
143
|
+
readonly writeOnly?: boolean;
|
|
137
144
|
readonly readAsInstruction?: boolean;
|
|
138
145
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
139
146
|
readonly default?: string;
|
|
@@ -154,6 +161,7 @@ export declare const tagAssignmentEntity: EntityDefinition<{
|
|
|
154
161
|
readonly filterable?: boolean;
|
|
155
162
|
readonly encrypted?: boolean;
|
|
156
163
|
readonly sensitive?: boolean;
|
|
164
|
+
readonly writeOnly?: boolean;
|
|
157
165
|
readonly readAsInstruction?: boolean;
|
|
158
166
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
159
167
|
readonly default?: string;
|
|
@@ -174,6 +182,7 @@ export declare const tagAssignmentEntity: EntityDefinition<{
|
|
|
174
182
|
readonly filterable?: boolean;
|
|
175
183
|
readonly encrypted?: boolean;
|
|
176
184
|
readonly sensitive?: boolean;
|
|
185
|
+
readonly writeOnly?: boolean;
|
|
177
186
|
readonly readAsInstruction?: boolean;
|
|
178
187
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
179
188
|
readonly default?: string;
|
|
@@ -9,6 +9,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
9
9
|
readonly filterable?: boolean;
|
|
10
10
|
readonly encrypted?: boolean;
|
|
11
11
|
readonly sensitive?: boolean;
|
|
12
|
+
readonly writeOnly?: boolean;
|
|
12
13
|
readonly readAsInstruction?: boolean;
|
|
13
14
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
14
15
|
readonly default?: string;
|
|
@@ -39,7 +40,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
39
40
|
readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
40
41
|
} | undefined;
|
|
41
42
|
readonly optionsQuery?: string;
|
|
42
|
-
readonly optionsQueryPayload?:
|
|
43
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
43
44
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
44
45
|
required: true;
|
|
45
46
|
};
|
|
@@ -53,6 +54,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
53
54
|
readonly filterable?: boolean;
|
|
54
55
|
readonly encrypted?: boolean;
|
|
55
56
|
readonly sensitive?: boolean;
|
|
57
|
+
readonly writeOnly?: boolean;
|
|
56
58
|
readonly readAsInstruction?: boolean;
|
|
57
59
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
58
60
|
readonly default?: string;
|
|
@@ -73,6 +75,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
73
75
|
readonly filterable?: boolean;
|
|
74
76
|
readonly encrypted?: boolean;
|
|
75
77
|
readonly sensitive?: boolean;
|
|
78
|
+
readonly writeOnly?: boolean;
|
|
76
79
|
readonly readAsInstruction?: boolean;
|
|
77
80
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
78
81
|
readonly default?: string;
|
|
@@ -93,6 +96,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
93
96
|
readonly filterable?: boolean;
|
|
94
97
|
readonly encrypted?: boolean;
|
|
95
98
|
readonly sensitive?: boolean;
|
|
99
|
+
readonly writeOnly?: boolean;
|
|
96
100
|
readonly readAsInstruction?: boolean;
|
|
97
101
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
98
102
|
readonly default?: string;
|
|
@@ -137,7 +141,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
137
141
|
readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
138
142
|
} | undefined;
|
|
139
143
|
readonly optionsQuery?: string;
|
|
140
|
-
readonly optionsQueryPayload?:
|
|
144
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
141
145
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
142
146
|
required: true;
|
|
143
147
|
};
|
|
@@ -189,7 +193,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
189
193
|
readonly tenant?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
190
194
|
} | undefined;
|
|
191
195
|
readonly optionsQuery?: string;
|
|
192
|
-
readonly optionsQueryPayload?:
|
|
196
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
193
197
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
194
198
|
required: true;
|
|
195
199
|
};
|
|
@@ -203,6 +207,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
203
207
|
readonly filterable?: boolean;
|
|
204
208
|
readonly encrypted?: boolean;
|
|
205
209
|
readonly sensitive?: boolean;
|
|
210
|
+
readonly writeOnly?: boolean;
|
|
206
211
|
readonly readAsInstruction?: boolean;
|
|
207
212
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
208
213
|
readonly default?: string;
|
|
@@ -230,7 +235,7 @@ export declare const templateResourceEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
230
235
|
readonly draft?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
231
236
|
} | undefined;
|
|
232
237
|
readonly optionsQuery?: string;
|
|
233
|
-
readonly optionsQueryPayload?:
|
|
238
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
234
239
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
235
240
|
required: true;
|
|
236
241
|
};
|
|
@@ -246,6 +251,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
246
251
|
readonly filterable?: boolean;
|
|
247
252
|
readonly encrypted?: boolean;
|
|
248
253
|
readonly sensitive?: boolean;
|
|
254
|
+
readonly writeOnly?: boolean;
|
|
249
255
|
readonly readAsInstruction?: boolean;
|
|
250
256
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
251
257
|
readonly default?: string;
|
|
@@ -276,7 +282,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
276
282
|
readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
277
283
|
} | undefined;
|
|
278
284
|
readonly optionsQuery?: string;
|
|
279
|
-
readonly optionsQueryPayload?:
|
|
285
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
280
286
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
281
287
|
required: true;
|
|
282
288
|
};
|
|
@@ -290,6 +296,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
290
296
|
readonly filterable?: boolean;
|
|
291
297
|
readonly encrypted?: boolean;
|
|
292
298
|
readonly sensitive?: boolean;
|
|
299
|
+
readonly writeOnly?: boolean;
|
|
293
300
|
readonly readAsInstruction?: boolean;
|
|
294
301
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
295
302
|
readonly default?: string;
|
|
@@ -310,6 +317,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
310
317
|
readonly filterable?: boolean;
|
|
311
318
|
readonly encrypted?: boolean;
|
|
312
319
|
readonly sensitive?: boolean;
|
|
320
|
+
readonly writeOnly?: boolean;
|
|
313
321
|
readonly readAsInstruction?: boolean;
|
|
314
322
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
315
323
|
readonly default?: string;
|
|
@@ -330,6 +338,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
330
338
|
readonly filterable?: boolean;
|
|
331
339
|
readonly encrypted?: boolean;
|
|
332
340
|
readonly sensitive?: boolean;
|
|
341
|
+
readonly writeOnly?: boolean;
|
|
333
342
|
readonly readAsInstruction?: boolean;
|
|
334
343
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
335
344
|
readonly default?: string;
|
|
@@ -374,7 +383,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
374
383
|
readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
375
384
|
} | undefined;
|
|
376
385
|
readonly optionsQuery?: string;
|
|
377
|
-
readonly optionsQueryPayload?:
|
|
386
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
378
387
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
379
388
|
required: true;
|
|
380
389
|
};
|
|
@@ -426,7 +435,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
426
435
|
readonly tenant?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
427
436
|
} | undefined;
|
|
428
437
|
readonly optionsQuery?: string;
|
|
429
|
-
readonly optionsQueryPayload?:
|
|
438
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
430
439
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
431
440
|
required: true;
|
|
432
441
|
};
|
|
@@ -440,6 +449,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
440
449
|
readonly filterable?: boolean;
|
|
441
450
|
readonly encrypted?: boolean;
|
|
442
451
|
readonly sensitive?: boolean;
|
|
452
|
+
readonly writeOnly?: boolean;
|
|
443
453
|
readonly readAsInstruction?: boolean;
|
|
444
454
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
445
455
|
readonly default?: string;
|
|
@@ -467,7 +477,7 @@ export declare const templateResourcesTable: import("@cosmicdrift/kumiko-framewo
|
|
|
467
477
|
readonly draft?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
468
478
|
} | undefined;
|
|
469
479
|
readonly optionsQuery?: string;
|
|
470
|
-
readonly optionsQueryPayload?:
|
|
480
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
471
481
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
472
482
|
required: true;
|
|
473
483
|
};
|
|
@@ -9,6 +9,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
9
9
|
readonly filterable?: boolean;
|
|
10
10
|
readonly encrypted?: boolean;
|
|
11
11
|
readonly sensitive?: boolean;
|
|
12
|
+
readonly writeOnly?: boolean;
|
|
12
13
|
readonly readAsInstruction?: boolean;
|
|
13
14
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
14
15
|
readonly default?: string;
|
|
@@ -29,6 +30,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
29
30
|
readonly filterable?: boolean;
|
|
30
31
|
readonly encrypted?: boolean;
|
|
31
32
|
readonly sensitive?: boolean;
|
|
33
|
+
readonly writeOnly?: boolean;
|
|
32
34
|
readonly readAsInstruction?: boolean;
|
|
33
35
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
34
36
|
readonly default?: string;
|
|
@@ -59,7 +61,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
59
61
|
readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
60
62
|
} | undefined;
|
|
61
63
|
readonly optionsQuery?: string;
|
|
62
|
-
readonly optionsQueryPayload?:
|
|
64
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
63
65
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
64
66
|
required: true;
|
|
65
67
|
};
|
|
@@ -73,6 +75,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
73
75
|
readonly filterable?: boolean;
|
|
74
76
|
readonly encrypted?: boolean;
|
|
75
77
|
readonly sensitive?: boolean;
|
|
78
|
+
readonly writeOnly?: boolean;
|
|
76
79
|
readonly readAsInstruction?: boolean;
|
|
77
80
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
78
81
|
readonly default?: string;
|
|
@@ -93,6 +96,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
93
96
|
readonly filterable?: boolean;
|
|
94
97
|
readonly encrypted?: boolean;
|
|
95
98
|
readonly sensitive?: boolean;
|
|
99
|
+
readonly writeOnly?: boolean;
|
|
96
100
|
readonly readAsInstruction?: boolean;
|
|
97
101
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
98
102
|
readonly default?: string;
|
|
@@ -113,6 +117,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
113
117
|
readonly filterable?: boolean;
|
|
114
118
|
readonly encrypted?: boolean;
|
|
115
119
|
readonly sensitive?: boolean;
|
|
120
|
+
readonly writeOnly?: boolean;
|
|
116
121
|
readonly readAsInstruction?: boolean;
|
|
117
122
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
118
123
|
readonly default?: string;
|
|
@@ -157,7 +162,7 @@ export declare const userContentEntryEntity: import("@cosmicdrift/kumiko-types/f
|
|
|
157
162
|
readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
158
163
|
} | undefined;
|
|
159
164
|
readonly optionsQuery?: string;
|
|
160
|
-
readonly optionsQueryPayload?:
|
|
165
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
161
166
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
162
167
|
required: true;
|
|
163
168
|
};
|
|
@@ -173,6 +178,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
173
178
|
readonly filterable?: boolean;
|
|
174
179
|
readonly encrypted?: boolean;
|
|
175
180
|
readonly sensitive?: boolean;
|
|
181
|
+
readonly writeOnly?: boolean;
|
|
176
182
|
readonly readAsInstruction?: boolean;
|
|
177
183
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
178
184
|
readonly default?: string;
|
|
@@ -193,6 +199,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
193
199
|
readonly filterable?: boolean;
|
|
194
200
|
readonly encrypted?: boolean;
|
|
195
201
|
readonly sensitive?: boolean;
|
|
202
|
+
readonly writeOnly?: boolean;
|
|
196
203
|
readonly readAsInstruction?: boolean;
|
|
197
204
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
198
205
|
readonly default?: string;
|
|
@@ -223,7 +230,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
223
230
|
readonly "text-block"?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
224
231
|
} | undefined;
|
|
225
232
|
readonly optionsQuery?: string;
|
|
226
|
-
readonly optionsQueryPayload?:
|
|
233
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
227
234
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
228
235
|
required: true;
|
|
229
236
|
};
|
|
@@ -237,6 +244,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
237
244
|
readonly filterable?: boolean;
|
|
238
245
|
readonly encrypted?: boolean;
|
|
239
246
|
readonly sensitive?: boolean;
|
|
247
|
+
readonly writeOnly?: boolean;
|
|
240
248
|
readonly readAsInstruction?: boolean;
|
|
241
249
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
242
250
|
readonly default?: string;
|
|
@@ -257,6 +265,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
257
265
|
readonly filterable?: boolean;
|
|
258
266
|
readonly encrypted?: boolean;
|
|
259
267
|
readonly sensitive?: boolean;
|
|
268
|
+
readonly writeOnly?: boolean;
|
|
260
269
|
readonly readAsInstruction?: boolean;
|
|
261
270
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
262
271
|
readonly default?: string;
|
|
@@ -277,6 +286,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
277
286
|
readonly filterable?: boolean;
|
|
278
287
|
readonly encrypted?: boolean;
|
|
279
288
|
readonly sensitive?: boolean;
|
|
289
|
+
readonly writeOnly?: boolean;
|
|
280
290
|
readonly readAsInstruction?: boolean;
|
|
281
291
|
readonly format?: "email" | "url" | "phone" | "password";
|
|
282
292
|
readonly default?: string;
|
|
@@ -321,7 +331,7 @@ export declare const userContentEntriesTable: import("@cosmicdrift/kumiko-framew
|
|
|
321
331
|
readonly plain?: import("@cosmicdrift/kumiko-types/fields").SelectOptionTone | undefined;
|
|
322
332
|
} | undefined;
|
|
323
333
|
readonly optionsQuery?: string;
|
|
324
|
-
readonly optionsQueryPayload?:
|
|
334
|
+
readonly optionsQueryPayload?: import("@cosmicdrift/kumiko-types/fields").OptionsQueryPayload;
|
|
325
335
|
} & import("@cosmicdrift/kumiko-types/fields").ResolvedPiiFlags & {
|
|
326
336
|
required: true;
|
|
327
337
|
};
|
|
@@ -11,7 +11,7 @@ export declare const MEMBER_STATUS_CELL_COMPONENT: "MemberStatusCell";
|
|
|
11
11
|
export declare const MEMBER_ROLES_CELL_COMPONENT: "MemberRolesCell";
|
|
12
12
|
/** Closed allowlist for invite-role picker — never free text (escalation guard). */
|
|
13
13
|
export declare const DEFAULT_INVITE_ROLE_OPTIONS: readonly ["User", "Editor", "Admin"];
|
|
14
|
-
export declare const OWNER_INVITE_ROLE_OPTIONS: readonly ["User", "Editor", "Admin", "TenantAdmin"];
|
|
14
|
+
export declare const OWNER_INVITE_ROLE_OPTIONS: readonly ["User", "Member", "Editor", "Admin", "TenantAdmin"];
|
|
15
15
|
export declare const TenantHandlers: {
|
|
16
16
|
readonly create: "tenant:write:create";
|
|
17
17
|
readonly update: "tenant:write:update";
|
package/dist/tenant/constants.js
CHANGED
|
@@ -22,7 +22,13 @@ export const DEFAULT_INVITE_ROLE_OPTIONS = ["User", "Editor", "Admin"];
|
|
|
22
22
|
// Full assignable rank list, used by memberRolesEditScreen: that screen is
|
|
23
23
|
// prefilled with a member's *current* roles, so it must be able to represent
|
|
24
24
|
// every rank a membership can actually hold, including TenantAdmin (fw#2452).
|
|
25
|
-
export const OWNER_INVITE_ROLE_OPTIONS = [
|
|
25
|
+
export const OWNER_INVITE_ROLE_OPTIONS = [
|
|
26
|
+
"User",
|
|
27
|
+
"Member",
|
|
28
|
+
"Editor",
|
|
29
|
+
"Admin",
|
|
30
|
+
"TenantAdmin",
|
|
31
|
+
];
|
|
26
32
|
// Qualified write handler names (QN format: scope:type:name)
|
|
27
33
|
export const TenantHandlers = {
|
|
28
34
|
create: "tenant:write:create",
|
package/dist/tenant/feature.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
|
|
1
|
+
import { type AssignableAppRoles, type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
export { tenantEntity, tenantTable } from "./schema/tenant.js";
|
|
3
3
|
export type TenantFeatureOptions = {
|
|
4
4
|
/** Adds the /members "invite" drawer button + its `invite-create`
|
|
@@ -9,5 +9,8 @@ export type TenantFeatureOptions = {
|
|
|
9
9
|
* handler lookup fails). Off by default: `tenant` cannot see whether an
|
|
10
10
|
* app configured that optional auth-email-password flow. */
|
|
11
11
|
readonly inviteScreen?: boolean;
|
|
12
|
+
/** Screen options only — the elevation guard always reads the registry. */
|
|
13
|
+
readonly assignableAppRoles?: AssignableAppRoles;
|
|
12
14
|
};
|
|
15
|
+
export declare function collectAssignableAppRoles(features: readonly FeatureDefinition[]): AssignableAppRoles;
|
|
13
16
|
export declare function createTenantFeature(options?: TenantFeatureOptions): FeatureDefinition;
|
package/dist/tenant/feature.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { access, createSystemConfig, createTenantConfig, defineEntityDetailHandler, defineEntityListHandler, defineEntityUpdateHandler, defineFeature, i18nKey, } from "@cosmicdrift/kumiko-framework/engine";
|
|
1
|
+
import { access, assignableAppRolesFromUsages, createSystemConfig, createTenantConfig, defineEntityDetailHandler, defineEntityListHandler, defineEntityUpdateHandler, defineFeature, EXT_ASSIGNABLE_ROLE, i18nKey, } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
import { activeTenantIdsQuery } from "./handlers/active-tenant-ids.query.js";
|
|
3
3
|
import { addMemberWrite } from "./handlers/add-member.write.js";
|
|
4
4
|
import { cancelInvitationWrite } from "./handlers/cancel-invitation.write.js";
|
|
@@ -20,8 +20,13 @@ import { TENANT_I18N } from "./i18n.js";
|
|
|
20
20
|
import { tenantInvitationEntity } from "./invitation-table.js";
|
|
21
21
|
import { tenantMembershipEntity } from "./membership-table.js";
|
|
22
22
|
import { tenantEntity } from "./schema/tenant.js";
|
|
23
|
-
import {
|
|
23
|
+
import { createInviteCreateScreen, createMemberRolesEditScreen, createMembersScreen, tenantEditScreen, tenantListScreen, } from "./screens.js";
|
|
24
24
|
export { tenantEntity, tenantTable } from "./schema/tenant.js";
|
|
25
|
+
export function collectAssignableAppRoles(features) {
|
|
26
|
+
return assignableAppRolesFromUsages(features
|
|
27
|
+
.flatMap((feature) => feature.extensionUsages)
|
|
28
|
+
.filter((usage) => usage.extensionName === EXT_ASSIGNABLE_ROLE));
|
|
29
|
+
}
|
|
25
30
|
// --- Feature ---
|
|
26
31
|
export function createTenantFeature(options) {
|
|
27
32
|
return defineFeature("tenant", (r) => {
|
|
@@ -33,6 +38,10 @@ export function createTenantFeature(options) {
|
|
|
33
38
|
});
|
|
34
39
|
r.systemScope();
|
|
35
40
|
r.requires("config");
|
|
41
|
+
r.extendsRegistrar(EXT_ASSIGNABLE_ROLE, {});
|
|
42
|
+
r.bootCheck(({ features }) => {
|
|
43
|
+
collectAssignableAppRoles(features);
|
|
44
|
+
});
|
|
36
45
|
r.entity("tenant", tenantEntity);
|
|
37
46
|
r.entity("tenant-membership", tenantMembershipEntity);
|
|
38
47
|
r.entity("tenant-invitation", tenantInvitationEntity);
|
|
@@ -128,9 +137,9 @@ export function createTenantFeature(options) {
|
|
|
128
137
|
// §2.6), invite via a drawer-hosted actionForm, role-edit via
|
|
129
138
|
// actionForm. Screen access matches handler access.admin.
|
|
130
139
|
r.screen(createMembersScreen(options));
|
|
131
|
-
r.screen(
|
|
140
|
+
r.screen(createMemberRolesEditScreen(options?.assignableAppRoles));
|
|
132
141
|
if (options?.inviteScreen) {
|
|
133
|
-
r.screen(
|
|
142
|
+
r.screen(createInviteCreateScreen(options.assignableAppRoles));
|
|
134
143
|
}
|
|
135
144
|
r.nav({
|
|
136
145
|
id: "members",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fetchOne } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
2
|
import { createEventStoreExecutor } from "@cosmicdrift/kumiko-framework/db";
|
|
3
|
-
import { access, createSystemUser, defineWriteHandler, findForbiddenRoleAssignment, withResponseData, } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
|
+
import { access, assignableAppRolesFromUsages, createSystemUser, defineWriteHandler, EXT_ASSIGNABLE_ROLE, findForbiddenRoleAssignment, withResponseData, } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
4
|
import { InternalError, NotFoundError, ValidationError, writeFailure, } from "@cosmicdrift/kumiko-framework/errors";
|
|
5
5
|
import { parseRoles } from "@cosmicdrift/kumiko-framework/utils";
|
|
6
6
|
import * as z from "zod";
|
|
@@ -70,7 +70,7 @@ export const updateMemberRolesWrite = defineWriteHandler({
|
|
|
70
70
|
const row = existing; // @cast-boundary generic-record
|
|
71
71
|
const currentTargetRoles = parseRoles(row["roles"]);
|
|
72
72
|
if (!event.user.roles.includes("system")) {
|
|
73
|
-
const forbiddenElevation = findForbiddenRoleAssignment(event.user.roles, event.payload.roles, currentTargetRoles);
|
|
73
|
+
const forbiddenElevation = findForbiddenRoleAssignment(event.user.roles, event.payload.roles, currentTargetRoles, assignableAppRolesFromUsages(ctx.registry.getExtensionUsages(EXT_ASSIGNABLE_ROLE)));
|
|
74
74
|
if (forbiddenElevation !== undefined) {
|
|
75
75
|
return writeFailure(unassignableMembershipRoleError(forbiddenElevation));
|
|
76
76
|
}
|
package/dist/tenant/i18n.js
CHANGED
|
@@ -24,12 +24,14 @@ export const TENANT_I18N = {
|
|
|
24
24
|
"tenant:entity:__action-form__:field:email": { en: "Email" },
|
|
25
25
|
"tenant:entity:__action-form__:field:role": { en: "Role" },
|
|
26
26
|
"tenant:entity:__action-form__:field:role:option:User": { en: "User" },
|
|
27
|
+
"tenant:entity:__action-form__:field:role:option:Member": { en: "Member" },
|
|
27
28
|
"tenant:entity:__action-form__:field:role:option:Admin": { en: "Admin" },
|
|
28
29
|
"tenant:entity:__action-form__:field:role:option:TenantAdmin": { en: "Tenant Admin" },
|
|
29
30
|
"tenant:entity:__action-form__:field:role:option:Editor": { en: "Editor" },
|
|
30
31
|
"tenant:entity:__action-form__:field:userId": { en: "User ID" },
|
|
31
32
|
"tenant:entity:__action-form__:field:roles": { en: "Roles" },
|
|
32
33
|
"tenant:entity:__action-form__:field:roles:option:User": { en: "User" },
|
|
34
|
+
"tenant:entity:__action-form__:field:roles:option:Member": { en: "Member" },
|
|
33
35
|
"tenant:entity:__action-form__:field:roles:option:Admin": { en: "Admin" },
|
|
34
36
|
"tenant:entity:__action-form__:field:roles:option:TenantAdmin": { en: "Tenant Admin" },
|
|
35
37
|
"tenant:entity:__action-form__:field:roles:option:Editor": { en: "Editor" },
|