@optimizely-opal/opal-tool-ocp-sdk 0.0.0-devmg.13 → 1.0.0-OCP-1441.2

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 (62) hide show
  1. package/README.md +108 -15
  2. package/dist/auth/AuthUtils.d.ts +26 -0
  3. package/dist/auth/AuthUtils.d.ts.map +1 -0
  4. package/dist/auth/AuthUtils.js +109 -0
  5. package/dist/auth/AuthUtils.js.map +1 -0
  6. package/dist/auth/AuthUtils.test.d.ts +2 -0
  7. package/dist/auth/AuthUtils.test.d.ts.map +1 -0
  8. package/dist/auth/AuthUtils.test.js +601 -0
  9. package/dist/auth/AuthUtils.test.js.map +1 -0
  10. package/dist/auth/TokenVerifier.d.ts.map +1 -1
  11. package/dist/auth/TokenVerifier.js +0 -1
  12. package/dist/auth/TokenVerifier.js.map +1 -1
  13. package/dist/auth/TokenVerifier.test.js +9 -0
  14. package/dist/auth/TokenVerifier.test.js.map +1 -1
  15. package/dist/function/GlobalToolFunction.d.ts +27 -0
  16. package/dist/function/GlobalToolFunction.d.ts.map +1 -0
  17. package/dist/function/GlobalToolFunction.js +53 -0
  18. package/dist/function/GlobalToolFunction.js.map +1 -0
  19. package/dist/function/GlobalToolFunction.test.d.ts +2 -0
  20. package/dist/function/GlobalToolFunction.test.d.ts.map +1 -0
  21. package/dist/function/GlobalToolFunction.test.js +425 -0
  22. package/dist/function/GlobalToolFunction.test.js.map +1 -0
  23. package/dist/function/ToolFunction.d.ts +1 -2
  24. package/dist/function/ToolFunction.d.ts.map +1 -1
  25. package/dist/function/ToolFunction.js +2 -35
  26. package/dist/function/ToolFunction.js.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/service/Service.d.ts +8 -7
  32. package/dist/service/Service.d.ts.map +1 -1
  33. package/dist/service/Service.js +16 -0
  34. package/dist/service/Service.js.map +1 -1
  35. package/dist/service/Service.test.js +89 -4
  36. package/dist/service/Service.test.js.map +1 -1
  37. package/dist/validation/ParameterValidator.d.ts +42 -0
  38. package/dist/validation/ParameterValidator.d.ts.map +1 -0
  39. package/dist/validation/ParameterValidator.js +122 -0
  40. package/dist/validation/ParameterValidator.js.map +1 -0
  41. package/dist/validation/ParameterValidator.test.d.ts +2 -0
  42. package/dist/validation/ParameterValidator.test.d.ts.map +1 -0
  43. package/dist/validation/ParameterValidator.test.js +282 -0
  44. package/dist/validation/ParameterValidator.test.js.map +1 -0
  45. package/package.json +3 -4
  46. package/src/auth/AuthUtils.test.ts +729 -0
  47. package/src/auth/AuthUtils.ts +117 -0
  48. package/src/auth/TokenVerifier.test.ts +11 -0
  49. package/src/auth/TokenVerifier.ts +0 -1
  50. package/src/function/GlobalToolFunction.test.ts +505 -0
  51. package/src/function/GlobalToolFunction.ts +56 -0
  52. package/src/function/ToolFunction.ts +3 -41
  53. package/src/index.ts +1 -0
  54. package/src/service/Service.test.ts +129 -12
  55. package/src/service/Service.ts +50 -9
  56. package/src/validation/ParameterValidator.test.ts +341 -0
  57. package/src/validation/ParameterValidator.ts +153 -0
  58. package/dist/function/ToolFunction.test.d.ts +0 -2
  59. package/dist/function/ToolFunction.test.d.ts.map +0 -1
  60. package/dist/function/ToolFunction.test.js +0 -314
  61. package/dist/function/ToolFunction.test.js.map +0 -1
  62. package/src/function/ToolFunction.test.ts +0 -374
package/README.md CHANGED
@@ -7,8 +7,9 @@ A TypeScript SDK for building Opal tools in Optimizely Connect Platform. This SD
7
7
  ## Features
8
8
 
9
9
  - 🎯 **Decorator-based Tool Registration** - Use `@tool` and `@interaction` decorators to easily register functions
10
+ - 🌐 **Global and Regular Function Modes** - SDK can be used in either global or organization-scoped mode
10
11
  - 🔧 **Type-safe Development** - Full TypeScript support with comprehensive type definitions
11
- - 🏗️ **Abstract Base Classes** - Extend `ToolFunction` for standardized request processing
12
+ - 🏗️ **Abstract Base Classes** - Extend `ToolFunction` or `GlobalToolFunction` for standardized request processing
12
13
  - 🔐 **Authentication Support** - OptiID authentication
13
14
  - 🛡️ **Authorization Support** - OptiID token tool authorization
14
15
  - 📝 **Parameter Validation** - Define and validate tool parameters with types
@@ -28,7 +29,14 @@ yarn add @optimizely-opal/opal-tool-ocp-sdk
28
29
 
29
30
  ## Quick Start
30
31
 
31
- Create a tool function class by extending `ToolFunction` and registering your tools and interactions:
32
+ The SDK supports two function modes:
33
+
34
+ - **Regular Functions** (`ToolFunction`) - Organization-scoped functions that validate customer organization IDs
35
+ - **Global Functions** (`GlobalToolFunction`) - Platform-wide functions that work across all organizations
36
+
37
+ ### Regular Tool Function
38
+
39
+ Create a tool function class by extending `ToolFunction` for organization-scoped functionality:
32
40
 
33
41
  ```typescript
34
42
  import { ToolFunction, tool, interaction, ParameterType, InteractionResult, OptiIdAuthData } from '@optimizely-opal/opal-tool-ocp-sdk';
@@ -89,12 +97,12 @@ export class MyToolFunction extends ToolFunction {
89
97
  throw new Error('OptiID authentication required');
90
98
  }
91
99
 
92
- const { customerId, instanceId, accessToken } = authData.credentials;
100
+ const { customer_id, instance_id, access_token } = authData.credentials;
93
101
  return {
94
102
  id: '456',
95
103
  title: params.title,
96
- customerId,
97
- instanceId
104
+ customer_id,
105
+ instance_id
98
106
  };
99
107
  }
100
108
 
@@ -112,7 +120,47 @@ export class MyToolFunction extends ToolFunction {
112
120
  }
113
121
  ```
114
122
 
115
- Your function class inherits a `perform()` method from `ToolFunction` that serves as the main entry point for handling all incoming requests. When called, the SDK automatically:
123
+ ### Global Tool Function
124
+
125
+ Create a global tool function by extending `GlobalToolFunction` for platform-wide functionality:
126
+
127
+ ```typescript
128
+ import { GlobalToolFunction, tool, interaction, ParameterType, InteractionResult, OptiIdAuthData } from '@optimizely-opal/opal-tool-ocp-sdk';
129
+
130
+ export class MyGlobalToolFunction extends GlobalToolFunction {
131
+
132
+ @tool({
133
+ name: 'global_utility',
134
+ description: 'A utility tool available to all organizations',
135
+ endpoint: '/global-utility',
136
+ parameters: [
137
+ {
138
+ name: 'operation',
139
+ type: ParameterType.String,
140
+ description: 'The operation to perform',
141
+ required: true
142
+ }
143
+ ]
144
+ })
145
+ async globalUtility(params: { operation: string }, authData?: OptiIdAuthData) {
146
+ return {
147
+ result: `Performed ${params.operation} globally`,
148
+ organizationId: authData?.credentials.customer_id || 'unknown'
149
+ };
150
+ }
151
+ }
152
+ ```
153
+
154
+ ### Function Modes
155
+
156
+ The SDK operates in one of two modes based on the base class you extend:
157
+
158
+ - **Regular Function Mode** (`ToolFunction`): All tools are organization-scoped and validate organization IDs
159
+ - **Global Function Mode** (`GlobalToolFunction`): All tools are platform-wide.
160
+
161
+ The discovery endpoint returns all tools registered within that function mode.
162
+
163
+ Your function class inherits a `perform()` method from `ToolFunction` or `GlobalToolFunction` that serves as the main entry point for handling all incoming requests. When called, the SDK automatically:
116
164
 
117
165
  - **Routes requests** to your registered tools and interactions based on endpoints
118
166
  - **Handles authentication** and OptiID token validation before calling your methods
@@ -129,6 +177,28 @@ Tools are functions that can be discovered and executed through the OCP platform
129
177
  - Define parameters with types and validation
130
178
  - Can require authentication
131
179
  - Return structured responses
180
+ - Are automatically registered based on the function mode you choose
181
+
182
+ ### Function Modes
183
+
184
+ #### Regular Functions (`ToolFunction`)
185
+
186
+ Regular functions are scoped to specific organizations and validate that requests come from the same organization:
187
+
188
+ - Validate OptiID organization ID matches the function's organization context
189
+ - All tools within the function are organization-scoped
190
+ - **Per-Organization Configuration**: Can implement organization-specific configuration, authentication credentials, and API keys since they're tied to a single organization
191
+ - **Per-Organization Authentication**: Can store and use organization-specific authentication tokens, connection strings, and other sensitive data securely
192
+
193
+ #### Global Functions (`GlobalToolFunction`)
194
+
195
+ Global functions work across all organizations without organization validation:
196
+
197
+ - Accept OptiID authentication
198
+ - All tools within the function are platform-wide
199
+ - **No Per-Organization Configuration**: Cannot implement per-organization configuration since they work across all organizations
200
+ - **No Per-Organization Authentication**: Cannot store organization-specific credentials or authentication data
201
+ - **Global Discovery**: Have a global discovery URL that can be used by any organization without requiring them to install the app first
132
202
 
133
203
  ### Interactions
134
204
 
@@ -175,7 +245,8 @@ The SDK automatically handles OptiID token validation for tool authorization. Op
175
245
 
176
246
  **Token Validation:**
177
247
  - The SDK extracts and validates OptiID tokens from the request body
178
- - Validation includes verifying that requests come from the same organization
248
+ - **Regular Tools**: Validation includes verifying that requests come from the same organization as the tool
249
+ - **Global Tools**: Token validation occurs but organization ID matching is skipped
179
250
  - If validation fails, returns HTTP 403 Unauthorized before reaching your handler methods
180
251
  - No additional configuration needed - validation is handled automatically
181
252
 
@@ -220,6 +291,7 @@ async handlerMethod(
220
291
  - **params**: The input parameters for tools, or interaction data for webhooks
221
292
  - **authData**: Available when OptiID user authentication is configured and successful
222
293
 
294
+
223
295
  ### Decorators
224
296
 
225
297
  #### `@tool(config: ToolConfig)`
@@ -251,7 +323,7 @@ interface InteractionConfig {
251
323
 
252
324
  #### `ToolFunction`
253
325
 
254
- Abstract base class for OCP functions:
326
+ Abstract base class for organization-scoped OCP functions:
255
327
 
256
328
  ```typescript
257
329
  export abstract class ToolFunction extends Function {
@@ -260,7 +332,20 @@ export abstract class ToolFunction extends Function {
260
332
  }
261
333
  ```
262
334
 
263
- Extend this class and implement your OCP function. The `perform` method automatically routes requests to registered tools.
335
+ Extend this class for regular tools that validate organization IDs. The `perform` method automatically routes requests to registered tools and enforces organization validation.
336
+
337
+ #### `GlobalToolFunction`
338
+
339
+ Abstract base class for global OCP functions:
340
+
341
+ ```typescript
342
+ export abstract class GlobalToolFunction extends GlobalFunction {
343
+ protected ready(): Promise<boolean>;
344
+ public async perform(): Promise<Response>;
345
+ }
346
+ ```
347
+
348
+ Extend this class for tools that work across organizations. The `perform` method routes requests to registered tools but skips organization validation for tools.
264
349
 
265
350
  ### Models
266
351
 
@@ -279,7 +364,14 @@ The SDK automatically provides two important endpoints:
279
364
 
280
365
  ### Discovery Endpoint (`/discovery`)
281
366
 
282
- Returns all registered tools in the proper OCP format for platform integration:
367
+ Returns all registered tools in the proper OCP format for platform integration. The discovery endpoint returns all tools registered within the function, regardless of their individual configuration:
368
+
369
+ - **Regular Functions** (`ToolFunction`): Returns all tools with organization-scoped behavior
370
+ - **Global Functions** (`GlobalToolFunction`): Returns all tools with platform-wide behavior
371
+
372
+ All tools within a function operate in the same mode - there is no mixing of global and organization-scoped tools within a single function.
373
+
374
+ Example response for a regular function and global function:
283
375
 
284
376
  ```json
285
377
  {
@@ -396,9 +488,9 @@ export class AuthenticatedFunction extends ToolFunction {
396
488
  async secureOperation(params: unknown, authData?: OptiIdAuthData) {
397
489
  if (!authData) throw new Error('OptiID authentication required');
398
490
 
399
- const { customerId, accessToken } = authData.credentials;
491
+ const { customer_id, access_token } = authData.credentials;
400
492
  // Use OptiID credentials for API calls
401
- return { success: true, customerId };
493
+ return { success: true, customer_id };
402
494
  }
403
495
 
404
496
  // Interaction with authentication example
@@ -411,11 +503,11 @@ export class AuthenticatedFunction extends ToolFunction {
411
503
  return new InteractionResult('Authentication required for webhook processing');
412
504
  }
413
505
 
414
- const { customerId } = authData.credentials;
506
+ const { customer_id } = authData.credentials;
415
507
 
416
508
  // Process webhook data with authentication context
417
509
  return new InteractionResult(
418
- `Webhook processed for customer ${customerId}: ${data.eventType}`,
510
+ `Webhook processed for customer ${customer_id}: ${data.eventType}`,
419
511
  `https://app.example.com/events/${data.eventId}`
420
512
  );
421
513
  }
@@ -433,7 +525,8 @@ src/
433
525
  │ ├── index.ts
434
526
  │ ├── TaskTool.ts
435
527
  │ └── NotificationTool.ts
436
- └── MyToolFunction.ts
528
+ ├── MyToolFunction.ts
529
+ └── MyGlobalToolFunction.ts
437
530
  ```
438
531
 
439
532
  **tools/TaskTool.ts:**
@@ -0,0 +1,26 @@
1
+ import { OptiIdAuthData } from '../types/Models';
2
+ /**
3
+ * Extract and validate basic OptiID authentication data from request
4
+ *
5
+ * @param request - The incoming request
6
+ * @returns object with authData and accessToken, or null if invalid
7
+ */
8
+ export declare function extractAuthData(request: any): {
9
+ authData: OptiIdAuthData;
10
+ accessToken: string;
11
+ } | null;
12
+ /**
13
+ * Authenticate a request for regular functions (with organization validation)
14
+ *
15
+ * @param request - The incoming request
16
+ * @returns true if authentication and authorization succeed
17
+ */
18
+ export declare function authenticateRegularRequest(request: any): Promise<boolean>;
19
+ /**
20
+ * Authenticate a request for global functions (without organization validation)
21
+ *
22
+ * @param request - The incoming request
23
+ * @returns true if authentication succeeds
24
+ */
25
+ export declare function authenticateGlobalRequest(request: any): Promise<boolean>;
26
+ //# sourceMappingURL=AuthUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthUtils.d.ts","sourceRoot":"","sources":["../../src/auth/AuthUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAqBjD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQtG;AA6DD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/E;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAE9E"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractAuthData = extractAuthData;
4
+ exports.authenticateRegularRequest = authenticateRegularRequest;
5
+ exports.authenticateGlobalRequest = authenticateGlobalRequest;
6
+ const app_sdk_1 = require("@zaiusinc/app-sdk");
7
+ const TokenVerifier_1 = require("./TokenVerifier");
8
+ /**
9
+ * Validate the OptiID access token
10
+ *
11
+ * @param accessToken - The access token to validate
12
+ * @returns true if the token is valid
13
+ */
14
+ async function validateAccessToken(accessToken) {
15
+ try {
16
+ if (!accessToken) {
17
+ return false;
18
+ }
19
+ const tokenVerifier = await (0, TokenVerifier_1.getTokenVerifier)();
20
+ return await tokenVerifier.verify(accessToken);
21
+ }
22
+ catch (error) {
23
+ app_sdk_1.logger.error('OptiID token validation failed:', error);
24
+ return false;
25
+ }
26
+ }
27
+ /**
28
+ * Extract and validate basic OptiID authentication data from request
29
+ *
30
+ * @param request - The incoming request
31
+ * @returns object with authData and accessToken, or null if invalid
32
+ */
33
+ function extractAuthData(request) {
34
+ const authData = request?.bodyJSON?.auth;
35
+ const accessToken = authData?.credentials?.access_token;
36
+ if (!accessToken || authData?.provider?.toLowerCase() !== 'optiid') {
37
+ return null;
38
+ }
39
+ return { authData, accessToken };
40
+ }
41
+ /**
42
+ * Validate organization ID matches the app context
43
+ *
44
+ * @param customerId - The customer ID from the auth data
45
+ * @returns true if the organization ID is valid
46
+ */
47
+ function validateOrganizationId(customerId) {
48
+ if (!customerId) {
49
+ app_sdk_1.logger.error('Organisation ID is required but not provided');
50
+ return false;
51
+ }
52
+ const appOrganisationId = (0, app_sdk_1.getAppContext)()?.account?.organizationId;
53
+ if (customerId !== appOrganisationId) {
54
+ app_sdk_1.logger.error(`Invalid organisation ID: expected ${appOrganisationId}, received ${customerId}`);
55
+ return false;
56
+ }
57
+ return true;
58
+ }
59
+ /**
60
+ * Check if a request should skip authentication (discovery/ready endpoints)
61
+ *
62
+ * @param request - The incoming request
63
+ * @returns true if auth should be skipped
64
+ */
65
+ function shouldSkipAuth(request) {
66
+ return request.path === '/discovery' || request.path === '/ready';
67
+ }
68
+ /**
69
+ * Core authentication flow - extracts auth data and validates token
70
+ *
71
+ * @param request - The incoming request
72
+ * @param validateOrg - Whether to validate organization ID
73
+ * @returns true if authentication succeeds
74
+ */
75
+ async function authenticateRequest(request, validateOrg) {
76
+ if (shouldSkipAuth(request)) {
77
+ return true;
78
+ }
79
+ const authInfo = extractAuthData(request);
80
+ if (!authInfo) {
81
+ app_sdk_1.logger.error('OptiID token is required but not provided');
82
+ return false;
83
+ }
84
+ const { authData, accessToken } = authInfo;
85
+ // Validate organization ID if required
86
+ if (validateOrg && !validateOrganizationId(authData.credentials?.customer_id)) {
87
+ return false;
88
+ }
89
+ return await validateAccessToken(accessToken);
90
+ }
91
+ /**
92
+ * Authenticate a request for regular functions (with organization validation)
93
+ *
94
+ * @param request - The incoming request
95
+ * @returns true if authentication and authorization succeed
96
+ */
97
+ async function authenticateRegularRequest(request) {
98
+ return await authenticateRequest(request, true);
99
+ }
100
+ /**
101
+ * Authenticate a request for global functions (without organization validation)
102
+ *
103
+ * @param request - The incoming request
104
+ * @returns true if authentication succeeds
105
+ */
106
+ async function authenticateGlobalRequest(request) {
107
+ return await authenticateRequest(request, false);
108
+ }
109
+ //# sourceMappingURL=AuthUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthUtils.js","sourceRoot":"","sources":["../../src/auth/AuthUtils.ts"],"names":[],"mappings":";;AA6BA,0CAQC;AAmED,gEAEC;AAQD,8DAEC;AApHD,+CAA0D;AAC1D,mDAAmD;AAGnD;;;;;GAKG;AACH,KAAK,UAAU,mBAAmB,CAAC,WAA+B;IAChE,IAAI,CAAC;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,IAAA,gCAAgB,GAAE,CAAC;QAC/C,OAAO,MAAM,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,OAAY;IAC1C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAsB,CAAC;IAC3D,MAAM,WAAW,GAAG,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC;IACxD,IAAI,CAAC,WAAW,IAAI,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,UAA8B;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,gBAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAA,uBAAa,GAAE,EAAE,OAAO,EAAE,cAAc,CAAC;IACnE,IAAI,UAAU,KAAK,iBAAiB,EAAE,CAAC;QACrC,gBAAM,CAAC,KAAK,CAAC,qCAAqC,iBAAiB,cAAc,UAAU,EAAE,CAAC,CAAC;QAC/F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,OAAY;IAClC,OAAO,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAY,EAAE,WAAoB;IACnE,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,gBAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAE3C,uCAAuC;IACvC,IAAI,WAAW,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,0BAA0B,CAAC,OAAY;IAC3D,OAAO,MAAM,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,yBAAyB,CAAC,OAAY;IAC1D,OAAO,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AuthUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthUtils.test.d.ts","sourceRoot":"","sources":["../../src/auth/AuthUtils.test.ts"],"names":[],"mappings":""}