@enterprisestandard/esv 0.0.5-beta.20260115.1 → 0.0.5-beta.20260115.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.
- package/dist/iam/index.js +664 -5500
- package/dist/iam/index.js.map +1 -23
- package/dist/index.js +156 -6554
- package/dist/index.js.map +1 -27
- package/dist/runner.js +280 -10928
- package/dist/runner.js.map +1 -33
- package/dist/server/crypto.js +134 -0
- package/dist/server/crypto.js.map +1 -0
- package/dist/server/iam.js +402 -0
- package/dist/server/iam.js.map +1 -0
- package/dist/server/index.js +34 -1380
- package/dist/server/index.js.map +1 -16
- package/dist/server/server.js +223 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/sso.js +428 -0
- package/dist/server/sso.js.map +1 -0
- package/dist/server/state.js +152 -0
- package/dist/server/state.js.map +1 -0
- package/dist/server/vault.js +92 -0
- package/dist/server/vault.js.map +1 -0
- package/dist/server/workload.js +226 -0
- package/dist/server/workload.js.map +1 -0
- package/dist/sso/index.js +355 -428
- package/dist/sso/index.js.map +1 -11
- package/dist/tenant/index.js +300 -0
- package/dist/tenant/index.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.js +139 -0
- package/dist/utils.js.map +1 -0
- package/dist/workload/index.js +404 -474
- package/dist/workload/index.js.map +1 -11
- package/package.json +1 -1
package/dist/sso/index.js.map
CHANGED
|
@@ -1,11 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils.ts", "../src/sso/index.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Utility functions for Enterprise Standard Validator\n */\n\nimport type { ValidationConfig, ValidationResult } from './types';\n\n// Optional type import for StandardSchemaV1 - users can pass validators from\n// @enterprisestandard/react-validators-valibot or @enterprisestandard/react-validators-zod\ntype StandardSchemaV1 = {\n readonly '~standard': {\n readonly validate: (\n value: unknown,\n ) =>\n | { value: unknown }\n | { issues: ReadonlyArray<{ message: string; path?: ReadonlyArray<PropertyKey> }> }\n | Promise<{ value: unknown } | { issues: ReadonlyArray<{ message: string; path?: ReadonlyArray<PropertyKey> }> }>;\n };\n};\n\n/**\n * Creates a fetch function with default configuration\n */\nexport function createFetcher(config: ValidationConfig) {\n const timeout = config.timeout ?? 5000;\n const headers = config.headers ?? {};\n\n return async function fetcher(path: string, options: RequestInit = {}): Promise<Response> {\n const url = `${config.baseUrl}${path}`;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: {\n ...headers,\n ...options.headers,\n },\n redirect: 'manual', // Don't follow redirects automatically\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n };\n}\n\n/**\n * Wraps a test function to capture timing and errors\n */\nexport async function runTest(\n name: string,\n testFn: () => Promise<undefined | { details?: Record<string, unknown> }>,\n): Promise<ValidationResult> {\n const start = performance.now();\n try {\n const result = await testFn();\n return {\n name,\n passed: true,\n duration: performance.now() - start,\n details: result?.details,\n };\n } catch (error) {\n return {\n name,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: performance.now() - start,\n };\n }\n}\n\n/**\n * Creates a skipped test result\n */\nexport function skipTest(name: string, reason: string): ValidationResult {\n return {\n name,\n passed: true,\n duration: 0,\n details: { skipped: true, reason },\n };\n}\n\n/**\n * Assertion helper for tests\n */\nexport function assert(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * Assertion helper for equality\n */\nexport function assertEqual<T>(actual: T, expected: T, message?: string): void {\n if (actual !== expected) {\n throw new Error(message ?? `Expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);\n }\n}\n\n/**\n * Assertion helper for validating data against a StandardSchemaV1 validator\n *\n * This is the preferred way to validate data when you have a validator available.\n * The validator can be from valibot, zod, or any other library that implements StandardSchemaV1.\n *\n * @param data - The data to validate\n * @param validator - A StandardSchemaV1 validator (e.g., from valibotValidators or zodValidators)\n * @param message - Optional custom error message\n *\n * @example\n * ```typescript\n * import { valibotValidators } from '@enterprisestandard/react-validators-valibot';\n * const tenantValidator = valibotValidators.createTenantResponse();\n * assertValid(data, tenantValidator);\n * ```\n *\n * @throws Error if validation fails\n */\nexport function assertValid(data: unknown, validator: StandardSchemaV1, message?: string): void {\n const result = validator['~standard'].validate(data);\n\n // Handle both sync and async results\n if (result instanceof Promise) {\n throw new Error(\n message ?? 'Async validators are not supported in assertValid. Use the validator directly with await.',\n );\n }\n\n if ('issues' in result) {\n const issues = result.issues;\n const errorMessages = issues.map((issue) => {\n const path = issue.path ? issue.path.map(String).join('.') : '';\n return path ? `${path}: ${issue.message}` : issue.message;\n });\n throw new Error(message ?? `Validation failed: ${errorMessages.join('; ')}`);\n }\n\n // Validation passed\n}\n\n/**\n * Parses cookies from a Set-Cookie header\n */\nexport function parseCookies(headers: Headers): Map<string, string> {\n const cookies = new Map<string, string>();\n const setCookieHeaders = headers.getSetCookie?.() ?? [];\n\n for (const cookie of setCookieHeaders) {\n const [pair] = cookie.split(';');\n const [name, value] = pair.split('=');\n if (name && value !== undefined) {\n cookies.set(name.trim(), value.trim());\n }\n }\n\n return cookies;\n}\n\n/**\n * Builds a cookie header string from a map\n */\nexport function buildCookieHeader(cookies: Map<string, string>): string {\n return Array.from(cookies.entries())\n .map(([name, value]) => `${name}=${value}`)\n .join('; ');\n}\n",
|
|
6
|
-
"/**\n * SSO Validation Tests\n *\n * These tests validate that an application correctly implements\n * Enterprise Standard SSO (Single Sign-On) functionality.\n */\n\nimport type { SSOValidationConfig, TestDef, ValidationResult, ValidationSuiteResult } from '../types';\nimport { assert, buildCookieHeader, createFetcher, parseCookies, runTest, skipTest } from '../utils';\n\n/**\n * Default configuration for SSO validation\n */\nconst DEFAULT_CONFIG: Partial<SSOValidationConfig> = {\n loginPath: '/api/auth/login',\n callbackPath: '/api/auth/callback',\n userPath: '/api/auth/user',\n logoutPath: '/api/auth/logout',\n backChannelLogoutPath: '/api/auth/logout/backchannel',\n tokenPath: '/api/auth/token',\n refreshPath: '/api/auth/refresh',\n};\n\n/**\n * Test: Login endpoint exists and redirects to authorization URL\n */\nasync function testLoginEndpoint(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n return runTest('SSO Login Endpoint', async () => {\n const response = await fetch(config.loginPath!);\n\n // Should return a redirect (302)\n assert(response.status === 302, `Expected 302 redirect, got ${response.status}`);\n\n // Should have a Location header pointing to the authorization URL\n const location = response.headers.get('Location');\n assert(location !== null, 'Missing Location header in redirect');\n\n // If an expected pattern is provided, validate the URL\n if (config.expectedAuthorizationUrlPattern) {\n assert(\n config.expectedAuthorizationUrlPattern.test(location),\n `Authorization URL does not match expected pattern: ${location}`,\n );\n }\n\n // Should have required OIDC parameters\n const url = new URL(location);\n assert(url.searchParams.has('client_id'), 'Missing client_id in authorization URL');\n assert(url.searchParams.has('redirect_uri'), 'Missing redirect_uri in authorization URL');\n assert(url.searchParams.has('response_type'), 'Missing response_type in authorization URL');\n assert(url.searchParams.has('scope'), 'Missing scope in authorization URL');\n assert(url.searchParams.has('state'), 'Missing state in authorization URL');\n assert(url.searchParams.has('code_challenge'), 'Missing code_challenge (PKCE) in authorization URL');\n assert(url.searchParams.has('code_challenge_method'), 'Missing code_challenge_method (PKCE) in authorization URL');\n\n // Should set a state cookie\n const cookies = parseCookies(response.headers);\n const hasStateCookie = Array.from(cookies.keys()).some((name) => name.includes('.state'));\n assert(hasStateCookie, 'Missing state cookie in response');\n\n return {\n details: {\n authorizationUrl: location,\n pkceEnabled: true,\n stateParameter: url.searchParams.get('state'),\n },\n };\n });\n}\n\n/**\n * Test: User endpoint returns 401 when not authenticated\n */\nasync function testUserEndpointUnauthenticated(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n return runTest('SSO User Endpoint (Unauthenticated)', async () => {\n const response = await fetch(config.userPath!);\n\n // Should return 401 Unauthorized\n assert(response.status === 401, `Expected 401 Unauthorized, got ${response.status}`);\n\n return {\n details: {\n status: response.status,\n },\n };\n });\n}\n\n/**\n * Test: Logout endpoint clears cookies\n */\nasync function testLogoutEndpoint(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n return runTest('SSO Logout Endpoint', async () => {\n const response = await fetch(`${config.logoutPath!}?redirect=/`);\n\n // Should return 302 redirect (with redirect param) or 200\n assert(response.status === 302 || response.status === 200, `Expected 302 or 200, got ${response.status}`);\n\n // Should clear cookies\n const cookies = parseCookies(response.headers);\n const clearedCookies: string[] = [];\n\n for (const [name, value] of cookies.entries()) {\n // Check if the cookie is being cleared (Max-Age=0 or empty value)\n if (value === '' || value.includes('Max-Age=0')) {\n clearedCookies.push(name);\n }\n }\n\n // Check for standard SSO cookies being cleared\n const setCookieHeaders = response.headers.getSetCookie?.() ?? [];\n const hasExpiredCookies = setCookieHeaders.some(\n (cookie) => cookie.includes('Max-Age=0') || cookie.includes('expires=Thu, 01 Jan 1970'),\n );\n\n assert(\n hasExpiredCookies || clearedCookies.length > 0 || setCookieHeaders.length === 0,\n 'Logout should clear session cookies',\n );\n\n return {\n details: {\n status: response.status,\n clearedCookies,\n },\n };\n });\n}\n\n/**\n * Test: Back-channel logout endpoint exists\n */\nasync function testBackChannelLogoutEndpoint(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n return runTest('SSO Back-Channel Logout Endpoint', async () => {\n // Send a POST request without a valid logout token\n // The endpoint should exist and return 400 (bad request) for missing token\n const response = await fetch(config.backChannelLogoutPath!, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: '',\n });\n\n // Should return 400 (missing logout_token) or 200 (if session store not configured)\n assert(\n response.status === 400 || response.status === 200 || response.status === 404,\n `Expected 400 or 200, got ${response.status}`,\n );\n\n return {\n details: {\n status: response.status,\n endpointExists: response.status !== 404,\n },\n };\n });\n}\n\n/**\n * Test: Callback endpoint returns error without valid code\n */\nasync function testCallbackEndpointInvalid(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n return runTest('SSO Callback Endpoint (Invalid)', async () => {\n // Send a callback request without proper state/code\n const response = await fetch(`${config.callbackPath!}?code=invalid&state=invalid`);\n\n // Should return 400 or 500 (validation error)\n assert(response.status >= 400, `Expected error status for invalid callback, got ${response.status}`);\n\n return {\n details: {\n status: response.status,\n handlesInvalidCallback: true,\n },\n };\n });\n}\n\n/**\n * Test: Token endpoint returns 401 when not authenticated\n */\nasync function testTokenEndpointUnauthenticated(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n if (!config.tokenPath) {\n return skipTest('SSO Token Endpoint (Unauthenticated)', 'Token path not configured');\n }\n\n return runTest('SSO Token Endpoint (Unauthenticated)', async () => {\n const response = await fetch(config.tokenPath!);\n\n // Should return 401 Unauthorized\n assert(\n response.status === 401 || response.status === 404,\n `Expected 401 Unauthorized or 404, got ${response.status}`,\n );\n\n return {\n details: {\n status: response.status,\n },\n };\n });\n}\n\n/**\n * Test: Refresh endpoint returns 401 when not authenticated\n */\nasync function testRefreshEndpointUnauthenticated(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n if (!config.refreshPath) {\n return skipTest('SSO Refresh Endpoint (Unauthenticated)', 'Refresh path not configured');\n }\n\n return runTest('SSO Refresh Endpoint (Unauthenticated)', async () => {\n const response = await fetch(config.refreshPath!);\n\n // Should return 401 Unauthorized\n assert(\n response.status === 401 || response.status === 404,\n `Expected 401 Unauthorized or 404, got ${response.status}`,\n );\n\n return {\n details: {\n status: response.status,\n },\n };\n });\n}\n\n/**\n * Helper: Complete a full SSO login flow through the mock server\n *\n * Returns the cookies set after successful authentication\n */\nasync function completeLoginFlow(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<{ cookies: Map<string, string>; success: boolean; error?: string }> {\n try {\n // Step 1: Hit the login endpoint to get the authorization redirect\n const loginResponse = await fetch(config.loginPath!);\n\n if (loginResponse.status !== 302) {\n return { cookies: new Map(), success: false, error: `Login did not redirect: ${loginResponse.status}` };\n }\n\n const authUrl = loginResponse.headers.get('Location');\n if (!authUrl) {\n return { cookies: new Map(), success: false, error: 'No redirect location from login' };\n }\n\n // Collect cookies from login response (includes state cookie)\n const loginCookies = parseCookies(loginResponse.headers);\n\n // Step 2: Follow the redirect to the authorization endpoint (mock server auto-authenticates)\n const authResponse = await globalThis.fetch(authUrl, { redirect: 'manual' });\n\n if (authResponse.status !== 302) {\n return { cookies: new Map(), success: false, error: `Auth did not redirect: ${authResponse.status}` };\n }\n\n const callbackUrl = authResponse.headers.get('Location');\n if (!callbackUrl) {\n return { cookies: new Map(), success: false, error: 'No redirect location from auth' };\n }\n\n // Step 3: Complete the callback with the authorization code\n // Extract just the path and query from the callback URL\n const callbackPath = new URL(callbackUrl).pathname + new URL(callbackUrl).search;\n\n const callbackResponse = await fetch(callbackPath, {\n headers: {\n Cookie: buildCookieHeader(loginCookies),\n },\n });\n\n // Should redirect to landing page on success\n if (callbackResponse.status !== 302) {\n return { cookies: new Map(), success: false, error: `Callback did not redirect: ${callbackResponse.status}` };\n }\n\n // Collect all cookies from the callback response\n const allCookies = parseCookies(callbackResponse.headers);\n\n return { cookies: allCookies, success: true };\n } catch (error) {\n return { cookies: new Map(), success: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\n/**\n * Test: JIT user provisioning works when enabled\n *\n * This test completes a full SSO flow and verifies the user is authenticated.\n * The actual JIT provisioning behavior depends on the server configuration.\n */\nasync function testJitUserProvisioningFlow(\n config: SSOValidationConfig,\n fetch: ReturnType<typeof createFetcher>,\n): Promise<ValidationResult> {\n return runTest('SSO JIT User Provisioning Flow', async () => {\n // Complete the full login flow\n const { cookies, success, error } = await completeLoginFlow(config, fetch);\n\n assert(success, error || 'Login flow failed');\n\n // Verify we got authentication cookies\n const hasAuthCookies = Array.from(cookies.keys()).some((name) => name.includes('.access') || name.includes('.id'));\n assert(hasAuthCookies, 'No authentication cookies set after login');\n\n // Verify we can now access the user endpoint\n const userResponse = await fetch(config.userPath!, {\n headers: {\n Cookie: buildCookieHeader(cookies),\n },\n });\n\n assert(userResponse.status === 200, `User endpoint returned ${userResponse.status} after login, expected 200`);\n\n const userData = await userResponse.json();\n assert(userData.id, 'User data missing id field');\n\n return {\n details: {\n userId: userData.id,\n userName: userData.userName,\n email: userData.email,\n jitFlowCompleted: true,\n },\n };\n });\n}\n\n/**\n * Runs all SSO validation tests\n */\nexport async function validateSSO(config: SSOValidationConfig): Promise<ValidationSuiteResult> {\n const startTime = performance.now();\n const mergedConfig = { ...DEFAULT_CONFIG, ...config };\n const fetch = createFetcher(mergedConfig);\n\n const tests: ValidationResult[] = [];\n\n // Run all tests\n tests.push(await testLoginEndpoint(mergedConfig, fetch));\n tests.push(await testUserEndpointUnauthenticated(mergedConfig, fetch));\n tests.push(await testLogoutEndpoint(mergedConfig, fetch));\n tests.push(await testBackChannelLogoutEndpoint(mergedConfig, fetch));\n tests.push(await testCallbackEndpointInvalid(mergedConfig, fetch));\n tests.push(await testTokenEndpointUnauthenticated(mergedConfig, fetch));\n tests.push(await testRefreshEndpointUnauthenticated(mergedConfig, fetch));\n tests.push(await testJitUserProvisioningFlow(mergedConfig, fetch));\n\n const duration = performance.now() - startTime;\n const passed = tests.filter((t) => t.passed).length;\n const failed = tests.filter((t) => !t.passed).length;\n const skipped = tests.filter((t) => t.details?.skipped).length;\n\n return {\n suite: 'SSO',\n passed: failed === 0,\n tests,\n duration,\n summary: {\n total: tests.length,\n passed: passed - skipped,\n failed,\n skipped,\n },\n };\n}\n\n/**\n * Creates Vitest-compatible test suite for SSO validation\n */\nexport function createSSOTests(config: SSOValidationConfig) {\n const mergedConfig = { ...DEFAULT_CONFIG, ...config };\n const fetch = createFetcher(mergedConfig);\n\n // Core/mandatory SSO tests\n const tests: Array<TestDef> = [\n {\n name: 'login endpoint redirects to authorization URL',\n fn: async () => {\n const result = await testLoginEndpoint(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n {\n name: 'user endpoint returns 401 when unauthenticated',\n fn: async () => {\n const result = await testUserEndpointUnauthenticated(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n {\n name: 'callback endpoint rejects invalid requests',\n fn: async () => {\n const result = await testCallbackEndpointInvalid(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n {\n name: 'token endpoint returns 401 when unauthenticated',\n fn: async () => {\n const result = await testTokenEndpointUnauthenticated(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n {\n name: 'refresh endpoint returns 401 when unauthenticated',\n fn: async () => {\n const result = await testRefreshEndpointUnauthenticated(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n ];\n\n // Extension methods for optional functionality\n const ext = {\n createJITTests: (): Array<TestDef> => [\n {\n name: 'user provisioning flow completes successfully',\n fn: async () => {\n const result = await testJitUserProvisioningFlow(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n ],\n createLogoutTests: (): Array<TestDef> => [\n {\n name: 'logout endpoint clears cookies',\n fn: async () => {\n const result = await testLogoutEndpoint(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n ],\n createBackChannelLogoutTests: (): Array<TestDef> => [\n {\n name: 'endpoint exists',\n fn: async () => {\n const result = await testBackChannelLogoutEndpoint(mergedConfig, fetch);\n if (!result.passed) throw new Error(result.error);\n },\n },\n ],\n };\n\n return { tests, ext };\n}\n\nexport type { SSOValidationConfig };\n"
|
|
7
|
-
],
|
|
8
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBO,SAAS,aAAa,CAAC,QAA0B;AAAA,EACtD,MAAM,UAAU,OAAO,WAAW;AAAA,EAClC,MAAM,UAAU,OAAO,WAAW,CAAC;AAAA,EAEnC,OAAO,eAAe,OAAO,CAAC,MAAc,UAAuB,CAAC,GAAsB;AAAA,IACxF,MAAM,MAAM,GAAG,OAAO,UAAU;AAAA,IAChC,MAAM,aAAa,IAAI;AAAA,IACvB,MAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAAA,IAE9D,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,WAC7B;AAAA,QACH,QAAQ,WAAW;AAAA,QACnB,SAAS;AAAA,aACJ;AAAA,aACA,QAAQ;AAAA,QACb;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,OAAO;AAAA,cACP;AAAA,MACA,aAAa,SAAS;AAAA;AAAA;AAAA;AAQ5B,eAAsB,OAAO,CAC3B,MACA,QAC2B;AAAA,EAC3B,MAAM,QAAQ,YAAY,IAAI;AAAA,EAC9B,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,OAAO;AAAA,IAC5B,OAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,UAAU,YAAY,IAAI,IAAI;AAAA,MAC9B,SAAS,QAAQ;AAAA,IACnB;AAAA,IACA,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,UAAU,YAAY,IAAI,IAAI;AAAA,IAChC;AAAA;AAAA;AAOG,SAAS,QAAQ,CAAC,MAAc,QAAkC;AAAA,EACvE,OAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS,EAAE,SAAS,MAAM,OAAO;AAAA,EACnC;AAAA;AAMK,SAAS,MAAM,CAAC,WAAoB,SAAoC;AAAA,EAC7E,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAAA;AAMK,SAAS,WAAc,CAAC,QAAW,UAAa,SAAwB;AAAA,EAC7E,IAAI,WAAW,UAAU;AAAA,IACvB,MAAM,IAAI,MAAM,WAAW,YAAY,KAAK,UAAU,QAAQ,UAAU,KAAK,UAAU,MAAM,GAAG;AAAA,EAClG;AAAA;AAsBK,SAAS,WAAW,CAAC,MAAe,WAA6B,SAAwB;AAAA,EAC9F,MAAM,SAAS,UAAU,aAAa,SAAS,IAAI;AAAA,EAGnD,IAAI,kBAAkB,SAAS;AAAA,IAC7B,MAAM,IAAI,MACR,WAAW,2FACb;AAAA,EACF;AAAA,EAEA,IAAI,YAAY,QAAQ;AAAA,IACtB,MAAM,SAAS,OAAO;AAAA,IACtB,MAAM,gBAAgB,OAAO,IAAI,CAAC,UAAU;AAAA,MAC1C,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,IAAI;AAAA,MAC7D,OAAO,OAAO,GAAG,SAAS,MAAM,YAAY,MAAM;AAAA,KACnD;AAAA,IACD,MAAM,IAAI,MAAM,WAAW,sBAAsB,cAAc,KAAK,IAAI,GAAG;AAAA,EAC7E;AAAA;AAQK,SAAS,YAAY,CAAC,SAAuC;AAAA,EAClE,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,mBAAmB,QAAQ,eAAe,KAAK,CAAC;AAAA,EAEtD,WAAW,UAAU,kBAAkB;AAAA,IACrC,OAAO,QAAQ,OAAO,MAAM,GAAG;AAAA,IAC/B,OAAO,MAAM,SAAS,KAAK,MAAM,GAAG;AAAA,IACpC,IAAI,QAAQ,UAAU,WAAW;AAAA,MAC/B,QAAQ,IAAI,KAAK,KAAK,GAAG,MAAM,KAAK,CAAC;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMF,SAAS,iBAAiB,CAAC,SAAsC;AAAA,EACtE,OAAO,MAAM,KAAK,QAAQ,QAAQ,CAAC,EAChC,IAAI,EAAE,MAAM,WAAW,GAAG,QAAQ,OAAO,EACzC,KAAK,IAAI;AAAA;;;;;;;;AC/Id,eAAe,iBAAiB,CAC9B,QACA,QAC2B;AAAA,EAC3B,OAAO,QAAQ,sBAAsB,YAAY;AAAA,IAC/C,MAAM,WAAW,MAAM,OAAM,OAAO,SAAU;AAAA,IAG9C,OAAO,SAAS,WAAW,KAAK,8BAA8B,SAAS,QAAQ;AAAA,IAG/E,MAAM,WAAW,SAAS,QAAQ,IAAI,UAAU;AAAA,IAChD,OAAO,aAAa,MAAM,qCAAqC;AAAA,IAG/D,IAAI,OAAO,iCAAiC;AAAA,MAC1C,OACE,OAAO,gCAAgC,KAAK,QAAQ,GACpD,sDAAsD,UACxD;AAAA,IACF;AAAA,IAGA,MAAM,MAAM,IAAI,IAAI,QAAQ;AAAA,IAC5B,OAAO,IAAI,aAAa,IAAI,WAAW,GAAG,wCAAwC;AAAA,IAClF,OAAO,IAAI,aAAa,IAAI,cAAc,GAAG,2CAA2C;AAAA,IACxF,OAAO,IAAI,aAAa,IAAI,eAAe,GAAG,4CAA4C;AAAA,IAC1F,OAAO,IAAI,aAAa,IAAI,OAAO,GAAG,oCAAoC;AAAA,IAC1E,OAAO,IAAI,aAAa,IAAI,OAAO,GAAG,oCAAoC;AAAA,IAC1E,OAAO,IAAI,aAAa,IAAI,gBAAgB,GAAG,oDAAoD;AAAA,IACnG,OAAO,IAAI,aAAa,IAAI,uBAAuB,GAAG,2DAA2D;AAAA,IAGjH,MAAM,UAAU,aAAa,SAAS,OAAO;AAAA,IAC7C,MAAM,iBAAiB,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,CAAC;AAAA,IACxF,OAAO,gBAAgB,kCAAkC;AAAA,IAEzD,OAAO;AAAA,MACL,SAAS;AAAA,QACP,kBAAkB;AAAA,QAClB,aAAa;AAAA,QACb,gBAAgB,IAAI,aAAa,IAAI,OAAO;AAAA,MAC9C;AAAA,IACF;AAAA,GACD;AAAA;AAMH,eAAe,+BAA+B,CAC5C,QACA,QAC2B;AAAA,EAC3B,OAAO,QAAQ,uCAAuC,YAAY;AAAA,IAChE,MAAM,WAAW,MAAM,OAAM,OAAO,QAAS;AAAA,IAG7C,OAAO,SAAS,WAAW,KAAK,kCAAkC,SAAS,QAAQ;AAAA,IAEnF,OAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,GACD;AAAA;AAMH,eAAe,kBAAkB,CAC/B,QACA,QAC2B;AAAA,EAC3B,OAAO,QAAQ,uBAAuB,YAAY;AAAA,IAChD,MAAM,WAAW,MAAM,OAAM,GAAG,OAAO,uBAAwB;AAAA,IAG/D,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK,4BAA4B,SAAS,QAAQ;AAAA,IAGxG,MAAM,UAAU,aAAa,SAAS,OAAO;AAAA,IAC7C,MAAM,iBAA2B,CAAC;AAAA,IAElC,YAAY,MAAM,UAAU,QAAQ,QAAQ,GAAG;AAAA,MAE7C,IAAI,UAAU,MAAM,MAAM,SAAS,WAAW,GAAG;AAAA,QAC/C,eAAe,KAAK,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,IAGA,MAAM,mBAAmB,SAAS,QAAQ,eAAe,KAAK,CAAC;AAAA,IAC/D,MAAM,oBAAoB,iBAAiB,KACzC,CAAC,WAAW,OAAO,SAAS,WAAW,KAAK,OAAO,SAAS,0BAA0B,CACxF;AAAA,IAEA,OACE,qBAAqB,eAAe,SAAS,KAAK,iBAAiB,WAAW,GAC9E,qCACF;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,GACD;AAAA;AAMH,eAAe,6BAA6B,CAC1C,QACA,QAC2B;AAAA,EAC3B,OAAO,QAAQ,oCAAoC,YAAY;AAAA,IAG7D,MAAM,WAAW,MAAM,OAAM,OAAO,uBAAwB;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,IAGD,OACE,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,KAC1E,4BAA4B,SAAS,QACvC;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ,SAAS;AAAA,QACjB,gBAAgB,SAAS,WAAW;AAAA,MACtC;AAAA,IACF;AAAA,GACD;AAAA;AAMH,eAAe,2BAA2B,CACxC,QACA,QAC2B;AAAA,EAC3B,OAAO,QAAQ,mCAAmC,YAAY;AAAA,IAE5D,MAAM,WAAW,MAAM,OAAM,GAAG,OAAO,yCAA0C;AAAA,IAGjF,OAAO,SAAS,UAAU,KAAK,mDAAmD,SAAS,QAAQ;AAAA,IAEnG,OAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ,SAAS;AAAA,QACjB,wBAAwB;AAAA,MAC1B;AAAA,IACF;AAAA,GACD;AAAA;AAMH,eAAe,gCAAgC,CAC7C,QACA,QAC2B;AAAA,EAC3B,IAAI,CAAC,OAAO,WAAW;AAAA,IACrB,OAAO,SAAS,wCAAwC,2BAA2B;AAAA,EACrF;AAAA,EAEA,OAAO,QAAQ,wCAAwC,YAAY;AAAA,IACjE,MAAM,WAAW,MAAM,OAAM,OAAO,SAAU;AAAA,IAG9C,OACE,SAAS,WAAW,OAAO,SAAS,WAAW,KAC/C,yCAAyC,SAAS,QACpD;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,GACD;AAAA;AAMH,eAAe,kCAAkC,CAC/C,QACA,QAC2B;AAAA,EAC3B,IAAI,CAAC,OAAO,aAAa;AAAA,IACvB,OAAO,SAAS,0CAA0C,6BAA6B;AAAA,EACzF;AAAA,EAEA,OAAO,QAAQ,0CAA0C,YAAY;AAAA,IACnE,MAAM,WAAW,MAAM,OAAM,OAAO,WAAY;AAAA,IAGhD,OACE,SAAS,WAAW,OAAO,SAAS,WAAW,KAC/C,yCAAyC,SAAS,QACpD;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,GACD;AAAA;AAQH,eAAe,iBAAiB,CAC9B,QACA,QAC6E;AAAA,EAC7E,IAAI;AAAA,IAEF,MAAM,gBAAgB,MAAM,OAAM,OAAO,SAAU;AAAA,IAEnD,IAAI,cAAc,WAAW,KAAK;AAAA,MAChC,OAAO,EAAE,SAAS,IAAI,KAAO,SAAS,OAAO,OAAO,2BAA2B,cAAc,SAAS;AAAA,IACxG;AAAA,IAEA,MAAM,UAAU,cAAc,QAAQ,IAAI,UAAU;AAAA,IACpD,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO,EAAE,SAAS,IAAI,KAAO,SAAS,OAAO,OAAO,kCAAkC;AAAA,IACxF;AAAA,IAGA,MAAM,eAAe,aAAa,cAAc,OAAO;AAAA,IAGvD,MAAM,eAAe,MAAM,WAAW,MAAM,SAAS,EAAE,UAAU,SAAS,CAAC;AAAA,IAE3E,IAAI,aAAa,WAAW,KAAK;AAAA,MAC/B,OAAO,EAAE,SAAS,IAAI,KAAO,SAAS,OAAO,OAAO,0BAA0B,aAAa,SAAS;AAAA,IACtG;AAAA,IAEA,MAAM,cAAc,aAAa,QAAQ,IAAI,UAAU;AAAA,IACvD,IAAI,CAAC,aAAa;AAAA,MAChB,OAAO,EAAE,SAAS,IAAI,KAAO,SAAS,OAAO,OAAO,iCAAiC;AAAA,IACvF;AAAA,IAIA,MAAM,eAAe,IAAI,IAAI,WAAW,EAAE,WAAW,IAAI,IAAI,WAAW,EAAE;AAAA,IAE1E,MAAM,mBAAmB,MAAM,OAAM,cAAc;AAAA,MACjD,SAAS;AAAA,QACP,QAAQ,kBAAkB,YAAY;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,IAGD,IAAI,iBAAiB,WAAW,KAAK;AAAA,MACnC,OAAO,EAAE,SAAS,IAAI,KAAO,SAAS,OAAO,OAAO,8BAA8B,iBAAiB,SAAS;AAAA,IAC9G;AAAA,IAGA,MAAM,aAAa,aAAa,iBAAiB,OAAO;AAAA,IAExD,OAAO,EAAE,SAAS,YAAY,SAAS,KAAK;AAAA,IAC5C,OAAO,OAAO;AAAA,IACd,OAAO,EAAE,SAAS,IAAI,KAAO,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA;AAAA;AAU/G,eAAe,2BAA2B,CACxC,QACA,QAC2B;AAAA,EAC3B,OAAO,QAAQ,kCAAkC,YAAY;AAAA,IAE3D,QAAQ,SAAS,SAAS,UAAU,MAAM,kBAAkB,QAAQ,MAAK;AAAA,IAEzE,OAAO,SAAS,SAAS,mBAAmB;AAAA,IAG5C,MAAM,iBAAiB,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,IACjH,OAAO,gBAAgB,2CAA2C;AAAA,IAGlE,MAAM,eAAe,MAAM,OAAM,OAAO,UAAW;AAAA,MACjD,SAAS;AAAA,QACP,QAAQ,kBAAkB,OAAO;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,IAED,OAAO,aAAa,WAAW,KAAK,0BAA0B,aAAa,kCAAkC;AAAA,IAE7G,MAAM,WAAW,MAAM,aAAa,KAAK;AAAA,IACzC,OAAO,SAAS,IAAI,4BAA4B;AAAA,IAEhD,OAAO;AAAA,MACL,SAAS;AAAA,QACP,QAAQ,SAAS;AAAA,QACjB,UAAU,SAAS;AAAA,QACnB,OAAO,SAAS;AAAA,QAChB,kBAAkB;AAAA,MACpB;AAAA,IACF;AAAA,GACD;AAAA;AAMH,eAAsB,WAAW,CAAC,QAA6D;AAAA,EAC7F,MAAM,YAAY,YAAY,IAAI;AAAA,EAClC,MAAM,eAAe,KAAK,mBAAmB,OAAO;AAAA,EACpD,MAAM,SAAQ,cAAc,YAAY;AAAA,EAExC,MAAM,QAA4B,CAAC;AAAA,EAGnC,MAAM,KAAK,MAAM,kBAAkB,cAAc,MAAK,CAAC;AAAA,EACvD,MAAM,KAAK,MAAM,gCAAgC,cAAc,MAAK,CAAC;AAAA,EACrE,MAAM,KAAK,MAAM,mBAAmB,cAAc,MAAK,CAAC;AAAA,EACxD,MAAM,KAAK,MAAM,8BAA8B,cAAc,MAAK,CAAC;AAAA,EACnE,MAAM,KAAK,MAAM,4BAA4B,cAAc,MAAK,CAAC;AAAA,EACjE,MAAM,KAAK,MAAM,iCAAiC,cAAc,MAAK,CAAC;AAAA,EACtE,MAAM,KAAK,MAAM,mCAAmC,cAAc,MAAK,CAAC;AAAA,EACxE,MAAM,KAAK,MAAM,4BAA4B,cAAc,MAAK,CAAC;AAAA,EAEjE,MAAM,WAAW,YAAY,IAAI,IAAI;AAAA,EACrC,MAAM,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAAA,EAC7C,MAAM,SAAS,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE;AAAA,EAC9C,MAAM,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE;AAAA,EAExD,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,WAAW;AAAA,IACnB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,OAAO,MAAM;AAAA,MACb,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAMK,SAAS,cAAc,CAAC,QAA6B;AAAA,EAC1D,MAAM,eAAe,KAAK,mBAAmB,OAAO;AAAA,EACpD,MAAM,SAAQ,cAAc,YAAY;AAAA,EAGxC,MAAM,QAAwB;AAAA,IAC5B;AAAA,MACE,MAAM;AAAA,MACN,IAAI,YAAY;AAAA,QACd,MAAM,SAAS,MAAM,kBAAkB,cAAc,MAAK;AAAA,QAC1D,IAAI,CAAC,OAAO;AAAA,UAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,IAEpD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,IAAI,YAAY;AAAA,QACd,MAAM,SAAS,MAAM,gCAAgC,cAAc,MAAK;AAAA,QACxE,IAAI,CAAC,OAAO;AAAA,UAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,IAEpD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,IAAI,YAAY;AAAA,QACd,MAAM,SAAS,MAAM,4BAA4B,cAAc,MAAK;AAAA,QACpE,IAAI,CAAC,OAAO;AAAA,UAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,IAEpD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,IAAI,YAAY;AAAA,QACd,MAAM,SAAS,MAAM,iCAAiC,cAAc,MAAK;AAAA,QACzE,IAAI,CAAC,OAAO;AAAA,UAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,IAEpD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,IAAI,YAAY;AAAA,QACd,MAAM,SAAS,MAAM,mCAAmC,cAAc,MAAK;AAAA,QAC3E,IAAI,CAAC,OAAO;AAAA,UAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,IAEpD;AAAA,EACF;AAAA,EAGA,MAAM,MAAM;AAAA,IACV,gBAAgB,MAAsB;AAAA,MACpC;AAAA,QACE,MAAM;AAAA,QACN,IAAI,YAAY;AAAA,UACd,MAAM,SAAS,MAAM,4BAA4B,cAAc,MAAK;AAAA,UACpE,IAAI,CAAC,OAAO;AAAA,YAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,MAEpD;AAAA,IACF;AAAA,IACA,mBAAmB,MAAsB;AAAA,MACvC;AAAA,QACE,MAAM;AAAA,QACN,IAAI,YAAY;AAAA,UACd,MAAM,SAAS,MAAM,mBAAmB,cAAc,MAAK;AAAA,UAC3D,IAAI,CAAC,OAAO;AAAA,YAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,MAEpD;AAAA,IACF;AAAA,IACA,8BAA8B,MAAsB;AAAA,MAClD;AAAA,QACE,MAAM;AAAA,QACN,IAAI,YAAY;AAAA,UACd,MAAM,SAAS,MAAM,8BAA8B,cAAc,MAAK;AAAA,UACtE,IAAI,CAAC,OAAO;AAAA,YAAQ,MAAM,IAAI,MAAM,OAAO,KAAK;AAAA;AAAA,MAEpD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,OAAO,IAAI;AAAA;AAAA,IAzchB;AAAA;AAAA,mBAA+C;AAAA,IACnD,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,uBAAuB;AAAA,IACvB,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA;",
|
|
9
|
-
"debugId": "65C413DE1A60173A64756E2164756E21",
|
|
10
|
-
"names": []
|
|
11
|
-
}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sso/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant Validation Tests
|
|
3
|
+
*
|
|
4
|
+
* These tests validate that an application correctly implements
|
|
5
|
+
* Enterprise Standard Tenant Management functionality.
|
|
6
|
+
*/
|
|
7
|
+
import { assert, assertValid, createFetcher, runTest } from '../utils';
|
|
8
|
+
/**
|
|
9
|
+
* Gets a tenant response validator
|
|
10
|
+
* Requires either @enterprisestandard/react-validators-valibot or @enterprisestandard/react-validators-zod to be installed
|
|
11
|
+
* Uses a cached validator to avoid repeated imports
|
|
12
|
+
*/
|
|
13
|
+
let cachedValidator = null;
|
|
14
|
+
let validatorPromise = null;
|
|
15
|
+
async function getTenantResponseValidator() {
|
|
16
|
+
// Return cached validator if available
|
|
17
|
+
if (cachedValidator) {
|
|
18
|
+
return cachedValidator;
|
|
19
|
+
}
|
|
20
|
+
// If we're already loading, return the existing promise
|
|
21
|
+
if (validatorPromise) {
|
|
22
|
+
return validatorPromise;
|
|
23
|
+
}
|
|
24
|
+
// Start loading the validator
|
|
25
|
+
validatorPromise = (async () => {
|
|
26
|
+
// Try valibot first
|
|
27
|
+
try {
|
|
28
|
+
const { valibotValidators } = await import('@enterprisestandard/react-validators-valibot');
|
|
29
|
+
cachedValidator = valibotValidators.createTenantResponse();
|
|
30
|
+
return cachedValidator;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Fall back to zod
|
|
34
|
+
try {
|
|
35
|
+
const { zodValidators } = await import('@enterprisestandard/react-validators-zod');
|
|
36
|
+
cachedValidator = zodValidators.createTenantResponse();
|
|
37
|
+
return cachedValidator;
|
|
38
|
+
}
|
|
39
|
+
catch (_error) {
|
|
40
|
+
throw new Error('Tenant validation requires either @enterprisestandard/react-validators-valibot or @enterprisestandard/react-validators-zod to be installed. Please install one of these packages.');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
})();
|
|
44
|
+
return validatorPromise;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Default configuration for Tenant validation
|
|
48
|
+
*/
|
|
49
|
+
const DEFAULT_CONFIG = {
|
|
50
|
+
tenantPath: '/api/tenant',
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Test: Tenant creation endpoint returns valid response structure
|
|
54
|
+
*/
|
|
55
|
+
async function testCreateTenantResponseShape(config, fetch, tenantData, webhookUrl) {
|
|
56
|
+
const result = await runTest('Tenant Creation Response Shape', async () => {
|
|
57
|
+
if (!tenantData) {
|
|
58
|
+
return {
|
|
59
|
+
details: {
|
|
60
|
+
skipped: true,
|
|
61
|
+
reason: 'Test tenant data not provided',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const payload = {
|
|
66
|
+
appId: tenantData.appId,
|
|
67
|
+
companyId: tenantData.companyId,
|
|
68
|
+
companyName: tenantData.companyName,
|
|
69
|
+
environmentType: tenantData.environmentType,
|
|
70
|
+
email: tenantData.email,
|
|
71
|
+
webhookUrl: webhookUrl || 'https://example.com/webhook',
|
|
72
|
+
};
|
|
73
|
+
const response = await fetch(config.tenantPath, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify(payload),
|
|
79
|
+
});
|
|
80
|
+
// Should return 201 or 202
|
|
81
|
+
assert(response.status === 201 || response.status === 202, `Expected 201 or 202, got ${response.status}`);
|
|
82
|
+
const data = await response.json();
|
|
83
|
+
// Should have tenant response structure - validate using validator
|
|
84
|
+
const validator = await getTenantResponseValidator();
|
|
85
|
+
assertValid(data, validator);
|
|
86
|
+
return {
|
|
87
|
+
details: {
|
|
88
|
+
status: data.status,
|
|
89
|
+
httpStatus: response.status,
|
|
90
|
+
tenantUrl: data.tenantUrl,
|
|
91
|
+
response: data,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
...result,
|
|
97
|
+
response: result.details?.response,
|
|
98
|
+
tenantUrl: result.details?.tenantUrl,
|
|
99
|
+
status: result.details?.status,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Test: Tenant creation with immediate completion (201)
|
|
104
|
+
*/
|
|
105
|
+
async function testCreateTenantImmediate(config, fetch, tenantData) {
|
|
106
|
+
return runTest('Tenant Creation (Immediate - 201)', async () => {
|
|
107
|
+
if (!tenantData) {
|
|
108
|
+
return {
|
|
109
|
+
details: {
|
|
110
|
+
skipped: true,
|
|
111
|
+
reason: 'Test tenant data not provided',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const payload = {
|
|
116
|
+
appId: tenantData.appId,
|
|
117
|
+
companyId: tenantData.companyId,
|
|
118
|
+
companyName: tenantData.companyName,
|
|
119
|
+
environmentType: tenantData.environmentType,
|
|
120
|
+
email: tenantData.email,
|
|
121
|
+
webhookUrl: 'https://example.com/webhook',
|
|
122
|
+
};
|
|
123
|
+
const response = await fetch(config.tenantPath, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: {
|
|
126
|
+
'Content-Type': 'application/json',
|
|
127
|
+
},
|
|
128
|
+
body: JSON.stringify(payload),
|
|
129
|
+
});
|
|
130
|
+
// For immediate creation, we expect either 201 or 202
|
|
131
|
+
// 201 indicates completed, 202 indicates pending/async
|
|
132
|
+
assert(response.status === 201 || response.status === 202, `Expected 201 or 202, got ${response.status}`);
|
|
133
|
+
const data = await response.json();
|
|
134
|
+
// Should have tenant response structure - validate using validator
|
|
135
|
+
const validator = await getTenantResponseValidator();
|
|
136
|
+
assertValid(data, validator);
|
|
137
|
+
// If status is 201, status should be "completed"
|
|
138
|
+
if (response.status === 201) {
|
|
139
|
+
assert(data.status === 'completed', `Expected status "completed" for 201 response, got ${data.status}`);
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
details: {
|
|
143
|
+
httpStatus: response.status,
|
|
144
|
+
status: data.status,
|
|
145
|
+
tenantUrl: data.tenantUrl,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Test: Tenant creation with async processing (202)
|
|
152
|
+
*/
|
|
153
|
+
async function testCreateTenantAsync(config, fetch, tenantData, webhookUrl) {
|
|
154
|
+
return runTest('Tenant Creation (Async - 202)', async () => {
|
|
155
|
+
if (!tenantData) {
|
|
156
|
+
return {
|
|
157
|
+
details: {
|
|
158
|
+
skipped: true,
|
|
159
|
+
reason: 'Test tenant data not provided',
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const payload = {
|
|
164
|
+
appId: tenantData.appId,
|
|
165
|
+
companyId: tenantData.companyId,
|
|
166
|
+
companyName: tenantData.companyName,
|
|
167
|
+
environmentType: tenantData.environmentType,
|
|
168
|
+
email: tenantData.email,
|
|
169
|
+
webhookUrl: webhookUrl || 'https://example.com/webhook',
|
|
170
|
+
};
|
|
171
|
+
const response = await fetch(config.tenantPath, {
|
|
172
|
+
method: 'POST',
|
|
173
|
+
headers: {
|
|
174
|
+
'Content-Type': 'application/json',
|
|
175
|
+
},
|
|
176
|
+
body: JSON.stringify(payload),
|
|
177
|
+
});
|
|
178
|
+
// For async creation, we expect 202
|
|
179
|
+
// But we also accept 201 (some apps may complete immediately)
|
|
180
|
+
assert(response.status === 201 || response.status === 202, `Expected 201 or 202, got ${response.status}`);
|
|
181
|
+
const data = await response.json();
|
|
182
|
+
// Should have tenant response structure - validate using validator
|
|
183
|
+
const validator = await getTenantResponseValidator();
|
|
184
|
+
assertValid(data, validator);
|
|
185
|
+
// If status is 202, status should be "pending" or "processing"
|
|
186
|
+
if (response.status === 202) {
|
|
187
|
+
assert(data.status === 'pending' || data.status === 'processing', `Expected status "pending" or "processing" for 202 response, got ${data.status}`);
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
details: {
|
|
191
|
+
httpStatus: response.status,
|
|
192
|
+
status: data.status,
|
|
193
|
+
tenantUrl: data.tenantUrl,
|
|
194
|
+
isAsync: response.status === 202,
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Test: Tenant creation endpoint validates required fields
|
|
201
|
+
*/
|
|
202
|
+
async function testCreateTenantValidation(config, fetch) {
|
|
203
|
+
return runTest('Tenant Creation (Validation)', async () => {
|
|
204
|
+
// Test with missing required fields
|
|
205
|
+
const invalidPayload = {
|
|
206
|
+
companyId: 'test-company',
|
|
207
|
+
// Missing other required fields
|
|
208
|
+
};
|
|
209
|
+
const response = await fetch(config.tenantPath, {
|
|
210
|
+
method: 'POST',
|
|
211
|
+
headers: {
|
|
212
|
+
'Content-Type': 'application/json',
|
|
213
|
+
},
|
|
214
|
+
body: JSON.stringify(invalidPayload),
|
|
215
|
+
});
|
|
216
|
+
// Should return 400 for invalid request
|
|
217
|
+
assert(response.status === 400, `Expected 400 Bad Request for invalid payload, got ${response.status}`);
|
|
218
|
+
return {
|
|
219
|
+
details: {
|
|
220
|
+
status: response.status,
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Runs all Tenant validation tests
|
|
227
|
+
*/
|
|
228
|
+
export async function validateTenant(config) {
|
|
229
|
+
const startTime = performance.now();
|
|
230
|
+
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
231
|
+
const fetch = createFetcher(mergedConfig);
|
|
232
|
+
const tests = [];
|
|
233
|
+
// Test validation (invalid payload)
|
|
234
|
+
tests.push(await testCreateTenantValidation(mergedConfig, fetch));
|
|
235
|
+
// Test response shape and get response data
|
|
236
|
+
const shapeResult = await testCreateTenantResponseShape(mergedConfig, fetch, mergedConfig.testTenantData, mergedConfig.webhookPath ? `${mergedConfig.baseUrl}${mergedConfig.webhookPath}` : undefined);
|
|
237
|
+
tests.push(shapeResult);
|
|
238
|
+
// Test immediate creation (201)
|
|
239
|
+
tests.push(await testCreateTenantImmediate(mergedConfig, fetch, mergedConfig.testTenantData));
|
|
240
|
+
// Test async creation (202)
|
|
241
|
+
tests.push(await testCreateTenantAsync(mergedConfig, fetch, mergedConfig.testTenantData, mergedConfig.webhookPath ? `${mergedConfig.baseUrl}${mergedConfig.webhookPath}` : undefined));
|
|
242
|
+
const duration = performance.now() - startTime;
|
|
243
|
+
const passed = tests.filter((t) => t.passed).length;
|
|
244
|
+
const failed = tests.filter((t) => !t.passed).length;
|
|
245
|
+
const skipped = tests.filter((t) => t.details?.skipped).length;
|
|
246
|
+
return {
|
|
247
|
+
suite: 'Tenant',
|
|
248
|
+
passed: failed === 0,
|
|
249
|
+
tests,
|
|
250
|
+
duration,
|
|
251
|
+
summary: {
|
|
252
|
+
total: tests.length,
|
|
253
|
+
passed: passed - skipped,
|
|
254
|
+
failed,
|
|
255
|
+
skipped,
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Creates Vitest-compatible test suite for Tenant validation
|
|
261
|
+
*/
|
|
262
|
+
export function createTenantTests(config) {
|
|
263
|
+
const mergedConfig = { ...DEFAULT_CONFIG, ...config };
|
|
264
|
+
const fetch = createFetcher(mergedConfig);
|
|
265
|
+
return [
|
|
266
|
+
{
|
|
267
|
+
name: 'tenant creation endpoint validates required fields',
|
|
268
|
+
fn: async () => {
|
|
269
|
+
const result = await testCreateTenantValidation(mergedConfig, fetch);
|
|
270
|
+
if (!result.passed)
|
|
271
|
+
throw new Error(result.error);
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: 'tenant creation returns valid response structure',
|
|
276
|
+
fn: async () => {
|
|
277
|
+
const result = await testCreateTenantResponseShape(mergedConfig, fetch, mergedConfig.testTenantData, mergedConfig.webhookPath ? `${mergedConfig.baseUrl}${mergedConfig.webhookPath}` : undefined);
|
|
278
|
+
if (!result.passed && !result.details?.skipped)
|
|
279
|
+
throw new Error(result.error);
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
name: 'tenant creation supports immediate completion (201)',
|
|
284
|
+
fn: async () => {
|
|
285
|
+
const result = await testCreateTenantImmediate(mergedConfig, fetch, mergedConfig.testTenantData);
|
|
286
|
+
if (!result.passed && !result.details?.skipped)
|
|
287
|
+
throw new Error(result.error);
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
name: 'tenant creation supports async processing (202)',
|
|
292
|
+
fn: async () => {
|
|
293
|
+
const result = await testCreateTenantAsync(mergedConfig, fetch, mergedConfig.testTenantData, mergedConfig.webhookPath ? `${mergedConfig.baseUrl}${mergedConfig.webhookPath}` : undefined);
|
|
294
|
+
if (!result.passed && !result.details?.skipped)
|
|
295
|
+
throw new Error(result.error);
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
];
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tenant/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for Enterprise Standard Validator
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Creates a fetch function with default configuration
|
|
6
|
+
*/
|
|
7
|
+
export function createFetcher(config) {
|
|
8
|
+
const timeout = config.timeout ?? 5000;
|
|
9
|
+
const headers = config.headers ?? {};
|
|
10
|
+
return async function fetcher(path, options = {}) {
|
|
11
|
+
const url = `${config.baseUrl}${path}`;
|
|
12
|
+
const controller = new AbortController();
|
|
13
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
14
|
+
try {
|
|
15
|
+
const response = await fetch(url, {
|
|
16
|
+
...options,
|
|
17
|
+
signal: controller.signal,
|
|
18
|
+
headers: {
|
|
19
|
+
...headers,
|
|
20
|
+
...options.headers,
|
|
21
|
+
},
|
|
22
|
+
redirect: 'manual', // Don't follow redirects automatically
|
|
23
|
+
});
|
|
24
|
+
return response;
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
clearTimeout(timeoutId);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Wraps a test function to capture timing and errors
|
|
33
|
+
*/
|
|
34
|
+
export async function runTest(name, testFn) {
|
|
35
|
+
const start = performance.now();
|
|
36
|
+
try {
|
|
37
|
+
const result = await testFn();
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
passed: true,
|
|
41
|
+
duration: performance.now() - start,
|
|
42
|
+
details: result?.details,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
name,
|
|
48
|
+
passed: false,
|
|
49
|
+
error: error instanceof Error ? error.message : String(error),
|
|
50
|
+
duration: performance.now() - start,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Creates a skipped test result
|
|
56
|
+
*/
|
|
57
|
+
export function skipTest(name, reason) {
|
|
58
|
+
return {
|
|
59
|
+
name,
|
|
60
|
+
passed: true,
|
|
61
|
+
duration: 0,
|
|
62
|
+
details: { skipped: true, reason },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Assertion helper for tests
|
|
67
|
+
*/
|
|
68
|
+
export function assert(condition, message) {
|
|
69
|
+
if (!condition) {
|
|
70
|
+
throw new Error(message);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Assertion helper for equality
|
|
75
|
+
*/
|
|
76
|
+
export function assertEqual(actual, expected, message) {
|
|
77
|
+
if (actual !== expected) {
|
|
78
|
+
throw new Error(message ?? `Expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Assertion helper for validating data against a StandardSchemaV1 validator
|
|
83
|
+
*
|
|
84
|
+
* This is the preferred way to validate data when you have a validator available.
|
|
85
|
+
* The validator can be from valibot, zod, or any other library that implements StandardSchemaV1.
|
|
86
|
+
*
|
|
87
|
+
* @param data - The data to validate
|
|
88
|
+
* @param validator - A StandardSchemaV1 validator (e.g., from valibotValidators or zodValidators)
|
|
89
|
+
* @param message - Optional custom error message
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* import { valibotValidators } from '@enterprisestandard/react-validators-valibot';
|
|
94
|
+
* const tenantValidator = valibotValidators.createTenantResponse();
|
|
95
|
+
* assertValid(data, tenantValidator);
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @throws Error if validation fails
|
|
99
|
+
*/
|
|
100
|
+
export function assertValid(data, validator, message) {
|
|
101
|
+
const result = validator['~standard'].validate(data);
|
|
102
|
+
// Handle both sync and async results
|
|
103
|
+
if (result instanceof Promise) {
|
|
104
|
+
throw new Error(message ?? 'Async validators are not supported in assertValid. Use the validator directly with await.');
|
|
105
|
+
}
|
|
106
|
+
if ('issues' in result) {
|
|
107
|
+
const issues = result.issues;
|
|
108
|
+
const errorMessages = issues.map((issue) => {
|
|
109
|
+
const path = issue.path ? issue.path.map(String).join('.') : '';
|
|
110
|
+
return path ? `${path}: ${issue.message}` : issue.message;
|
|
111
|
+
});
|
|
112
|
+
throw new Error(message ?? `Validation failed: ${errorMessages.join('; ')}`);
|
|
113
|
+
}
|
|
114
|
+
// Validation passed
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Parses cookies from a Set-Cookie header
|
|
118
|
+
*/
|
|
119
|
+
export function parseCookies(headers) {
|
|
120
|
+
const cookies = new Map();
|
|
121
|
+
const setCookieHeaders = headers.getSetCookie?.() ?? [];
|
|
122
|
+
for (const cookie of setCookieHeaders) {
|
|
123
|
+
const [pair] = cookie.split(';');
|
|
124
|
+
const [name, value] = pair.split('=');
|
|
125
|
+
if (name && value !== undefined) {
|
|
126
|
+
cookies.set(name.trim(), value.trim());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return cookies;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Builds a cookie header string from a map
|
|
133
|
+
*/
|
|
134
|
+
export function buildCookieHeader(cookies) {
|
|
135
|
+
return Array.from(cookies.entries())
|
|
136
|
+
.map(([name, value]) => `${name}=${value}`)
|
|
137
|
+
.join('; ');
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|