@tula-tech/contract 0.1.1 → 0.3.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/README.md +106 -1
- package/dist/custom-claims.d.ts +118 -3
- package/dist/custom-claims.js +21 -2
- package/dist/error-codes.d.ts +204 -0
- package/dist/error-codes.js +1 -1
- package/dist/event-types.d.ts +34 -1
- package/dist/event-types.js +1 -1
- package/dist/headers.d.ts +25 -5
- package/dist/headers.js +7 -3
- package/dist/index.d.ts +3934 -791
- package/dist/index.js +1896 -597
- package/dist/organization-domain-rules.d.ts +132 -0
- package/dist/organization-domain-rules.js +34 -0
- package/dist/organization-permissions.d.ts +185 -0
- package/dist/organization-permissions.js +42 -0
- package/dist/password-rules.d.ts +204 -0
- package/dist/redirect-url.d.ts +3 -3
- package/dist/redirect-url.js +1 -1
- package/dist/shared/{chunk-q309e9bk.js → chunk-4hytq4je.js} +3 -1
- package/dist/shared/{chunk-cce3bhet.js → chunk-5r2ka03q.js} +192 -0
- package/dist/shared/{chunk-7yqzghgm.js → chunk-bsea97tx.js} +66 -0
- package/dist/shared/chunk-cdg41bxh.js +151 -0
- package/dist/shared/{chunk-4rb5jsfz.js → chunk-fkx6fc8e.js} +61 -1
- package/dist/shared/{chunk-pcn6ax54.js → chunk-g0ddvjqg.js} +29 -29
- package/dist/shared/{chunk-r202nxfw.js → chunk-n1jdq72m.js} +18 -3
- package/dist/shared/chunk-yzgakhtb.js +50 -0
- package/dist/theme.d.ts +6 -3
- package/dist/theme.js +1 -1
- package/openapi.json +29170 -10212
- package/package.json +10 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// src/organization-permissions.ts
|
|
2
|
+
var MAX_PERMISSIONS_PER_ROLE2 = 32;
|
|
3
|
+
var MAX_CUSTOM_ROLES2 = 50;
|
|
4
|
+
var MAX_PERMISSION_KEY_LENGTH2 = 100;
|
|
5
|
+
var ROLE_KEY_PATTERN2 = /^[a-z][a-z0-9_]{0,31}$/;
|
|
6
|
+
var PERMISSION_KEY_PATTERN2 = /^org:(?:sys:[a-z][a-z0-9_]{0,31}|(?!sys:)[a-z][a-z0-9_]{0,31}):[a-z][a-z0-9_]{0,31}$/;
|
|
7
|
+
var SYSTEM_PERMISSIONS2 = [
|
|
8
|
+
"org:sys:organization:manage",
|
|
9
|
+
"org:sys:organization:delete",
|
|
10
|
+
"org:sys:memberships:read",
|
|
11
|
+
"org:sys:memberships:manage",
|
|
12
|
+
"org:sys:invitations:manage",
|
|
13
|
+
"org:sys:domains:manage",
|
|
14
|
+
"org:sys:sso:manage"
|
|
15
|
+
];
|
|
16
|
+
var MEMBERSHIPS_MANAGE_PERMISSION2 = "org:sys:memberships:manage";
|
|
17
|
+
var DOMAINS_MANAGE_PERMISSION2 = "org:sys:domains:manage";
|
|
18
|
+
var INVITATIONS_MANAGE_PERMISSION2 = "org:sys:invitations:manage";
|
|
19
|
+
var ORGANIZATION_MANAGE_PERMISSION2 = "org:sys:organization:manage";
|
|
20
|
+
var ORGANIZATION_DELETE_PERMISSION2 = "org:sys:organization:delete";
|
|
21
|
+
var MEMBERSHIPS_READ_PERMISSION2 = "org:sys:memberships:read";
|
|
22
|
+
var SSO_MANAGE_PERMISSION2 = "org:sys:sso:manage";
|
|
23
|
+
var BUILT_IN_ROLES2 = [
|
|
24
|
+
{ key: "admin", name: "Admin", permissions: SYSTEM_PERMISSIONS2 },
|
|
25
|
+
{ key: "member", name: "Member", permissions: ["org:sys:memberships:read"] }
|
|
26
|
+
];
|
|
27
|
+
function isSystemPermission2(key) {
|
|
28
|
+
return SYSTEM_PERMISSIONS2.includes(key);
|
|
29
|
+
}
|
|
30
|
+
function isBuiltInRoleKey2(key) {
|
|
31
|
+
return BUILT_IN_ROLES2.some((role) => role.key === key);
|
|
32
|
+
}
|
|
33
|
+
function rolePermissionRefusal2(key) {
|
|
34
|
+
if (key.length > MAX_PERMISSION_KEY_LENGTH2 || !PERMISSION_KEY_PATTERN2.test(key)) {
|
|
35
|
+
return "grammar";
|
|
36
|
+
}
|
|
37
|
+
return key.startsWith("org:sys:") && !isSystemPermission2(key) ? "reserved" : null;
|
|
38
|
+
}
|
|
39
|
+
function normalizePermissions2(permissions) {
|
|
40
|
+
return [...new Set(permissions)].sort();
|
|
41
|
+
}
|
|
42
|
+
function organizationRoleWeakenings2(before, after) {
|
|
43
|
+
if (before === null) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const had = new Set(before);
|
|
47
|
+
return after.some((key) => !had.has(key)) ? ["permissions"] : [];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { MAX_PERMISSIONS_PER_ROLE2, MAX_CUSTOM_ROLES2, MAX_PERMISSION_KEY_LENGTH2, ROLE_KEY_PATTERN2, PERMISSION_KEY_PATTERN2, SYSTEM_PERMISSIONS2, MEMBERSHIPS_MANAGE_PERMISSION2, DOMAINS_MANAGE_PERMISSION2, INVITATIONS_MANAGE_PERMISSION2, ORGANIZATION_MANAGE_PERMISSION2, ORGANIZATION_DELETE_PERMISSION2, MEMBERSHIPS_READ_PERMISSION2, SSO_MANAGE_PERMISSION2, BUILT_IN_ROLES2, isSystemPermission2, isBuiltInRoleKey2, rolePermissionRefusal2, normalizePermissions2, organizationRoleWeakenings2 };
|
package/dist/theme.d.ts
CHANGED
|
@@ -133,13 +133,16 @@ interface ThemeTokenDefinition {
|
|
|
133
133
|
*/
|
|
134
134
|
declare const THEME_TOKENS: readonly ThemeTokenDefinition[];
|
|
135
135
|
/**
|
|
136
|
-
* The default theme
|
|
136
|
+
* The default theme: Tula's own, "ink and paper". Warm neutrals from the brand kit (ink
|
|
137
|
+
* `#1a1a18`, paper `#f1efe8`), a primary button that is ink in light and paper in dark (the
|
|
138
|
+
* mark's two tones), and one restrained violet (`link`, `focus`) kept for interaction only.
|
|
139
|
+
* Dark is ink surfaces with paper text. Every text colour has a contrast of at least 4.5:1 on the backgrounds it
|
|
137
140
|
* is drawn on, and control edges and the focus ring at least 3:1, in both schemes (WCAG 2.2
|
|
138
141
|
* AA); the contract's tests compute it.
|
|
139
142
|
*
|
|
140
143
|
* @example
|
|
141
144
|
* ```ts
|
|
142
|
-
* DEFAULT_THEME.light.primary // '#
|
|
145
|
+
* DEFAULT_THEME.light.primary // '#1a1a18'
|
|
143
146
|
* ```
|
|
144
147
|
*/
|
|
145
148
|
declare const DEFAULT_THEME: Theme;
|
|
@@ -220,7 +223,7 @@ declare function themeToCssVariables(theme: ThemeOverrides): Record<string, stri
|
|
|
220
223
|
*
|
|
221
224
|
* @example
|
|
222
225
|
* ```ts
|
|
223
|
-
* contrastRatio('#
|
|
226
|
+
* contrastRatio('#f1efe8', '#1a1a18') >= 4.5 // paper on the default primary (ink) passes AA
|
|
224
227
|
* ```
|
|
225
228
|
*/
|
|
226
229
|
declare function contrastRatio(foreground: string, background: string): number;
|