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