@ionite/valibot 0.0.24-beta.20260907.2 → 0.0.24-beta.20260907.3

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/dist/index.js +478 -1
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1 +1,478 @@
1
- import{ION_SCIM_USER_EXTENSION_URN as z,isEcid as M,withValidate as H}from"@ionite/core";import*as j from"valibot";var T='must be a valid ECID formatted as "ecid:<realm>:<opaque>"',q=()=>j.optional(j.pipe(j.string(),j.check((k)=>M(k),T)));function Z(k){for(let K=0;K<k.length;K++){let Q=k.charCodeAt(K);if(Q<=31||Q===127)return!1}let P;try{P=new URL(k)}catch{return!1}if(P.protocol==="https:")return!0;if(P.protocol==="http:"){let K=P.hostname.toLowerCase();return K==="localhost"||K==="127.0.0.1"||K==="[::1]"||K==="::1"}return!1}var $="must be an absolute https URL (http is allowed only for localhost)",x=j.object({userName:j.string(),name:j.string(),email:j.pipe(j.string(),j.email()),id:j.optional(j.string()),avatar:j.optional(j.union([j.pipe(j.string(),j.url()),j.literal("")])),userType:j.optional(j.string()),ecid:q(),accountClass:j.optional(j.string())}),A=j.object({userName:j.string(),name:j.string(),email:j.pipe(j.string(),j.email()),id:j.optional(j.string()),avatar:j.optional(j.union([j.pipe(j.string(),j.url()),j.literal("")])),userType:j.optional(j.string())}),W=j.object({id:j.string(),name:j.string(),displayName:j.optional(j.string()),description:j.string(),metadata:j.optional(j.record(j.string(),j.unknown()))}),G=j.strictObject({type:j.literal("vault"),vaultUrl:j.optional(j.string()),vaultPath:j.string(),vaultTtl:j.optional(j.number()),vaultWorkloadTokenUrl:j.optional(j.string()),vaultWorkloadClientId:j.optional(j.string()),vaultWorkloadScope:j.optional(j.string()),vaultLfvServerUrl:j.optional(j.string()),vaultLfvClientId:j.optional(j.string()),vaultLfvDeliveryEndpoint:j.optional(j.string()),vaultLfvVerifyJwks:j.optional(j.string()),vaultLfvEventsEndpoint:j.optional(j.string()),vaultLfvPath:j.optional(j.string()),vaultLfvDeliveryTimeout:j.optional(j.number()),vaultLfvRetryInterval:j.optional(j.number()),vaultLfvWarnInterval:j.optional(j.number()),vaultWebsocketUrl:j.optional(j.string()),vaultWebsocketClientId:j.optional(j.string()),vaultWebsocketHeader:j.optional(j.picklist(["X-Vault-Token","Authorization"]))}),I=j.strictObject({type:j.literal("aws"),awsWebhookUrl:j.string(),awsTtl:j.optional(j.number())}),L=j.strictObject({type:j.literal("azure"),azureAuthMethod:j.optional(j.picklist(["client_secret","workload_identity","managed_identity"])),azureEntraTenantId:j.optional(j.string()),azureClientId:j.optional(j.string()),azureManagedIdentityClientId:j.optional(j.string()),azureImdsApiVersion:j.optional(j.string()),azurePath:j.optional(j.string()),azureVaultUrl:j.optional(j.string()),azureVaultName:j.optional(j.string()),azureApiVersion:j.optional(j.string()),azureScope:j.optional(j.string()),azureSecretNamePrefix:j.optional(j.string()),azureTtl:j.optional(j.number())}),B=j.strictObject({type:j.literal("gcp"),gcpTtl:j.optional(j.number())}),X=j.variant("type",[G,I,L,B]),Y=j.union([X,j.strictObject({type:j.literal("mirror"),from:X,to:G})]),_=j.object({id:j.pipe(j.string(),j.minLength(1)),companyId:j.string(),companyName:j.string(),environmentType:j.picklist(["POC","DEV","QA","PROD"]),status:j.picklist(["pending","processing","completed","failed","action_required"]),createdAt:j.date(),updatedAt:j.date(),configLocator:j.optional(Y),email:j.optional(j.string()),webhookUrl:j.optional(j.string()),callbackUrl:j.optional(j.string()),tenantUrl:j.optional(j.string()),error:j.optional(j.string()),actionUrl:j.optional(j.string()),requestToken:j.optional(j.string()),expiresAt:j.optional(j.string())}),F=j.object({id:j.string(),companyId:j.string(),companyName:j.string(),environmentType:j.picklist(["POC","DEV","QA","PROD"]),configLocator:j.optional(Y),email:j.optional(j.pipe(j.string(),j.email())),webhookUrl:j.optional(j.pipe(j.string(),j.url())),callbackUrl:j.optional(j.pipe(j.string(),j.url()))}),O=j.object({id:j.optional(j.string()),companyId:j.optional(j.string()),companyName:j.optional(j.string()),environmentType:j.optional(j.picklist(["POC","DEV","QA","PROD"])),configLocator:j.optional(Y),email:j.optional(j.pipe(j.string(),j.email())),webhookUrl:j.optional(j.pipe(j.string(),j.url())),callbackUrl:j.optional(j.pipe(j.string(),j.url()))}),J={authzEntityBase:()=>H(W),authzResource:()=>{let k=j.object({...W.entries,type:j.string(),parent:j.optional(j.lazy(()=>j.union([j.string(),k])))});return H(k)},authzPermission:()=>{let k=j.object({...W.entries,requestable:j.optional(j.boolean()),action:j.optional(j.string()),permissionTypes:j.optional(j.array(j.string())),resourceTypes:j.optional(j.array(j.string())),applyToSubResources:j.optional(j.boolean()),assignableSubjectTypes:j.pipe(j.array(j.picklist(["user","customer","workload"])),j.minLength(1)),recommendedSubjectTypes:j.optional(j.array(j.picklist(["user","customer","workload"])))});return H(k)},authzRole:()=>{let k=J.authzPermission(),P=j.object({...W.entries,requestable:j.optional(j.boolean()),roles:j.optional(j.array(j.union([j.string(),j.lazy(()=>P)]))),permissions:j.optional(j.array(j.union([j.string(),k]))),assignableSubjectTypes:j.pipe(j.array(j.picklist(["user","customer","workload"])),j.minLength(1)),recommendedSubjectTypes:j.optional(j.array(j.picklist(["user","customer","workload"])))});return H(P)},authzGroup:()=>{let k=J.authzRole(),P=J.authzPermission(),K=J.authzResource(),Q=j.object({...W.entries,requestable:j.optional(j.boolean()),groups:j.optional(j.array(j.union([j.string(),j.lazy(()=>Q)]))),roles:j.optional(j.array(j.union([j.string(),k]))),permissions:j.optional(j.array(j.union([j.string(),P]))),resources:j.optional(j.array(j.union([j.string(),K]))),assignableSubjectTypes:j.pipe(j.array(j.picklist(["user","customer","workload"])),j.minLength(1)),recommendedSubjectTypes:j.optional(j.array(j.picklist(["user","customer","workload"])))});return H(Q)},oidcCallbackParams:()=>j.object({code:j.string(),state:j.optional(j.string()),session_state:j.optional(j.string()),error:j.optional(j.string()),error_description:j.optional(j.string()),error_uri:j.optional(j.string()),iss:j.optional(j.string())}),idTokenClaims:()=>j.looseObject({sub:j.string(),iss:j.string(),aud:j.union([j.string(),j.pipe(j.array(j.string()),j.minLength(1))]),exp:j.number(),iat:j.optional(j.number()),sid:j.optional(j.string()),name:j.optional(j.string()),email:j.optional(j.union([j.pipe(j.string(),j.email()),j.pipe(j.string(),j.regex(/^[^@]+@localhost$/i))])),preferred_username:j.optional(j.string()),picture:j.optional(j.pipe(j.string(),j.url()))}),tokenResponse:()=>j.object({access_token:j.string(),id_token:j.string(),refresh_token:j.optional(j.string()),token_type:j.string(),expires_in:j.optional(j.number()),scope:j.optional(j.string()),refresh_expires_in:j.optional(j.number()),session_state:j.optional(j.string()),expires:j.optional(j.string())}),scimUser:()=>{let k=j.object({formatted:j.optional(j.string()),familyName:j.optional(j.string()),givenName:j.optional(j.string()),middleName:j.optional(j.string()),honorificPrefix:j.optional(j.string()),honorificSuffix:j.optional(j.string())}),P=j.object({value:j.pipe(j.string(),j.email()),display:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}),K=j.object({value:j.string(),display:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}),Q=j.object({formatted:j.optional(j.string()),streetAddress:j.optional(j.string()),locality:j.optional(j.string()),region:j.optional(j.string()),postalCode:j.optional(j.string()),country:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}),D=j.object({value:j.string(),$ref:j.optional(j.string()),display:j.optional(j.string()),type:j.optional(j.string())}),N=j.object({value:j.string(),display:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}),y=j.object({employeeNumber:j.optional(j.string()),costCenter:j.optional(j.string()),organization:j.optional(j.string()),division:j.optional(j.string()),department:j.optional(j.string()),manager:j.optional(j.object({value:j.optional(j.string()),$ref:j.optional(j.string()),displayName:j.optional(j.string())}))});return j.object({id:j.optional(j.string()),externalId:j.optional(j.string()),meta:j.optional(j.object({resourceType:j.optional(j.string()),created:j.optional(j.string()),lastModified:j.optional(j.string()),location:j.optional(j.string()),version:j.optional(j.string())})),userName:j.string(),name:j.optional(k),displayName:j.optional(j.string()),nickName:j.optional(j.string()),profileUrl:j.optional(j.pipe(j.string(),j.url())),title:j.optional(j.string()),userType:j.optional(j.string()),preferredLanguage:j.optional(j.string()),locale:j.optional(j.string()),timezone:j.optional(j.string()),active:j.optional(j.boolean()),password:j.optional(j.never()),emails:j.optional(j.array(P)),phoneNumbers:j.optional(j.array(K)),ims:j.optional(j.array(j.object({value:j.string(),display:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}))),photos:j.optional(j.array(j.object({value:j.string(),display:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}))),addresses:j.optional(j.array(Q)),groups:j.optional(j.array(D)),entitlements:j.optional(j.array(j.object({value:j.string(),display:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}))),roles:j.optional(j.array(N)),x509Certificates:j.optional(j.array(j.object({value:j.string(),display:j.optional(j.string()),type:j.optional(j.string()),primary:j.optional(j.boolean())}))),"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User":j.optional(y),[z]:j.optional(j.object({ecid:q(),accountClass:j.optional(j.string())})),schemas:j.optional(j.array(j.string()))})},scimGroup:()=>{let k=j.object({value:j.string(),$ref:j.optional(j.string()),display:j.optional(j.string()),type:j.optional(j.picklist(["User","Group","Workload","Customer"]))});return j.object({id:j.optional(j.string()),externalId:j.optional(j.string()),meta:j.optional(j.object({resourceType:j.optional(j.string()),created:j.optional(j.string()),lastModified:j.optional(j.string()),location:j.optional(j.string()),version:j.optional(j.string())})),displayName:j.string(),members:j.optional(j.array(k)),"urn:ionite:params:scim:schemas:extension:authz:2.0:Group":j.optional(j.object({type:j.optional(j.picklist(["group","role","permission"])),requestable:j.optional(j.boolean()),description:j.optional(j.string()),resources:j.optional(j.array(j.string()))})),schemas:j.optional(j.array(j.string()))})},jwtAssertionClaims:()=>j.looseObject({iss:j.string(),sub:j.string(),aud:j.optional(j.union([j.string(),j.array(j.string())])),exp:j.number(),iat:j.number(),jti:j.optional(j.string()),scope:j.optional(j.string())}),workloadTokenResponse:()=>j.object({access_token:j.string(),token_type:j.string(),expires_in:j.optional(j.number()),scope:j.optional(j.string()),refresh_token:j.optional(j.string()),expires:j.optional(j.string())}),createTenantRequest:(k)=>k?j.object({...F.entries,...k}):F,updateTenantRequest:(k)=>k?j.object({...O.entries,...k}):O,baseUser:()=>x,customer:()=>A,tenantResponse:()=>j.union([j.object({tenantUrl:j.optional(j.pipe(j.string(),j.url())),status:j.picklist(["pending","processing","completed","failed"]),error:j.optional(j.string())}),j.object({status:j.literal("action_required"),actionUrl:j.pipe(j.string(),j.url()),requestToken:j.string(),expiresAt:j.string()})]),registerIAMAppPayload:()=>j.object({id:j.pipe(j.string(),j.minLength(1)),companyId:j.pipe(j.string(),j.minLength(1)),companyName:j.pipe(j.string(),j.minLength(1)),environmentType:j.picklist(["POC","DEV","QA","PROD"]),tenantUrl:j.optional(j.pipe(j.string(),j.url())),displayName:j.optional(j.string()),productId:j.optional(j.string()),applicationId:j.optional(j.string()),scimBaseUrl:j.optional(j.pipe(j.string(),j.url())),workload:j.optional(j.record(j.string(),j.unknown()))}),registerSSOAppPayload:()=>j.object({redirectUris:j.pipe(j.array(j.pipe(j.string(),j.check(Z,`redirectUri ${$}`))),j.minLength(1)),backchannelLogoutUri:j.optional(j.pipe(j.string(),j.check(Z,`backchannelLogoutUri ${$}`))),displayName:j.optional(j.string()),defaultScope:j.optional(j.string()),issuerTenant:j.optional(j.string()),applicationId:j.optional(j.string())})};function f(){return{sso:{callbackParams:H(J.oidcCallbackParams()),idTokenClaims:H(J.idTokenClaims()),tokenResponse:H(J.tokenResponse())},iam:{user:H(J.scimUser()),group:H(J.scimGroup())},workload:{jwtAssertionClaims:H(J.jwtAssertionClaims()),tokenResponse:H(J.workloadTokenResponse())},tenant:{createTenantRequest:H(J.createTenantRequest()),updateTenantRequest:H(J.updateTenantRequest()),tenantResponse:H(J.tenantResponse())},ciam:{customer:H(J.customer()),callbackParams:H(J.oidcCallbackParams()),idTokenClaims:H(J.idTokenClaims()),tokenResponse:H(J.tokenResponse())}}}function R(){return{iam:{registerIAMAppPayload:H(J.registerIAMAppPayload())},sso:{registerSSOAppPayload:H(J.registerSSOAppPayload())}}}export{J as valibotValidators,Z as isSafeRedirectUri,f as createValidators,R as createControlValidators,Y as ConfigLocatorSchema,x as BaseUser,O as BaseTenantUpdateRequestSchema,F as BaseTenantCreateRequestSchema,_ as BaseTenant,A as BaseCustomer};
1
+ // packages/valibot/src/index.ts
2
+ import { ION_SCIM_USER_EXTENSION_URN, isEcid, withValidate } from "@ionite/core";
3
+ import * as v from "valibot";
4
+ var ECID_MESSAGE = 'must be a valid ECID formatted as "ecid:<realm>:<opaque>"';
5
+ var ecidSchema = () => v.optional(v.pipe(v.string(), v.check((value) => isEcid(value), ECID_MESSAGE)));
6
+ function isSafeRedirectUri(value) {
7
+ for (let i = 0;i < value.length; i++) {
8
+ const code = value.charCodeAt(i);
9
+ if (code <= 31 || code === 127)
10
+ return false;
11
+ }
12
+ let url2;
13
+ try {
14
+ url2 = new URL(value);
15
+ } catch {
16
+ return false;
17
+ }
18
+ if (url2.protocol === "https:")
19
+ return true;
20
+ if (url2.protocol === "http:") {
21
+ const host = url2.hostname.toLowerCase();
22
+ return host === "localhost" || host === "127.0.0.1" || host === "[::1]" || host === "::1";
23
+ }
24
+ return false;
25
+ }
26
+ var SAFE_REDIRECT_URI_MESSAGE = "must be an absolute https URL (http is allowed only for localhost)";
27
+ var BaseUser = v.object({
28
+ userName: v.string(),
29
+ name: v.string(),
30
+ email: v.pipe(v.string(), v.email()),
31
+ id: v.optional(v.string()),
32
+ avatar: v.optional(v.union([v.pipe(v.string(), v.url()), v.literal("")])),
33
+ userType: v.optional(v.string()),
34
+ ecid: ecidSchema(),
35
+ accountClass: v.optional(v.string())
36
+ });
37
+ var BaseCustomer = v.object({
38
+ userName: v.string(),
39
+ name: v.string(),
40
+ email: v.pipe(v.string(), v.email()),
41
+ id: v.optional(v.string()),
42
+ avatar: v.optional(v.union([v.pipe(v.string(), v.url()), v.literal("")])),
43
+ userType: v.optional(v.string())
44
+ });
45
+ var authzEntityBaseSchema = v.object({
46
+ id: v.string(),
47
+ name: v.string(),
48
+ displayName: v.optional(v.string()),
49
+ description: v.string(),
50
+ metadata: v.optional(v.record(v.string(), v.unknown()))
51
+ });
52
+ var VaultConfigLocatorSchema = v.strictObject({
53
+ type: v.literal("vault"),
54
+ vaultUrl: v.optional(v.string()),
55
+ vaultPath: v.string(),
56
+ vaultTtl: v.optional(v.number()),
57
+ vaultWorkloadTokenUrl: v.optional(v.string()),
58
+ vaultWorkloadClientId: v.optional(v.string()),
59
+ vaultWorkloadScope: v.optional(v.string()),
60
+ vaultLfvServerUrl: v.optional(v.string()),
61
+ vaultLfvClientId: v.optional(v.string()),
62
+ vaultLfvDeliveryEndpoint: v.optional(v.string()),
63
+ vaultLfvVerifyJwks: v.optional(v.string()),
64
+ vaultLfvEventsEndpoint: v.optional(v.string()),
65
+ vaultLfvPath: v.optional(v.string()),
66
+ vaultLfvDeliveryTimeout: v.optional(v.number()),
67
+ vaultLfvRetryInterval: v.optional(v.number()),
68
+ vaultLfvWarnInterval: v.optional(v.number()),
69
+ vaultWebsocketUrl: v.optional(v.string()),
70
+ vaultWebsocketClientId: v.optional(v.string()),
71
+ vaultWebsocketHeader: v.optional(v.picklist(["X-Vault-Token", "Authorization"]))
72
+ });
73
+ var AwsConfigLocatorSchema = v.strictObject({
74
+ type: v.literal("aws"),
75
+ awsWebhookUrl: v.string(),
76
+ awsTtl: v.optional(v.number())
77
+ });
78
+ var AzureConfigLocatorSchema = v.strictObject({
79
+ type: v.literal("azure"),
80
+ azureAuthMethod: v.optional(v.picklist(["client_secret", "workload_identity", "managed_identity"])),
81
+ azureEntraTenantId: v.optional(v.string()),
82
+ azureClientId: v.optional(v.string()),
83
+ azureManagedIdentityClientId: v.optional(v.string()),
84
+ azureImdsApiVersion: v.optional(v.string()),
85
+ azurePath: v.optional(v.string()),
86
+ azureVaultUrl: v.optional(v.string()),
87
+ azureVaultName: v.optional(v.string()),
88
+ azureApiVersion: v.optional(v.string()),
89
+ azureScope: v.optional(v.string()),
90
+ azureSecretNamePrefix: v.optional(v.string()),
91
+ azureTtl: v.optional(v.number())
92
+ });
93
+ var GcpConfigLocatorSchema = v.strictObject({
94
+ type: v.literal("gcp"),
95
+ gcpTtl: v.optional(v.number())
96
+ });
97
+ var DirectConfigLocatorSchema = v.variant("type", [
98
+ VaultConfigLocatorSchema,
99
+ AwsConfigLocatorSchema,
100
+ AzureConfigLocatorSchema,
101
+ GcpConfigLocatorSchema
102
+ ]);
103
+ var ConfigLocatorSchema = v.union([
104
+ DirectConfigLocatorSchema,
105
+ v.strictObject({
106
+ type: v.literal("mirror"),
107
+ from: DirectConfigLocatorSchema,
108
+ to: VaultConfigLocatorSchema
109
+ })
110
+ ]);
111
+ var BaseTenant = v.object({
112
+ id: v.pipe(v.string(), v.minLength(1)),
113
+ companyId: v.string(),
114
+ companyName: v.string(),
115
+ environmentType: v.picklist(["POC", "DEV", "QA", "PROD"]),
116
+ status: v.picklist(["pending", "processing", "completed", "failed", "action_required"]),
117
+ createdAt: v.date(),
118
+ updatedAt: v.date(),
119
+ configLocator: v.optional(ConfigLocatorSchema),
120
+ email: v.optional(v.string()),
121
+ webhookUrl: v.optional(v.string()),
122
+ callbackUrl: v.optional(v.string()),
123
+ tenantUrl: v.optional(v.string()),
124
+ error: v.optional(v.string()),
125
+ actionUrl: v.optional(v.string()),
126
+ requestToken: v.optional(v.string()),
127
+ expiresAt: v.optional(v.string())
128
+ });
129
+ var BaseTenantCreateRequestSchema = v.object({
130
+ id: v.string(),
131
+ companyId: v.string(),
132
+ companyName: v.string(),
133
+ environmentType: v.picklist(["POC", "DEV", "QA", "PROD"]),
134
+ configLocator: v.optional(ConfigLocatorSchema),
135
+ email: v.optional(v.pipe(v.string(), v.email())),
136
+ webhookUrl: v.optional(v.pipe(v.string(), v.url())),
137
+ callbackUrl: v.optional(v.pipe(v.string(), v.url()))
138
+ });
139
+ var BaseTenantUpdateRequestSchema = v.object({
140
+ id: v.optional(v.string()),
141
+ companyId: v.optional(v.string()),
142
+ companyName: v.optional(v.string()),
143
+ environmentType: v.optional(v.picklist(["POC", "DEV", "QA", "PROD"])),
144
+ configLocator: v.optional(ConfigLocatorSchema),
145
+ email: v.optional(v.pipe(v.string(), v.email())),
146
+ webhookUrl: v.optional(v.pipe(v.string(), v.url())),
147
+ callbackUrl: v.optional(v.pipe(v.string(), v.url()))
148
+ });
149
+ var valibotValidators = {
150
+ authzEntityBase: () => withValidate(authzEntityBaseSchema),
151
+ authzResource: () => {
152
+ const resourceSchema = v.object({
153
+ ...authzEntityBaseSchema.entries,
154
+ type: v.string(),
155
+ parent: v.optional(v.lazy(() => v.union([v.string(), resourceSchema])))
156
+ });
157
+ return withValidate(resourceSchema);
158
+ },
159
+ authzPermission: () => {
160
+ const permissionSchema = v.object({
161
+ ...authzEntityBaseSchema.entries,
162
+ requestable: v.optional(v.boolean()),
163
+ action: v.optional(v.string()),
164
+ permissionTypes: v.optional(v.array(v.string())),
165
+ resourceTypes: v.optional(v.array(v.string())),
166
+ applyToSubResources: v.optional(v.boolean()),
167
+ assignableSubjectTypes: v.pipe(v.array(v.picklist(["user", "customer", "workload"])), v.minLength(1)),
168
+ recommendedSubjectTypes: v.optional(v.array(v.picklist(["user", "customer", "workload"])))
169
+ });
170
+ return withValidate(permissionSchema);
171
+ },
172
+ authzRole: () => {
173
+ const permissionSchema = valibotValidators.authzPermission();
174
+ const roleSchema = v.object({
175
+ ...authzEntityBaseSchema.entries,
176
+ requestable: v.optional(v.boolean()),
177
+ roles: v.optional(v.array(v.union([v.string(), v.lazy(() => roleSchema)]))),
178
+ permissions: v.optional(v.array(v.union([v.string(), permissionSchema]))),
179
+ assignableSubjectTypes: v.pipe(v.array(v.picklist(["user", "customer", "workload"])), v.minLength(1)),
180
+ recommendedSubjectTypes: v.optional(v.array(v.picklist(["user", "customer", "workload"])))
181
+ });
182
+ return withValidate(roleSchema);
183
+ },
184
+ authzGroup: () => {
185
+ const roleSchema = valibotValidators.authzRole();
186
+ const permissionSchema = valibotValidators.authzPermission();
187
+ const resourceSchema = valibotValidators.authzResource();
188
+ const groupSchema = v.object({
189
+ ...authzEntityBaseSchema.entries,
190
+ requestable: v.optional(v.boolean()),
191
+ groups: v.optional(v.array(v.union([v.string(), v.lazy(() => groupSchema)]))),
192
+ roles: v.optional(v.array(v.union([v.string(), roleSchema]))),
193
+ permissions: v.optional(v.array(v.union([v.string(), permissionSchema]))),
194
+ resources: v.optional(v.array(v.union([v.string(), resourceSchema]))),
195
+ assignableSubjectTypes: v.pipe(v.array(v.picklist(["user", "customer", "workload"])), v.minLength(1)),
196
+ recommendedSubjectTypes: v.optional(v.array(v.picklist(["user", "customer", "workload"])))
197
+ });
198
+ return withValidate(groupSchema);
199
+ },
200
+ oidcCallbackParams: () => v.object({
201
+ code: v.string(),
202
+ state: v.optional(v.string()),
203
+ session_state: v.optional(v.string()),
204
+ error: v.optional(v.string()),
205
+ error_description: v.optional(v.string()),
206
+ error_uri: v.optional(v.string()),
207
+ iss: v.optional(v.string())
208
+ }),
209
+ idTokenClaims: () => v.looseObject({
210
+ sub: v.string(),
211
+ iss: v.string(),
212
+ aud: v.union([v.string(), v.pipe(v.array(v.string()), v.minLength(1))]),
213
+ exp: v.number(),
214
+ iat: v.optional(v.number()),
215
+ sid: v.optional(v.string()),
216
+ name: v.optional(v.string()),
217
+ email: v.optional(v.union([v.pipe(v.string(), v.email()), v.pipe(v.string(), v.regex(/^[^@]+@localhost$/i))])),
218
+ preferred_username: v.optional(v.string()),
219
+ picture: v.optional(v.pipe(v.string(), v.url()))
220
+ }),
221
+ tokenResponse: () => v.object({
222
+ access_token: v.string(),
223
+ id_token: v.string(),
224
+ refresh_token: v.optional(v.string()),
225
+ token_type: v.string(),
226
+ expires_in: v.optional(v.number()),
227
+ scope: v.optional(v.string()),
228
+ refresh_expires_in: v.optional(v.number()),
229
+ session_state: v.optional(v.string()),
230
+ expires: v.optional(v.string())
231
+ }),
232
+ scimUser: () => {
233
+ const nameSchema = v.object({
234
+ formatted: v.optional(v.string()),
235
+ familyName: v.optional(v.string()),
236
+ givenName: v.optional(v.string()),
237
+ middleName: v.optional(v.string()),
238
+ honorificPrefix: v.optional(v.string()),
239
+ honorificSuffix: v.optional(v.string())
240
+ });
241
+ const emailSchema = v.object({
242
+ value: v.pipe(v.string(), v.email()),
243
+ display: v.optional(v.string()),
244
+ type: v.optional(v.string()),
245
+ primary: v.optional(v.boolean())
246
+ });
247
+ const phoneNumberSchema = v.object({
248
+ value: v.string(),
249
+ display: v.optional(v.string()),
250
+ type: v.optional(v.string()),
251
+ primary: v.optional(v.boolean())
252
+ });
253
+ const addressSchema = v.object({
254
+ formatted: v.optional(v.string()),
255
+ streetAddress: v.optional(v.string()),
256
+ locality: v.optional(v.string()),
257
+ region: v.optional(v.string()),
258
+ postalCode: v.optional(v.string()),
259
+ country: v.optional(v.string()),
260
+ type: v.optional(v.string()),
261
+ primary: v.optional(v.boolean())
262
+ });
263
+ const groupSchema = v.object({
264
+ value: v.string(),
265
+ $ref: v.optional(v.string()),
266
+ display: v.optional(v.string()),
267
+ type: v.optional(v.string())
268
+ });
269
+ const roleSchema = v.object({
270
+ value: v.string(),
271
+ display: v.optional(v.string()),
272
+ type: v.optional(v.string()),
273
+ primary: v.optional(v.boolean())
274
+ });
275
+ const enterpriseUserSchema = v.object({
276
+ employeeNumber: v.optional(v.string()),
277
+ costCenter: v.optional(v.string()),
278
+ organization: v.optional(v.string()),
279
+ division: v.optional(v.string()),
280
+ department: v.optional(v.string()),
281
+ manager: v.optional(v.object({
282
+ value: v.optional(v.string()),
283
+ $ref: v.optional(v.string()),
284
+ displayName: v.optional(v.string())
285
+ }))
286
+ });
287
+ return v.object({
288
+ id: v.optional(v.string()),
289
+ externalId: v.optional(v.string()),
290
+ meta: v.optional(v.object({
291
+ resourceType: v.optional(v.string()),
292
+ created: v.optional(v.string()),
293
+ lastModified: v.optional(v.string()),
294
+ location: v.optional(v.string()),
295
+ version: v.optional(v.string())
296
+ })),
297
+ userName: v.string(),
298
+ name: v.optional(nameSchema),
299
+ displayName: v.optional(v.string()),
300
+ nickName: v.optional(v.string()),
301
+ profileUrl: v.optional(v.pipe(v.string(), v.url())),
302
+ title: v.optional(v.string()),
303
+ userType: v.optional(v.string()),
304
+ preferredLanguage: v.optional(v.string()),
305
+ locale: v.optional(v.string()),
306
+ timezone: v.optional(v.string()),
307
+ active: v.optional(v.boolean()),
308
+ password: v.optional(v.never()),
309
+ emails: v.optional(v.array(emailSchema)),
310
+ phoneNumbers: v.optional(v.array(phoneNumberSchema)),
311
+ ims: v.optional(v.array(v.object({
312
+ value: v.string(),
313
+ display: v.optional(v.string()),
314
+ type: v.optional(v.string()),
315
+ primary: v.optional(v.boolean())
316
+ }))),
317
+ photos: v.optional(v.array(v.object({
318
+ value: v.string(),
319
+ display: v.optional(v.string()),
320
+ type: v.optional(v.string()),
321
+ primary: v.optional(v.boolean())
322
+ }))),
323
+ addresses: v.optional(v.array(addressSchema)),
324
+ groups: v.optional(v.array(groupSchema)),
325
+ entitlements: v.optional(v.array(v.object({
326
+ value: v.string(),
327
+ display: v.optional(v.string()),
328
+ type: v.optional(v.string()),
329
+ primary: v.optional(v.boolean())
330
+ }))),
331
+ roles: v.optional(v.array(roleSchema)),
332
+ x509Certificates: v.optional(v.array(v.object({
333
+ value: v.string(),
334
+ display: v.optional(v.string()),
335
+ type: v.optional(v.string()),
336
+ primary: v.optional(v.boolean())
337
+ }))),
338
+ "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": v.optional(enterpriseUserSchema),
339
+ [ION_SCIM_USER_EXTENSION_URN]: v.optional(v.object({
340
+ ecid: ecidSchema(),
341
+ accountClass: v.optional(v.string())
342
+ })),
343
+ schemas: v.optional(v.array(v.string()))
344
+ });
345
+ },
346
+ scimGroup: () => {
347
+ const groupMemberSchema = v.object({
348
+ value: v.string(),
349
+ $ref: v.optional(v.string()),
350
+ display: v.optional(v.string()),
351
+ type: v.optional(v.picklist(["User", "Group", "Workload", "Customer"]))
352
+ });
353
+ return v.object({
354
+ id: v.optional(v.string()),
355
+ externalId: v.optional(v.string()),
356
+ meta: v.optional(v.object({
357
+ resourceType: v.optional(v.string()),
358
+ created: v.optional(v.string()),
359
+ lastModified: v.optional(v.string()),
360
+ location: v.optional(v.string()),
361
+ version: v.optional(v.string())
362
+ })),
363
+ displayName: v.string(),
364
+ members: v.optional(v.array(groupMemberSchema)),
365
+ "urn:ionite:params:scim:schemas:extension:authz:2.0:Group": v.optional(v.object({
366
+ type: v.optional(v.picklist(["group", "role", "permission"])),
367
+ requestable: v.optional(v.boolean()),
368
+ description: v.optional(v.string()),
369
+ resources: v.optional(v.array(v.string()))
370
+ })),
371
+ schemas: v.optional(v.array(v.string()))
372
+ });
373
+ },
374
+ jwtAssertionClaims: () => v.looseObject({
375
+ iss: v.string(),
376
+ sub: v.string(),
377
+ aud: v.optional(v.union([v.string(), v.array(v.string())])),
378
+ exp: v.number(),
379
+ iat: v.number(),
380
+ jti: v.optional(v.string()),
381
+ scope: v.optional(v.string())
382
+ }),
383
+ workloadTokenResponse: () => v.object({
384
+ access_token: v.string(),
385
+ token_type: v.string(),
386
+ expires_in: v.optional(v.number()),
387
+ scope: v.optional(v.string()),
388
+ refresh_token: v.optional(v.string()),
389
+ expires: v.optional(v.string())
390
+ }),
391
+ createTenantRequest: (extendedShape) => extendedShape ? v.object({ ...BaseTenantCreateRequestSchema.entries, ...extendedShape }) : BaseTenantCreateRequestSchema,
392
+ updateTenantRequest: (extendedShape) => extendedShape ? v.object({ ...BaseTenantUpdateRequestSchema.entries, ...extendedShape }) : BaseTenantUpdateRequestSchema,
393
+ baseUser: () => BaseUser,
394
+ customer: () => BaseCustomer,
395
+ tenantResponse: () => v.union([
396
+ v.object({
397
+ tenantUrl: v.optional(v.pipe(v.string(), v.url())),
398
+ status: v.picklist(["pending", "processing", "completed", "failed"]),
399
+ error: v.optional(v.string())
400
+ }),
401
+ v.object({
402
+ status: v.literal("action_required"),
403
+ actionUrl: v.pipe(v.string(), v.url()),
404
+ requestToken: v.string(),
405
+ expiresAt: v.string()
406
+ })
407
+ ]),
408
+ registerIAMAppPayload: () => v.object({
409
+ id: v.pipe(v.string(), v.minLength(1)),
410
+ companyId: v.pipe(v.string(), v.minLength(1)),
411
+ companyName: v.pipe(v.string(), v.minLength(1)),
412
+ environmentType: v.picklist(["POC", "DEV", "QA", "PROD"]),
413
+ tenantUrl: v.optional(v.pipe(v.string(), v.url())),
414
+ displayName: v.optional(v.string()),
415
+ productId: v.optional(v.string()),
416
+ applicationId: v.optional(v.string()),
417
+ scimBaseUrl: v.optional(v.pipe(v.string(), v.url())),
418
+ workload: v.optional(v.record(v.string(), v.unknown()))
419
+ }),
420
+ registerSSOAppPayload: () => v.object({
421
+ redirectUris: v.pipe(v.array(v.pipe(v.string(), v.check(isSafeRedirectUri, `redirectUri ${SAFE_REDIRECT_URI_MESSAGE}`))), v.minLength(1)),
422
+ backchannelLogoutUri: v.optional(v.pipe(v.string(), v.check(isSafeRedirectUri, `backchannelLogoutUri ${SAFE_REDIRECT_URI_MESSAGE}`))),
423
+ displayName: v.optional(v.string()),
424
+ defaultScope: v.optional(v.string()),
425
+ issuerTenant: v.optional(v.string()),
426
+ applicationId: v.optional(v.string())
427
+ })
428
+ };
429
+ function createValidators() {
430
+ return {
431
+ sso: {
432
+ callbackParams: withValidate(valibotValidators.oidcCallbackParams()),
433
+ idTokenClaims: withValidate(valibotValidators.idTokenClaims()),
434
+ tokenResponse: withValidate(valibotValidators.tokenResponse())
435
+ },
436
+ iam: {
437
+ user: withValidate(valibotValidators.scimUser()),
438
+ group: withValidate(valibotValidators.scimGroup())
439
+ },
440
+ workload: {
441
+ jwtAssertionClaims: withValidate(valibotValidators.jwtAssertionClaims()),
442
+ tokenResponse: withValidate(valibotValidators.workloadTokenResponse())
443
+ },
444
+ tenant: {
445
+ createTenantRequest: withValidate(valibotValidators.createTenantRequest()),
446
+ updateTenantRequest: withValidate(valibotValidators.updateTenantRequest()),
447
+ tenantResponse: withValidate(valibotValidators.tenantResponse())
448
+ },
449
+ ciam: {
450
+ customer: withValidate(valibotValidators.customer()),
451
+ callbackParams: withValidate(valibotValidators.oidcCallbackParams()),
452
+ idTokenClaims: withValidate(valibotValidators.idTokenClaims()),
453
+ tokenResponse: withValidate(valibotValidators.tokenResponse())
454
+ }
455
+ };
456
+ }
457
+ function createControlValidators() {
458
+ return {
459
+ iam: {
460
+ registerIAMAppPayload: withValidate(valibotValidators.registerIAMAppPayload())
461
+ },
462
+ sso: {
463
+ registerSSOAppPayload: withValidate(valibotValidators.registerSSOAppPayload())
464
+ }
465
+ };
466
+ }
467
+ export {
468
+ valibotValidators,
469
+ isSafeRedirectUri,
470
+ createValidators,
471
+ createControlValidators,
472
+ ConfigLocatorSchema,
473
+ BaseUser,
474
+ BaseTenantUpdateRequestSchema,
475
+ BaseTenantCreateRequestSchema,
476
+ BaseTenant,
477
+ BaseCustomer
478
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ionite/valibot",
3
- "version": "0.0.24-beta.20260907.2",
3
+ "version": "0.0.24-beta.20260907.3",
4
4
  "description": "Valibot validators for ionite (SSO, IAM, workload, tenant, CIAM)",
5
5
  "type": "module",
6
6
  "engines": {
@@ -9,7 +9,7 @@
9
9
  "author": "ionite",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "dependencies": {
12
- "@ionite/core": "0.0.24-beta.20260907.2",
12
+ "@ionite/core": "0.0.24-beta.20260907.3",
13
13
  "@standard-schema/spec": "^1.1.0",
14
14
  "valibot": "^1.4.2"
15
15
  },