@tableau/mcp-server 1.12.4 → 1.13.1
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/build/index.js +556 -35
- package/build/index.js.map +4 -4
- package/package.json +3 -1
package/build/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/config.ts", "../src/tools/toolName.ts", "../src/transports.ts", "../src/utils/invariant.ts", "../src/logging/log.ts", "../src/logging/serverLogger.ts", "../src/utils/getExceptionMessage.ts", "../src/server.ts", "../package.json", "../src/tools/contentExploration/searchContent.ts", "../src/logging/secretMask.ts", "../src/sdks/tableau/interceptors.ts", "../src/sdks/tableau/methods/authenticationMethods.ts", "../src/utils/getJwt.ts", "../src/sdks/tableau/apis/authenticationApi.ts", "../src/sdks/tableau/types/credentials.ts", "../src/sdks/tableau/methods/methods.ts", "../src/sdks/tableau/methods/authenticatedMethods.ts", "../src/sdks/tableau/methods/contentExplorationMethods.ts", "../src/sdks/tableau/apis/contentExplorationApi.ts", "../src/sdks/tableau/types/contentExploration.ts", "../src/sdks/tableau/methods/datasourcesMethods.ts", "../src/sdks/tableau/apis/datasourcesApi.ts", "../src/sdks/tableau/types/dataSource.ts", "../src/sdks/tableau/types/project.ts", "../src/sdks/tableau/types/pagination.ts", "../src/sdks/tableau/apis/paginationParameters.ts", "../src/sdks/tableau/methods/metadataMethods.ts", "../src/sdks/tableau/apis/metadataApi.ts", "../src/sdks/tableau/methods/pulseMethods.ts", "../node_modules/axios/lib/helpers/bind.js", "../node_modules/axios/lib/utils.js", "../node_modules/axios/lib/core/AxiosError.js", "../node_modules/axios/lib/platform/node/classes/FormData.js", "../node_modules/axios/lib/helpers/toFormData.js", "../node_modules/axios/lib/helpers/AxiosURLSearchParams.js", "../node_modules/axios/lib/helpers/buildURL.js", "../node_modules/axios/lib/core/InterceptorManager.js", "../node_modules/axios/lib/defaults/transitional.js", "../node_modules/axios/lib/platform/node/index.js", "../node_modules/axios/lib/platform/node/classes/URLSearchParams.js", "../node_modules/axios/lib/platform/common/utils.js", "../node_modules/axios/lib/platform/index.js", "../node_modules/axios/lib/helpers/toURLEncodedForm.js", "../node_modules/axios/lib/helpers/formDataToJSON.js", "../node_modules/axios/lib/defaults/index.js", "../node_modules/axios/lib/helpers/parseHeaders.js", "../node_modules/axios/lib/core/AxiosHeaders.js", "../node_modules/axios/lib/core/transformData.js", "../node_modules/axios/lib/cancel/isCancel.js", "../node_modules/axios/lib/cancel/CanceledError.js", "../node_modules/axios/lib/core/settle.js", "../node_modules/axios/lib/helpers/isAbsoluteURL.js", "../node_modules/axios/lib/helpers/combineURLs.js", "../node_modules/axios/lib/core/buildFullPath.js", "../node_modules/axios/lib/adapters/http.js", "../node_modules/axios/lib/env/data.js", "../node_modules/axios/lib/helpers/parseProtocol.js", "../node_modules/axios/lib/helpers/fromDataURI.js", "../node_modules/axios/lib/helpers/AxiosTransformStream.js", "../node_modules/axios/lib/helpers/formDataToStream.js", "../node_modules/axios/lib/helpers/readBlob.js", "../node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js", "../node_modules/axios/lib/helpers/callbackify.js", "../node_modules/axios/lib/helpers/speedometer.js", "../node_modules/axios/lib/helpers/throttle.js", "../node_modules/axios/lib/helpers/progressEventReducer.js", "../node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js", "../node_modules/axios/lib/helpers/isURLSameOrigin.js", "../node_modules/axios/lib/helpers/cookies.js", "../node_modules/axios/lib/core/mergeConfig.js", "../node_modules/axios/lib/helpers/resolveConfig.js", "../node_modules/axios/lib/adapters/xhr.js", "../node_modules/axios/lib/helpers/composeSignals.js", "../node_modules/axios/lib/helpers/trackStream.js", "../node_modules/axios/lib/adapters/fetch.js", "../node_modules/axios/lib/adapters/adapters.js", "../node_modules/axios/lib/core/dispatchRequest.js", "../node_modules/axios/lib/helpers/validator.js", "../node_modules/axios/lib/core/Axios.js", "../node_modules/axios/lib/cancel/CancelToken.js", "../node_modules/axios/lib/helpers/spread.js", "../node_modules/axios/lib/helpers/isAxiosError.js", "../node_modules/axios/lib/helpers/HttpStatusCode.js", "../node_modules/axios/lib/axios.js", "../node_modules/axios/index.js", "../src/sdks/tableau/apis/pulseApi.ts", "../src/sdks/tableau/types/pulse.ts", "../src/sdks/tableau/methods/serverMethods.ts", "../src/sdks/tableau/apis/serverApi.ts", "../src/sdks/tableau/types/serverInfo.ts", "../src/sdks/tableau/types/site.ts", "../src/sdks/tableau/types/user.ts", "../src/sdks/tableau/methods/viewsMethods.ts", "../src/sdks/tableau/apis/viewsApi.ts", "../src/sdks/tableau/types/view.ts", "../src/sdks/tableau/methods/vizqlDataServiceMethods.ts", "../src/sdks/tableau/apis/vizqlDataServiceApi.ts", "../src/sdks/tableau/methods/workbooksMethods.ts", "../src/sdks/tableau/apis/workbooksApi.ts", "../src/sdks/tableau/types/workbook.ts", "../src/sdks/tableau/restApi.ts", "../src/restApiInstance.ts", "../src/server/oauth/schemas.ts", "../src/utils/requiredString.ts", "../src/server/oauth/getTableauAuthInfo.ts", "../src/tools/tool.ts", "../src/utils/provider.ts", "../src/tools/contentExploration/searchContentUtils.ts", "../src/tools/getDatasourceMetadata/getDatasourceMetadata.ts", "../src/tools/getVizqlDataServiceDisabledError.ts", "../src/tools/resourceAccessChecker.ts", "../src/tools/validateDatasourceLuid.ts", "../src/tools/getDatasourceMetadata/datasourceMetadataUtils.ts", "../src/tools/listDatasources/listDatasources.ts", "../src/utils/paginate.ts", "../src/tools/genericFilterDescription.ts", "../src/tools/listDatasources/datasourcesFilterUtils.ts", "../src/utils/parseAndValidateFilterString.ts", "../src/tools/pulse/generateMetricValueInsightBundle/generatePulseMetricValueInsightBundleTool.ts", "../src/tools/pulse/getPulseDisabledError.ts", "../src/tools/pulse/listAllMetricDefinitions/listAllPulseMetricDefinitions.ts", "../src/tools/pulse/constrainPulseDefinitions.ts", "../src/tools/pulse/listMetricDefinitionsFromDefinitionIds/listPulseMetricDefinitionsFromDefinitionIds.ts", "../src/tools/pulse/listMetricsFromMetricDefinitionId/listPulseMetricsFromMetricDefinitionId.ts", "../src/tools/pulse/constrainPulseMetrics.ts", "../src/tools/pulse/listMetricsFromMetricIds/listPulseMetricsFromMetricIds.ts", "../src/tools/pulse/listMetricSubscriptions/listPulseMetricSubscriptions.ts", "../src/tools/queryDatasource/queryDatasource.ts", "../src/tools/queryDatasource/datasourceCredentials.ts", "../src/tools/queryDatasource/queryDatasourceErrorHandler.ts", "../src/tools/queryDatasource/validators/validateFields.ts", "../src/tools/queryDatasource/validators/validateFilters.ts", "../src/tools/queryDatasource/queryDatasourceValidator.ts", "../src/tools/queryDatasource/queryDescription.ts", "../src/tools/queryDatasource/validators/validateFilterValues.ts", "../src/tools/views/getViewData.ts", "../src/tools/views/getViewImage.ts", "../src/tools/convertPngDataToToolResult.ts", "../src/tools/views/listViews.ts", "../src/tools/views/viewsFilterUtils.ts", "../src/tools/workbooks/getWorkbook.ts", "../src/tools/workbooks/listWorkbooks.ts", "../src/tools/workbooks/workbooksFilterUtils.ts", "../src/tools/tools.ts", "../src/server/express.ts", "../src/sessions.ts", "../src/server/middleware.ts", "../src/server/oauth/provider.ts", "../src/server/oauth/.well-known/oauth-authorization-server.ts", "../src/server/oauth/.well-known/oauth-protected-resource.ts", "../src/server/oauth/authMiddleware.ts", "../src/server/oauth/authorize.ts", "../src/utils/setLongTimeout.ts", "../src/server/oauth/generateCodeChallenge.ts", "../src/server/oauth/isValidRedirectUri.ts", "../src/server/oauth/callback.ts", "../src/sdks/tableau-oauth/client.ts", "../src/sdks/tableau-oauth/apis.ts", "../src/sdks/tableau-oauth/types.ts", "../src/sdks/tableau-oauth/methods.ts", "../src/server/oauth/register.ts", "../src/server/oauth/token.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport dotenv from 'dotenv';\n\nimport { getConfig } from './config.js';\nimport { isLoggingLevel, log, setLogLevel, setServerLogger, writeToStderr } from './logging/log.js';\nimport { ServerLogger } from './logging/serverLogger.js';\nimport { Server, serverName, serverVersion } from './server.js';\nimport { startExpressServer } from './server/express.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\n\nasync function startServer(): Promise<void> {\n dotenv.config();\n const config = getConfig();\n\n const logLevel = isLoggingLevel(config.defaultLogLevel) ? config.defaultLogLevel : 'debug';\n if (config.enableServerLogging) {\n setServerLogger(new ServerLogger({ logDirectory: config.serverLogDirectory }));\n }\n\n switch (config.transport) {\n case 'stdio': {\n const server = new Server();\n server.registerTools();\n server.registerRequestHandlers();\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n setLogLevel(server, logLevel);\n log.info(server, `${server.name} v${server.version} running on stdio`);\n break;\n }\n case 'http': {\n const { url } = await startExpressServer({ basePath: serverName, config, logLevel });\n\n if (!config.oauth.enabled) {\n console.warn(\n '\u26A0\uFE0F TRANSPORT is \"http\" but OAuth is disabled! Your MCP server may not be protected from unauthorized access! By having explicitly disabled OAuth by setting the DANGEROUSLY_DISABLE_OAUTH environment variable to \"true\", you accept any and all risks associated with this decision.',\n );\n }\n\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(\n `${serverName} v${serverVersion} ${config.disableSessionManagement ? 'stateless ' : ''}streamable HTTP server available at ${url}`,\n );\n break;\n }\n }\n\n if (config.disableLogMasking) {\n writeToStderr('\u26A0\uFE0F Log masking is disabled!');\n }\n}\n\ntry {\n await startServer();\n} catch (error) {\n writeToStderr(`Fatal error when starting the server: ${getExceptionMessage(error)}`);\n process.exit(1);\n}\n", "import { CorsOptions } from 'cors';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { isToolGroupName, isToolName, toolGroups, ToolName } from './tools/toolName.js';\nimport { isTransport, TransportName } from './transports.js';\nimport invariant from './utils/invariant.js';\n\nconst __dirname = fileURLToPath(new URL('.', import.meta.url));\n\nconst TEN_MINUTES_IN_MS = 10 * 60 * 1000;\nconst ONE_HOUR_IN_MS = 60 * 60 * 1000;\nconst THIRTY_DAYS_IN_MS = 30 * 24 * 60 * 60 * 1000;\nconst ONE_YEAR_IN_MS = 365.25 * 24 * 60 * 60 * 1000;\n\nconst authTypes = ['pat', 'direct-trust', 'oauth'] as const;\ntype AuthType = (typeof authTypes)[number];\n\nfunction isAuthType(auth: unknown): auth is AuthType {\n return !!authTypes.find((type) => type === auth);\n}\n\nexport type BoundedContext = {\n projectIds: Set<string> | null;\n datasourceIds: Set<string> | null;\n workbookIds: Set<string> | null;\n};\n\nexport class Config {\n auth: AuthType;\n server: string;\n transport: TransportName;\n sslKey: string;\n sslCert: string;\n httpPort: number;\n corsOriginConfig: CorsOptions['origin'];\n trustProxyConfig: boolean | number | string | null;\n siteName: string;\n patName: string;\n patValue: string;\n jwtSubClaim: string;\n connectedAppClientId: string;\n connectedAppSecretId: string;\n connectedAppSecretValue: string;\n jwtAdditionalPayload: string;\n datasourceCredentials: string;\n defaultLogLevel: string;\n disableLogMasking: boolean;\n includeTools: Array<ToolName>;\n excludeTools: Array<ToolName>;\n maxResultLimit: number | null;\n disableQueryDatasourceFilterValidation: boolean;\n disableMetadataApiRequests: boolean;\n disableSessionManagement: boolean;\n enableServerLogging: boolean;\n serverLogDirectory: string;\n boundedContext: BoundedContext;\n tableauServerVersionCheckIntervalInHours: number;\n oauth: {\n enabled: boolean;\n issuer: string;\n redirectUri: string;\n jwePrivateKey: string;\n jwePrivateKeyPath: string;\n jwePrivateKeyPassphrase: string | undefined;\n authzCodeTimeoutMs: number;\n accessTokenTimeoutMs: number;\n refreshTokenTimeoutMs: number;\n clientIdSecretPairs: Record<string, string> | null;\n };\n\n constructor() {\n const cleansedVars = removeClaudeMcpBundleUserConfigTemplates(process.env);\n const {\n AUTH: auth,\n SERVER: server,\n SITE_NAME: siteName,\n TRANSPORT: transport,\n SSL_KEY: sslKey,\n SSL_CERT: sslCert,\n HTTP_PORT_ENV_VAR_NAME: httpPortEnvVarName,\n CORS_ORIGIN_CONFIG: corsOriginConfig,\n TRUST_PROXY_CONFIG: trustProxyConfig,\n PAT_NAME: patName,\n PAT_VALUE: patValue,\n JWT_SUB_CLAIM: jwtSubClaim,\n CONNECTED_APP_CLIENT_ID: clientId,\n CONNECTED_APP_SECRET_ID: secretId,\n CONNECTED_APP_SECRET_VALUE: secretValue,\n JWT_ADDITIONAL_PAYLOAD: jwtAdditionalPayload,\n DATASOURCE_CREDENTIALS: datasourceCredentials,\n DEFAULT_LOG_LEVEL: defaultLogLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n INCLUDE_TOOLS: includeTools,\n EXCLUDE_TOOLS: excludeTools,\n MAX_RESULT_LIMIT: maxResultLimit,\n DISABLE_QUERY_DATASOURCE_FILTER_VALIDATION: disableQueryDatasourceFilterValidation,\n DISABLE_METADATA_API_REQUESTS: disableMetadataApiRequests,\n DISABLE_SESSION_MANAGEMENT: disableSessionManagement,\n ENABLE_SERVER_LOGGING: enableServerLogging,\n SERVER_LOG_DIRECTORY: serverLogDirectory,\n INCLUDE_PROJECT_IDS: includeProjectIds,\n INCLUDE_DATASOURCE_IDS: includeDatasourceIds,\n INCLUDE_WORKBOOK_IDS: includeWorkbookIds,\n TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS: tableauServerVersionCheckIntervalInHours,\n DANGEROUSLY_DISABLE_OAUTH: disableOauth,\n OAUTH_ISSUER: oauthIssuer,\n OAUTH_JWE_PRIVATE_KEY: oauthJwePrivateKey,\n OAUTH_JWE_PRIVATE_KEY_PATH: oauthJwePrivateKeyPath,\n OAUTH_JWE_PRIVATE_KEY_PASSPHRASE: oauthJwePrivateKeyPassphrase,\n OAUTH_REDIRECT_URI: redirectUri,\n OAUTH_CLIENT_ID_SECRET_PAIRS: oauthClientIdSecretPairs,\n OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS: authzCodeTimeoutMs,\n OAUTH_ACCESS_TOKEN_TIMEOUT_MS: accessTokenTimeoutMs,\n OAUTH_REFRESH_TOKEN_TIMEOUT_MS: refreshTokenTimeoutMs,\n } = cleansedVars;\n\n this.siteName = siteName ?? '';\n\n this.sslKey = sslKey?.trim() ?? '';\n this.sslCert = sslCert?.trim() ?? '';\n this.httpPort = parseNumber(cleansedVars[httpPortEnvVarName?.trim() || 'PORT'], {\n defaultValue: 3927,\n minValue: 1,\n maxValue: 65535,\n });\n this.corsOriginConfig = getCorsOriginConfig(corsOriginConfig?.trim() ?? '');\n this.trustProxyConfig = getTrustProxyConfig(trustProxyConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultLogLevel = defaultLogLevel ?? 'debug';\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableQueryDatasourceFilterValidation = disableQueryDatasourceFilterValidation === 'true';\n this.disableMetadataApiRequests = disableMetadataApiRequests === 'true';\n this.disableSessionManagement = disableSessionManagement === 'true';\n this.enableServerLogging = enableServerLogging === 'true';\n this.serverLogDirectory = serverLogDirectory || join(__dirname, 'logs');\n this.boundedContext = {\n projectIds: createSetFromCommaSeparatedString(includeProjectIds),\n datasourceIds: createSetFromCommaSeparatedString(includeDatasourceIds),\n workbookIds: createSetFromCommaSeparatedString(includeWorkbookIds),\n };\n\n if (this.boundedContext.projectIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_PROJECT_IDS must have at least one value',\n );\n }\n\n if (this.boundedContext.datasourceIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_DATASOURCE_IDS must have at least one value',\n );\n }\n\n if (this.boundedContext.workbookIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_WORKBOOK_IDS must have at least one value',\n );\n }\n\n this.tableauServerVersionCheckIntervalInHours = parseNumber(\n tableauServerVersionCheckIntervalInHours,\n {\n defaultValue: 1,\n minValue: 1,\n maxValue: 24 * 7, // 7 days\n },\n );\n\n const disableOauthOverride = disableOauth === 'true';\n this.oauth = {\n enabled: disableOauthOverride ? false : !!oauthIssuer,\n issuer: oauthIssuer ?? '',\n redirectUri: redirectUri || (oauthIssuer ? `${oauthIssuer}/Callback` : ''),\n jwePrivateKey: oauthJwePrivateKey ?? '',\n jwePrivateKeyPath: oauthJwePrivateKeyPath ?? '',\n jwePrivateKeyPassphrase: oauthJwePrivateKeyPassphrase || undefined,\n authzCodeTimeoutMs: parseNumber(authzCodeTimeoutMs, {\n defaultValue: TEN_MINUTES_IN_MS,\n minValue: 0,\n maxValue: ONE_HOUR_IN_MS,\n }),\n accessTokenTimeoutMs: parseNumber(accessTokenTimeoutMs, {\n defaultValue: ONE_HOUR_IN_MS,\n minValue: 0,\n maxValue: THIRTY_DAYS_IN_MS,\n }),\n refreshTokenTimeoutMs: parseNumber(refreshTokenTimeoutMs, {\n defaultValue: THIRTY_DAYS_IN_MS,\n minValue: 0,\n maxValue: ONE_YEAR_IN_MS,\n }),\n clientIdSecretPairs: oauthClientIdSecretPairs\n ? oauthClientIdSecretPairs.split(',').reduce<Record<string, string>>((acc, curr) => {\n const [clientId, secret] = curr.split(':');\n if (clientId && secret) {\n acc[clientId] = secret;\n }\n return acc;\n }, {})\n : null,\n };\n\n this.auth = isAuthType(auth) ? auth : this.oauth.enabled ? 'oauth' : 'pat';\n this.transport = isTransport(transport) ? transport : this.oauth.enabled ? 'http' : 'stdio';\n\n if (this.transport === 'http' && !disableOauthOverride && !this.oauth.issuer) {\n throw new Error(\n 'OAUTH_ISSUER must be set when TRANSPORT is \"http\" unless DANGEROUSLY_DISABLE_OAUTH is \"true\"',\n );\n }\n\n if (this.auth === 'oauth') {\n if (disableOauthOverride) {\n throw new Error('When AUTH is \"oauth\", DANGEROUSLY_DISABLE_OAUTH cannot be \"true\"');\n }\n\n if (!this.oauth.issuer) {\n throw new Error('When AUTH is \"oauth\", OAUTH_ISSUER must be set');\n }\n } else {\n invariant(server, 'The environment variable SERVER is not set');\n validateServer(server);\n }\n\n if (this.oauth.enabled) {\n invariant(this.oauth.redirectUri, 'The environment variable OAUTH_REDIRECT_URI is not set');\n\n if (!this.oauth.jwePrivateKey && !this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set',\n );\n }\n\n if (this.oauth.jwePrivateKey && this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set',\n );\n }\n\n if (\n this.oauth.jwePrivateKeyPath &&\n process.env.TABLEAU_MCP_TEST !== 'true' &&\n !existsSync(this.oauth.jwePrivateKeyPath)\n ) {\n throw new Error(\n `OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`,\n );\n }\n\n if (this.transport === 'stdio') {\n throw new Error('TRANSPORT must be \"http\" when OAUTH_ISSUER is set');\n }\n }\n\n const maxResultLimitNumber = maxResultLimit ? parseInt(maxResultLimit) : NaN;\n this.maxResultLimit =\n isNaN(maxResultLimitNumber) || maxResultLimitNumber <= 0 ? null : maxResultLimitNumber;\n\n this.includeTools = includeTools\n ? includeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n this.excludeTools = excludeTools\n ? excludeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n if (this.includeTools.length > 0 && this.excludeTools.length > 0) {\n throw new Error('Cannot include and exclude tools simultaneously');\n }\n\n if (this.auth === 'pat') {\n invariant(patName, 'The environment variable PAT_NAME is not set');\n invariant(patValue, 'The environment variable PAT_VALUE is not set');\n } else if (this.auth === 'direct-trust') {\n invariant(jwtSubClaim, 'The environment variable JWT_SUB_CLAIM is not set');\n invariant(clientId, 'The environment variable CONNECTED_APP_CLIENT_ID is not set');\n invariant(secretId, 'The environment variable CONNECTED_APP_SECRET_ID is not set');\n invariant(secretValue, 'The environment variable CONNECTED_APP_SECRET_VALUE is not set');\n }\n\n this.server = server ?? '';\n this.patName = patName ?? '';\n this.patValue = patValue ?? '';\n this.jwtSubClaim = jwtSubClaim ?? '';\n this.connectedAppClientId = clientId ?? '';\n this.connectedAppSecretId = secretId ?? '';\n this.connectedAppSecretValue = secretValue ?? '';\n this.jwtAdditionalPayload = jwtAdditionalPayload || '{}';\n }\n}\n\nfunction validateServer(server: string): void {\n if (!server.startsWith('https://')) {\n throw new Error(`The environment variable SERVER must start with \"https://\": ${server}`);\n }\n\n try {\n const _ = new URL(server);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `The environment variable SERVER is not a valid URL: ${server} -- ${errorMessage}`,\n );\n }\n}\n\nfunction getCorsOriginConfig(corsOriginConfig: string): CorsOptions['origin'] {\n if (!corsOriginConfig) {\n return true;\n }\n\n if (corsOriginConfig.match(/^true|false$/i)) {\n return corsOriginConfig.toLowerCase() === 'true';\n }\n\n if (corsOriginConfig === '*') {\n return '*';\n }\n\n if (corsOriginConfig.startsWith('[') && corsOriginConfig.endsWith(']')) {\n try {\n const origins = JSON.parse(corsOriginConfig) as Array<string>;\n return origins.map((origin) => new URL(origin).origin);\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${corsOriginConfig}`,\n );\n }\n }\n\n try {\n return new URL(corsOriginConfig).origin;\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${corsOriginConfig}`,\n );\n }\n}\n\nfunction getTrustProxyConfig(trustProxyConfig: string): boolean | number | string | null {\n if (!trustProxyConfig) {\n return null;\n }\n\n if (trustProxyConfig.match(/^true|false$/i)) {\n return trustProxyConfig.toLowerCase() === 'true';\n }\n\n if (trustProxyConfig.match(/^\\d+$/)) {\n return parseInt(trustProxyConfig, 10);\n }\n\n return trustProxyConfig;\n}\n\n// Creates a set from a comma-separated string of values.\n// Returns null if the value is undefined.\nfunction createSetFromCommaSeparatedString(value: string | undefined): Set<string> | null {\n if (value === undefined) {\n return null;\n }\n\n return new Set(\n value\n .trim()\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean),\n );\n}\n\n// When the user does not provide a site name in the Claude MCP Bundle configuration,\n// Claude doesn't replace its value and sets the site name to \"${user_config.site_name}\".\nfunction removeClaudeMcpBundleUserConfigTemplates(\n envVars: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n return Object.entries(envVars).reduce<Record<string, string | undefined>>((acc, [key, value]) => {\n if (value?.startsWith('${user_config.')) {\n acc[key] = '';\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\nfunction parseNumber(\n value: string | undefined,\n {\n defaultValue,\n minValue,\n maxValue,\n }: { defaultValue: number; minValue?: number; maxValue?: number } = {\n defaultValue: 0,\n minValue: Number.NEGATIVE_INFINITY,\n maxValue: Number.POSITIVE_INFINITY,\n },\n): number {\n if (!value) {\n return defaultValue;\n }\n\n const number = parseFloat(value);\n return isNaN(number) ||\n (minValue !== undefined && number < minValue) ||\n (maxValue !== undefined && number > maxValue)\n ? defaultValue\n : number;\n}\n\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n parseNumber,\n};\n", "export const toolNames = [\n 'list-datasources',\n 'list-workbooks',\n 'list-views',\n 'query-datasource',\n 'get-datasource-metadata',\n 'get-workbook',\n 'get-view-data',\n 'get-view-image',\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n 'search-content',\n] as const;\nexport type ToolName = (typeof toolNames)[number];\n\nexport const toolGroupNames = [\n 'datasource',\n 'workbook',\n 'view',\n 'pulse',\n 'content-exploration',\n] as const;\nexport type ToolGroupName = (typeof toolGroupNames)[number];\n\nexport const toolGroups = {\n datasource: ['list-datasources', 'get-datasource-metadata', 'query-datasource'],\n workbook: ['list-workbooks', 'get-workbook'],\n view: ['list-views', 'get-view-data', 'get-view-image'],\n pulse: [\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n ],\n 'content-exploration': ['search-content'],\n} as const satisfies Record<ToolGroupName, Array<ToolName>>;\n\nexport function isToolName(value: unknown): value is ToolName {\n return !!toolNames.find((name) => name === value);\n}\n\nexport function isToolGroupName(value: unknown): value is ToolGroupName {\n return !!toolGroupNames.find((name) => name === value);\n}\n", "const transports = ['stdio', 'http'] as const;\nexport type TransportName = (typeof transports)[number];\nexport function isTransport(transport: unknown): transport is TransportName {\n return !!transports.find((t) => t === transport);\n}\n", "export default function invariant(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ? message : 'Invariant Violation');\n }\n}\n", "import { LoggingLevel, RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Server } from '../server.js';\nimport { ToolName } from '../tools/toolName.js';\nimport { ServerLogger } from './serverLogger.js';\ntype Logger = 'rest-api' | (string & {});\ntype LogType = LoggingLevel | 'request' | 'response' | 'tool';\ntype LogMessage = {\n type: LogType;\n [key: string]: any;\n};\n\nexport const loggingLevels = [\n 'debug',\n 'info',\n 'notice',\n 'warning',\n 'error',\n 'critical',\n 'alert',\n 'emergency',\n] as const;\n\nlet currentLogLevel: LoggingLevel = 'debug';\nlet serverLogger: ServerLogger | undefined;\n\nexport function isLoggingLevel(level: unknown): level is LoggingLevel {\n return !!loggingLevels.find((l) => l === level);\n}\n\nexport const setLogLevel = (\n server: Server,\n level: LoggingLevel,\n { silent = false }: { silent?: boolean } = {},\n): void => {\n if (currentLogLevel === level) {\n return;\n }\n\n currentLogLevel = level;\n\n if (!silent) {\n log.notice(server, `Logging level set to: ${level}`);\n }\n};\n\nexport const setServerLogger = (logger: ServerLogger): void => {\n serverLogger = logger;\n};\n\ntype LogMethodOptions = Partial<{ logger: Logger; requestId: RequestId }>;\n\nexport const log = {\n debug: getSendLoggingMessageFn('debug'),\n info: getSendLoggingMessageFn('info'),\n notice: getSendLoggingMessageFn('notice'),\n warning: getSendLoggingMessageFn('warning'),\n error: getSendLoggingMessageFn('error'),\n critical: getSendLoggingMessageFn('critical'),\n alert: getSendLoggingMessageFn('alert'),\n emergency: getSendLoggingMessageFn('emergency'),\n} satisfies {\n [level in LoggingLevel]: (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions,\n ) => Promise<void>;\n};\n\nexport const shouldLogWhenLevelIsAtLeast = (level = currentLogLevel): boolean => {\n return loggingLevels.indexOf(level) >= loggingLevels.indexOf(currentLogLevel);\n};\n\nexport const writeToStderr = (message: string): void => {\n if (process.env.TABLEAU_MCP_TEST === 'true') {\n // Silence logging when running in test mode\n return;\n }\n\n message = message.endsWith('\\n') ? message : `${message}\\n`;\n process.stderr.write(message);\n};\n\nexport const getToolLogMessage = ({\n requestId,\n toolName,\n args,\n username,\n}: {\n requestId: RequestId;\n toolName: ToolName;\n args: unknown;\n username?: string;\n}): LogMessage => {\n return {\n type: 'tool',\n requestId,\n ...(username ? { username } : {}),\n tool: {\n name: toolName,\n ...(args !== undefined ? { args } : {}),\n },\n };\n};\n\nfunction getSendLoggingMessageFn(level: LoggingLevel) {\n return async (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions = {\n logger: server.name,\n },\n ) => {\n serverLogger?.log({ message, level, logger });\n\n if (!shouldLogWhenLevelIsAtLeast(level)) {\n return;\n }\n\n // server.sendNotification doesn't provide a way to provide the relatedRequestId\n // so we're using server.notification directly.\n return server.server.notification(\n {\n method: 'notifications/message',\n params: {\n level,\n logger,\n data: JSON.stringify(\n {\n timestamp: new Date().toISOString(),\n currentLogLevel,\n message,\n },\n null,\n 2,\n ),\n },\n },\n {\n relatedRequestId: requestId,\n },\n );\n };\n}\n", "import { appendFile } from 'node:fs/promises';\n\nimport { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { writeToStderr } from './log.js';\n\nexport class ServerLogger {\n private readonly _logDirectory: string;\n private readonly _fileMutexes = new Map<string, Promise<void>>();\n\n constructor({ logDirectory }: { logDirectory: string }) {\n this._logDirectory = logDirectory;\n\n if (!existsSync(this._logDirectory)) {\n mkdirSync(this._logDirectory, { recursive: true });\n }\n }\n\n async log(obj: Record<string, unknown>): Promise<void> {\n // Create a new log file each hour e.g. 2025-10-15T21-00-00-000Z.log\n const timestamp = new Date().toISOString();\n const filename = `${new Date(new Date().setMinutes(0, 0, 0)).toISOString().replace(/[:.]/g, '-')}.log`;\n const logFilePath = join(this._logDirectory, filename);\n\n // Get or create a mutex for this specific log file\n const mutexKey = logFilePath;\n const currentMutex = this._fileMutexes.get(mutexKey) ?? Promise.resolve();\n\n // Chain the file write operation after the current mutex\n const newMutex = currentMutex.then(async () => {\n try {\n // appendFile will create the file if it doesn't exist\n await appendFile(logFilePath, JSON.stringify({ timestamp, ...obj }) + '\\n');\n } catch (error) {\n writeToStderr(`Failed to write to log file ${logFilePath}: ${getExceptionMessage(error)}`);\n }\n });\n\n this._fileMutexes.set(mutexKey, newMutex);\n\n // Clean up completed mutexes to prevent memory leaks\n newMutex.finally(() => {\n if (this._fileMutexes.get(mutexKey) === newMutex) {\n this._fileMutexes.delete(mutexKey);\n }\n });\n\n // Wait for the file write operation to complete\n await newMutex;\n }\n}\n", "export function getExceptionMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error) ?? 'undefined';\n } catch {\n return `${error}`;\n }\n}\n", "import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { InitializeRequest, SetLevelRequestSchema } from '@modelcontextprotocol/sdk/types.js';\n\nimport pkg from '../package.json' with { type: 'json' };\nimport { getConfig } from './config.js';\nimport { setLogLevel } from './logging/log.js';\nimport { Tool } from './tools/tool.js';\nimport { toolNames } from './tools/toolName.js';\nimport { toolFactories } from './tools/tools.js';\n\nexport const serverName = 'tableau-mcp';\nexport const serverVersion = pkg.version;\nexport const userAgent = `${serverName}/${serverVersion}`;\n\nexport type ClientInfo = InitializeRequest['params']['clientInfo'];\n\nexport class Server extends McpServer {\n readonly name: string;\n readonly version: string;\n\n // Note that the McpServer class does expose a (poorly named) \"getClientVersion()\" method that returns the client info,\n // but the value of the field it returns is only set during the initialization lifecycle request.\n //\n // With HTTP transport, we create a new instance of the Server class for *each* request, so we store the client info\n // provided by the client in its initialization lifecycle request in the session store,\n // and pass it to the constructor with each post-initialization request.\n //\n // With stdio transport, we can use the getClientVersion() method to get the client info.\n private readonly _clientInfo: ClientInfo | undefined;\n\n get clientInfo(): ClientInfo | undefined {\n return this._clientInfo ?? this.server.getClientVersion();\n }\n\n constructor({ clientInfo }: { clientInfo?: ClientInfo } = {}) {\n super(\n {\n name: serverName,\n version: serverVersion,\n },\n {\n capabilities: {\n logging: {},\n tools: {},\n },\n },\n );\n\n this.name = serverName;\n this.version = serverVersion;\n this._clientInfo = clientInfo;\n }\n\n registerTools = (): void => {\n for (const {\n name,\n description,\n paramsSchema,\n annotations,\n callback,\n } of this._getToolsToRegister()) {\n this.tool(name, description, paramsSchema, annotations, callback);\n }\n };\n\n registerRequestHandlers = (): void => {\n this.server.setRequestHandler(SetLevelRequestSchema, async (request) => {\n setLogLevel(this, request.params.level);\n return {};\n });\n };\n\n private _getToolsToRegister = (): Array<Tool<any>> => {\n const { includeTools, excludeTools } = getConfig();\n\n const tools = toolFactories.map((tool) => tool(this));\n const toolsToRegister = tools.filter((tool) => {\n if (includeTools.length > 0) {\n return includeTools.includes(tool.name);\n }\n\n if (excludeTools.length > 0) {\n return !excludeTools.includes(tool.name);\n }\n\n return true;\n });\n\n if (toolsToRegister.length === 0) {\n throw new Error(`\n No tools to register.\n Tools available = [${toolNames.join(', ')}].\n EXCLUDE_TOOLS = [${excludeTools.join(', ')}].\n INCLUDE_TOOLS = [${includeTools.join(', ')}]\n `);\n }\n\n return toolsToRegister;\n };\n}\n\nexport const exportedForTesting = {\n Server,\n};\n", "{\n \"name\": \"@tableau/mcp-server\",\n \"description\": \"An MCP server for Tableau, providing a suite of tools that will make it easier for developers to build AI applications that integrate with Tableau.\",\n \"version\": \"1.12.4\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/tableau/tableau-mcp.git\"\n },\n \"homepage\": \"https://github.com/tableau/tableau-mcp\",\n \"bugs\": \"https://github.com/tableau/tableau-mcp/issues\",\n \"author\": \"Tableau\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"keywords\": [\n \"tableau\",\n \"mcp\"\n ],\n \"bin\": {\n \"tableau-mcp-server\": \"./build/index.js\"\n },\n \"scripts\": {\n \":build\": \"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --minify --outdir=build --sourcemap\",\n \":build:dev\": \"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --outdir=build --sourcemap\",\n \"build\": \"run-s :build exec-perms\",\n \"build:dev\": \"run-s :build:dev exec-perms\",\n \"build:watch\": \"npm run :build:dev -- --watch\",\n \"build:docker\": \"docker build -t tableau-mcp .\",\n \":build:mcpb\": \"npx -y @anthropic-ai/mcpb pack . tableau-mcp.mcpb\",\n \"build:mcpb\": \"run-s build:manifest:script build:manifest :build:mcpb\",\n \"build:manifest\": \"node build/scripts/createClaudeMcpBundleManifest.mjs\",\n \"build:manifest:script\": \"esbuild src/scripts/createClaudeMcpBundleManifest.ts --bundle --platform=node --format=esm --outdir=build/scripts --sourcemap=inline --out-extension:.js=.mjs\",\n \"start:http\": \"node build/index.js\",\n \"start:http:docker\": \"docker run -p 3927:3927 -i --rm --env-file env.list tableau-mcp\",\n \"lint\": \"npm exec eslint\",\n \"inspect\": \"npx @modelcontextprotocol/inspector --config config.json --server tableau\",\n \":inspect:http\": \"npx @modelcontextprotocol/inspector --config config.http.json --server tableau\",\n \"inspect:http\": \"run-p start:http :inspect:http\",\n \"inspect:docker\": \"npx @modelcontextprotocol/inspector --config config.docker.json --server tableau\",\n \"inspect:docker:http\": \"run-p start:http:docker :inspect:http\",\n \"build:inspect\": \"run-s build inspect\",\n \"build:inspect:docker\": \"run-s build:docker inspect:docker\",\n \"build:inspect:docker:http\": \"run-s build:docker inspect:docker:http\",\n \"exec-perms\": \"shx chmod +x build/*.js\",\n \"test\": \"vitest --config ./vitest.config.ts\",\n \"test:e2e\": \"vitest --config ./vitest.config.e2e.ts\",\n \"test:eval\": \"vitest --config ./vitest.config.eval.ts\",\n \"test:oauth\": \"vitest --config ./vitest.config.oauth.ts\",\n \"coverage\": \"vitest run --config ./vitest.config.ts --coverage\",\n \"version:major\": \"npm version major --no-git-tag-version\",\n \"version:minor\": \"npm version minor --no-git-tag-version\",\n \"version:patch\": \"npm version patch --no-git-tag-version\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.12.1\",\n \"@zodios/core\": \"^10.9.6\",\n \"cors\": \"^2.8.5\",\n \"dotenv\": \"^16.5.0\",\n \"express\": \"^5.1.0\",\n \"fast-levenshtein\": \"^3.0.0\",\n \"jose\": \"^6.0.12\",\n \"ts-results-es\": \"^5.0.1\",\n \"zod\": \"^3.24.3\",\n \"zod-validation-error\": \"^4.0.1\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/mcpb\": \"^1.0.0\",\n \"@eslint/eslintrc\": \"^3.3.1\",\n \"@eslint/js\": \"^9.25.1\",\n \"@modelcontextprotocol/inspector\": \"^0.16.6\",\n \"@openai/agents\": \"^0.1.9\",\n \"@types/cors\": \"^2.8.19\",\n \"@types/eslint__js\": \"^8.42.3\",\n \"@types/express\": \"^5.0.3\",\n \"@types/fast-levenshtein\": \"^0.0.1\",\n \"@types/node\": \"^22.15.3\",\n \"@types/supertest\": \"^6.0.3\",\n \"@typescript-eslint/eslint-plugin\": \"^8.31.1\",\n \"@typescript-eslint/parser\": \"^8.31.1\",\n \"@vitest/coverage-v8\": \"^3.1.3\",\n \"esbuild\": \"^0.25.5\",\n \"eslint\": \"^9.25.1\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"eslint-plugin-prettier\": \"^5.2.6\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"npm-run-all\": \"^4.1.5\",\n \"openai\": \"^5.23.2\",\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"shx\": \"^0.4.0\",\n \"supertest\": \"^7.1.4\",\n \"typescript\": \"^5.8.3\",\n \"typescript-eslint\": \"^8.31.1\",\n \"vitest\": \"^3.1.3\"\n },\n \"engines\": {\n \"node\": \">=22.7.5\"\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n orderBySchema,\n searchContentFilterSchema,\n} from '../../sdks/tableau/types/contentExploration.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../tool.js';\nimport {\n buildFilterString,\n buildOrderByString,\n constrainSearchContent,\n ReducedSearchContentResponse,\n reduceSearchContentResponse,\n} from './searchContentUtils.js';\n\nconst paramsSchema = {\n terms: z.string().trim().nonempty().optional(),\n limit: z.number().int().min(1).max(2000).default(100).optional(),\n orderBy: orderBySchema.optional(),\n filter: searchContentFilterSchema.optional(),\n};\n\nexport const getSearchContentTool = (server: Server): Tool<typeof paramsSchema> => {\n const searchContentTool = new Tool({\n server,\n name: 'search-content',\n description: `\nThis tool searches across all supported content types for objects relevant to the search expression specified by search terms and filters.\n\n**Parameters:**\n\n- \\`terms\\` (optional): A string containing one or more search terms that the search uses as the basis for determining which items are relevant to return. If the terms parameter is not provided, it searches for everything bound by the specified filters.\n\n- \\`filter\\` (optional): Allows you to limit search results based on:\n - \\`contentTypes\\`: Filter by content types. Supported types are: 'lens', 'datasource', 'virtualconnection', 'collection', 'project', 'flow', 'datarole', 'table', 'database', 'view', 'workbook'\n - \\`ownerIds\\`: Filter by specific owner IDs (array of integers)\n - \\`modifiedTime\\`: Filter by last modified times using ISO 8601 date-time strings. Can be either a range (with startDate/endDate) or an array of specific date-times to include\n\n- \\`limit\\` (optional): The number of items to return in the search response (default: 100, max: 2000)\n\n- \\`orderBy\\` (optional): Determines the sorting method for returned items. Available sorting methods:\n - \\`hitsTotal\\`: Number of times a content item has been viewed since it was created\n - \\`hitsSmallSpanTotal\\`: Number of times a content item was viewed in the last month\n - \\`hitsMediumSpanTotal\\`: Number of times a content item was viewed in the last 3 months\n - \\`hitsLargeSpanTotal\\`: Number of times a content item was viewed in the last year\n - \\`downstreamWorkbookCount\\`: Number of workbooks in a given project. This value is only available when the content type filter includes 'database' or 'table'\n \n For each sort method, you can specify a sort direction: 'asc' for ascending or 'desc' for descending (default: 'asc'). The orderBy parameter is an array of objects containing the sorting method and direction. The first element determines primary sorting, with subsequent elements used as tiebreakers.\n\n**Important Notes:**\n- If \\`orderBy\\` is omitted, the search will sort items by their \"relevance score\" in descending order, which is Tableau's internal algorithm for providing the most relevant results`,\n paramsSchema,\n annotations: {\n title: 'Search Content',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { terms, limit, orderBy, filter },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const orderByString = orderBy ? buildOrderByString(orderBy) : undefined;\n const filterString = filter ? buildFilterString(filter) : undefined;\n return await searchContentTool.logAndExecute<Array<ReducedSearchContentResponse>>({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const response = await restApi.contentExplorationMethods.searchContent({\n terms,\n page: 0,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? 100)\n : (limit ?? 100),\n orderBy: orderByString,\n filter: filterString,\n });\n return reduceSearchContentResponse(response);\n },\n }),\n );\n },\n constrainSuccessResult: (items) =>\n constrainSearchContent({ items, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return searchContentTool;\n};\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport {\n RequestInterceptorConfig,\n ResponseInterceptorConfig,\n} from '../sdks/tableau/interceptors.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { shouldLogWhenLevelIsAtLeast, writeToStderr } from './log.js';\n\ntype MaskedKeys = 'data' | 'headers';\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\ntype MaskedRequest = Optional<RequestInterceptorConfig, MaskedKeys>;\ntype MaskedResponse = Optional<ResponseInterceptorConfig, MaskedKeys>;\n\nexport const maskRequest = (config: RequestInterceptorConfig): MaskedRequest => {\n const result = clone<MaskedRequest>(config);\n if (result.isErr()) {\n return config;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n\n if (Array.isArray(maskedData?.data?.datasource?.connections)) {\n const connections = maskedData.data.datasource.connections as Array<{\n connectionLuid: string;\n connectionUsername: string;\n connectionPassword: string;\n }>;\n\n connections.forEach((connection) => {\n connection.connectionUsername = '<redacted>';\n connection.connectionPassword = '<redacted>';\n });\n }\n\n if (maskedData.headers?.['X-Tableau-Auth']) {\n maskedData.headers['X-Tableau-Auth'] = '<redacted>';\n }\n\n if (maskedData.params?.['user_id']) {\n maskedData.params['user_id'] = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n delete maskedData.params;\n }\n\n return maskedData;\n};\n\nexport const maskResponse = (response: ResponseInterceptorConfig): MaskedResponse => {\n const result = clone<MaskedResponse>(response);\n if (result.isErr()) {\n return response;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n }\n\n return maskedData;\n};\n\nfunction clone<T>(obj: T): Result<T, Error> {\n try {\n return Ok(structuredClone(obj));\n } catch (error) {\n if (error instanceof Error) {\n return Err(error);\n }\n\n const message = getExceptionMessage(error);\n writeToStderr(`Could not clone object, notification may not be sanitized! Error: ${message}`);\n return Err(new Error(message));\n }\n}\n", "import { ZodiosClass } from '@zodios/core';\n\nexport type RequestInterceptor = (config: RequestInterceptorConfig) => void;\nexport type ResponseInterceptor = (response: ResponseInterceptorConfig) => void;\nexport type ErrorInterceptor = (error: unknown, baseUrl: string) => void;\n\nexport type AxiosInterceptor = ZodiosClass<any>['axios']['interceptors'];\nexport type AxiosRequestInterceptor = Parameters<AxiosInterceptor['request']['use']>[0];\nexport type AxiosRequestInterceptorConfig = Parameters<NonNullable<AxiosRequestInterceptor>>[0];\nexport type RequestInterceptorConfig = {\n baseUrl: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosRequestInterceptorConfig, 'headers'>;\n\nexport type AxiosResponseInterceptor = Parameters<AxiosInterceptor['response']['use']>[0];\nexport type AxiosResponseInterceptorConfig = Parameters<NonNullable<AxiosResponseInterceptor>>[0];\nexport type ResponseInterceptorConfig = {\n baseUrl: string;\n url: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosResponseInterceptorConfig, 'headers' | 'statusText' | 'config'>;\n\nexport function getRequestInterceptorConfig(\n config: AxiosRequestInterceptorConfig,\n): Omit<RequestInterceptorConfig, 'baseUrl'> {\n return {\n method: config.method ?? 'UNKNOWN METHOD',\n url: config.url ?? 'UNKNOWN URL',\n headers: config.headers,\n data: config.data,\n params: config.params,\n };\n}\n\nexport function getResponseInterceptorConfig(\n response: AxiosResponseInterceptorConfig,\n): Omit<ResponseInterceptorConfig, 'baseUrl'> {\n return {\n url: response.config.url ?? 'UNKNOWN URL',\n status: response.status,\n headers: response.headers,\n data: response.data,\n };\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { getJwt } from '../../../utils/getJwt.js';\nimport { authenticationApis } from '../apis/authenticationApi.js';\nimport { AuthConfig } from '../authConfig.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\nimport Methods from './methods.js';\n\n/**\n * Authentication methods of the Tableau Server REST API\n *\n * @export\n * @class AuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport default class AuthenticationMethods extends Methods<typeof authenticationApis> {\n constructor(baseUrl: string) {\n super(new Zodios(baseUrl, authenticationApis));\n }\n\n /**\n * Signs you in as a user on the specified site on Tableau Server or Tableau Cloud.\n *\n * @param {AuthConfig} authConfig - The authentication configuration\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_in\n */\n signIn = async (authConfig: AuthConfig): Promise<Credentials> => {\n return (\n await this._apiClient.signIn({\n credentials: {\n site: {\n contentUrl: authConfig.siteName,\n },\n ...(await (async () => {\n switch (authConfig.type) {\n case 'pat':\n return {\n personalAccessTokenName: authConfig.patName,\n personalAccessTokenSecret: authConfig.patValue,\n };\n case 'direct-trust':\n return {\n jwt: await getJwt({\n username: authConfig.username,\n connectedApp: {\n clientId: authConfig.clientId,\n secretId: authConfig.secretId,\n secretValue: authConfig.secretValue,\n },\n scopes: authConfig.scopes,\n additionalPayload: authConfig.additionalPayload,\n }),\n };\n }\n })()),\n },\n })\n ).credentials;\n };\n}\n\n/**\n * Authentication methods of the Tableau Server REST API that assume the user is already authenticated\n *\n * @export\n * @class AuthenticatedAuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport class AuthenticatedAuthenticationMethods extends AuthenticatedMethods<\n typeof authenticationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, authenticationApis), creds);\n }\n\n /**\n * Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.\n *\n * Required scopes: none\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_out\n */\n signOut = async (): Promise<void> => {\n await this._apiClient.signOut(undefined, {\n ...this.authHeader,\n });\n };\n}\n", "import { randomUUID } from 'node:crypto';\n\nimport { JWTHeaderParameters, JWTPayload, SignJWT } from 'jose';\n\nexport async function getJwt({\n username,\n connectedApp,\n scopes,\n additionalPayload,\n}: {\n username: string;\n connectedApp: {\n clientId: string;\n secretId: string;\n secretValue: string;\n };\n scopes: Set<string>;\n additionalPayload?: Record<string, unknown>;\n}): Promise<string> {\n const header: JWTHeaderParameters = {\n alg: 'HS256',\n typ: 'JWT',\n kid: connectedApp.secretId,\n };\n\n const payload: JWTPayload = {\n jti: randomUUID(),\n iss: connectedApp.clientId,\n aud: 'tableau',\n sub: username,\n scp: [...scopes],\n iat: Math.floor(Date.now() / 1000) - 5,\n exp: Math.floor(Date.now() / 1000) + 5 * 60,\n ...additionalPayload,\n };\n\n const token = await new SignJWT(payload)\n .setProtectedHeader(header)\n .sign(new TextEncoder().encode(connectedApp.secretValue));\n\n return token;\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { credentialsSchema } from '../types/credentials.js';\n\nconst signInRequestSchema = z.object({\n credentials: z\n .object({\n site: z.object({\n contentUrl: z.string(),\n }),\n })\n .and(\n z\n .object({\n personalAccessTokenName: z.string(),\n personalAccessTokenSecret: z.string(),\n })\n .or(\n z.object({\n jwt: z.string(),\n }),\n ),\n ),\n});\n\nconst signInEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signin',\n alias: 'signIn',\n description: 'Signs in with Tableau credentials.',\n response: credentialsSchema,\n parameters: [\n {\n name: 'credentials',\n type: 'Body',\n schema: signInRequestSchema,\n },\n ],\n});\n\nconst signOutEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signout',\n alias: 'signOut',\n description:\n 'Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.',\n response: z.void(),\n});\n\nconst authenticationApi = makeApi([signInEndpoint, signOutEndpoint]);\nexport const authenticationApis = [\n ...authenticationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const credentialsSchema = z.object({\n credentials: z.object({\n site: z.object({\n id: z.string(),\n }),\n user: z.object({\n id: z.string(),\n }),\n token: z.string(),\n }),\n});\n\nexport type Credentials = z.infer<typeof credentialsSchema>['credentials'];\n", "import { ZodiosClass, ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nexport default class Methods<T extends ZodiosEndpointDefinitions> {\n protected _apiClient: ZodiosInstance<T>;\n\n constructor(apiClient: ZodiosInstance<T>) {\n this._apiClient = apiClient;\n }\n\n get interceptors(): ZodiosClass<T>['axios']['interceptors'] {\n return this._apiClient.axios.interceptors;\n }\n}\n", "import { ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nimport { Credentials } from '../types/credentials.js';\nimport Methods from './methods.js';\n\ntype AuthHeaders = {\n headers: {\n 'X-Tableau-Auth': string;\n };\n};\n\n/**\n * Base abstract class for any methods classes that require authentication.\n *\n * @export\n * @abstract\n * @class AuthenticatedMethods\n */\nexport default abstract class AuthenticatedMethods<\n T extends ZodiosEndpointDefinitions,\n> extends Methods<T> {\n private _creds: Credentials;\n\n protected get authHeader(): AuthHeaders {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n\n return {\n headers: {\n 'X-Tableau-Auth': this._creds.token,\n },\n };\n }\n\n protected get userId(): string {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n return this._creds.user.id;\n }\n\n constructor(apiClient: ZodiosInstance<T>, creds: Credentials) {\n super(apiClient);\n this._creds = creds;\n }\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { contentExplorationApis } from '../apis/contentExplorationApi.js';\nimport { SearchContentResponse } from '../types/contentExploration.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Content Exploration methods of the Tableau Server REST API\n *\n * @export\n * @class ContentExplorationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm\n */\nexport default class ContentExplorationMethods extends AuthenticatedMethods<\n typeof contentExplorationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, contentExplorationApis), creds);\n }\n\n /**\n * Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param terms - The search terms\n * @param page - The number of the page in the list reponse pages to return. Maximum number of items is 2000.\n * @param limit - The number of items to return on each page. The default is 10.\n * @param orderBy - The sorting method for items returned.\n * @param filter - An expression to filter the response\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm#ContentExplorationService_getSearch\n */\n searchContent = async (queries: {\n terms?: string;\n page?: number;\n limit?: number;\n orderBy?: string;\n filter?: string;\n }): Promise<SearchContentResponse> => {\n Object.entries(queries).forEach(([key, value]) => {\n if (value === undefined) {\n delete queries[key as keyof typeof queries];\n }\n });\n const response = await this._apiClient.searchContent({ queries, ...this.authHeader });\n return response.hits;\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { searchContentResponseSchema } from '../types/contentExploration.js';\n\nconst searchContentEndpoint = makeEndpoint({\n method: 'get',\n path: '/search',\n alias: 'searchContent',\n description:\n 'Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.',\n parameters: [\n {\n name: 'terms',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'page',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'limit',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'order_by',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n },\n ],\n response: z.object({\n hits: searchContentResponseSchema,\n }),\n});\n\nconst contentExplorationApi = makeApi([searchContentEndpoint]);\n\nexport const contentExplorationApis = [\n ...contentExplorationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst orderingMethods = z.enum([\n 'hitsTotal',\n 'hitsSmallSpanTotal',\n 'hitsMediumSpanTotal',\n 'hitsLargeSpanTotal',\n 'downstreamWorkbookCount',\n]);\n\nexport const orderBySchema = z\n .array(\n z.object({\n method: orderingMethods,\n sortDirection: z.enum(['asc', 'desc']).default('asc').optional(),\n }),\n )\n .nonempty();\n\nexport type OrderBy = z.infer<typeof orderBySchema>;\n\nconst contentTypes = z.enum([\n 'lens',\n 'datasource',\n 'virtualconnection',\n 'collection',\n 'project',\n 'flow',\n 'datarole',\n 'table',\n 'database',\n 'view',\n 'workbook',\n]);\n\nconst modifiedTimeSchema = z.union([\n z.array(z.string().datetime()).nonempty(),\n z\n .object({\n startDate: z.string().datetime(),\n endDate: z.string().datetime().optional(),\n })\n .strict(),\n z\n .object({\n startDate: z.string().datetime().optional(),\n endDate: z.string().datetime(),\n })\n .strict(),\n]);\n\nexport const searchContentFilterBase = z\n .object({\n contentTypes: z.array(contentTypes).nonempty(),\n ownerIds: z.array(z.number().int()).nonempty(),\n modifiedTime: modifiedTimeSchema,\n })\n .partial();\n\nexport const searchContentFilterSchema = z.union([\n searchContentFilterBase.extend({ contentTypes: z.array(contentTypes).nonempty() }).strict(),\n searchContentFilterBase.extend({ ownerIds: z.array(z.number().int()).nonempty() }).strict(),\n searchContentFilterBase.extend({ modifiedTime: modifiedTimeSchema }).strict(),\n]);\n\nexport type SearchContentFilter = z.infer<typeof searchContentFilterSchema>;\n\nconst searchContentItemSchema = z.object({\n uri: z.string(),\n content: z.record(z.string(), z.unknown()),\n});\n\nexport const searchContentResponseSchema = z\n .object({\n next: z.string(),\n prev: z.string(),\n pageIndex: z.number().int(),\n startIndex: z.number().int(),\n total: z.number().int(),\n limit: z.number().int(),\n items: z.array(searchContentItemSchema),\n })\n .partial();\n\nexport type SearchContentItem = z.infer<typeof searchContentItemSchema>;\n\nexport type SearchContentResponse = z.infer<typeof searchContentResponseSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { datasourcesApis } from '../apis/datasourcesApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { DataSource } from '../types/dataSource.js';\nimport { Pagination } from '../types/pagination.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Data Sources methods of the Tableau Server REST API\n *\n * @export\n * @class DatasourcesMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm\n */\nexport default class DatasourcesMethods extends AuthenticatedMethods<typeof datasourcesApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, datasourcesApis), creds);\n }\n\n /**\n * Returns a list of published data sources on the specified site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter datasources by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm#query_data_sources\n */\n listDatasources = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; datasources: DataSource[] }> => {\n const response = await this._apiClient.listDatasources({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n datasources: response.datasources.datasource ?? [],\n };\n };\n\n /**\n * Returns information about the specified data source.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param datasourceId - The ID of the data source\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm#query_data_source\n */\n queryDatasource = async ({\n siteId,\n datasourceId,\n }: {\n siteId: string;\n datasourceId: string;\n }): Promise<DataSource> => {\n return (\n await this._apiClient.queryDatasource({\n params: { siteId, datasourceId },\n ...this.authHeader,\n })\n ).datasource;\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { dataSourceSchema } from '../types/dataSource.js';\nimport { paginationSchema } from '../types/pagination.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst listDatasourcesEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/datasources',\n alias: 'listDatasources',\n description:\n 'Returns a list of published data sources on the specified site. Supports a filter string as a query parameter in the format field:operator:value.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description: 'Filter string in the format field:operator:value (e.g., name:eq:Project Views)',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n datasources: z.object({\n datasource: z.optional(z.array(dataSourceSchema)),\n }),\n }),\n});\n\nconst queryDatasourceEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/datasources/:datasourceId',\n alias: 'queryDatasource',\n description: 'Returns information about the specified data source.',\n response: z.object({\n datasource: dataSourceSchema,\n }),\n});\n\nconst datasourcesApi = makeApi([listDatasourcesEndpoint, queryDatasourceEndpoint]);\nexport const datasourcesApis = [...datasourcesApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\n\nexport const dataSourceSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n project: projectSchema,\n});\n\nexport type DataSource = z.infer<typeof dataSourceSchema>;\n", "import { z } from 'zod';\n\nexport const projectSchema = z.object({\n name: z.string(),\n id: z.string(),\n});\n", "import { z } from 'zod';\n\nexport const paginationSchema = z.object({\n pageNumber: z.coerce.number(),\n pageSize: z.coerce.number(),\n totalAvailable: z.coerce.number(),\n});\n\nexport type Pagination = z.infer<typeof paginationSchema>;\n\nexport const pulsePaginationSchema = z.object({\n next_page_token: z.string().optional(),\n total_available: z.coerce.number().optional(),\n});\n\nexport type PulsePagination = z.infer<typeof pulsePaginationSchema>;\n", "import { ZodiosEndpointParameter } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const paginationParameters = [\n {\n name: 'pageSize',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.',\n },\n {\n name: 'pageNumber',\n type: 'Query',\n schema: z.number().optional(),\n description: 'The offset for paging. The default is 1.',\n },\n] as const satisfies Array<ZodiosEndpointParameter>;\n", "import { Zodios } from '@zodios/core';\n\nimport { GraphQLResponse, metadataApis } from '../apis/metadataApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Metadata methods of the Tableau Server REST API\n *\n * @export\n * @class MetadataMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_metadata.htm\n */\nexport default class MetadataMethods extends AuthenticatedMethods<typeof metadataApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, metadataApis), creds);\n }\n\n /**\n * Executes a GraphQL query against the Tableau Server.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} query\n * @link https://help.tableau.com/current/api/metadata_api/en-us/index.html\n */\n graphql = async (query: string): Promise<GraphQLResponse> => {\n return await this._apiClient.graphql({ query }, { ...this.authHeader });\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const graphqlResponse = z.object({\n data: z.object({\n publishedDatasources: z.array(\n z.object({\n name: z.string().nullable(),\n description: z.string().nullable(),\n owner: z.object({\n name: z.string().nullable(),\n }),\n fields: z.array(\n z.object({\n name: z.string(),\n isHidden: z.boolean().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(\n z\n .object({\n attribute: z.string(),\n value: z.string().nullable(),\n })\n .nullable(),\n )\n .nullable(),\n fullyQualifiedName: z.string(),\n __typename: z.string(),\n // Common field properties (optional since they depend on field type)\n dataCategory: z.string().nullish(),\n role: z.string().nullish(),\n dataType: z.string().nullish(),\n defaultFormat: z.string().nullish(),\n semanticRole: z.string().nullish(),\n aggregation: z.string().nullish(),\n aggregationParam: z.string().nullish(),\n // CalculatedField specific properties\n formula: z.string().nullish(),\n isAutoGenerated: z.boolean().nullish(),\n hasUserReference: z.boolean().nullish(),\n // BinField specific properties\n binSize: z.number().nullish(),\n // GroupField specific properties\n hasOther: z.boolean().nullish(),\n // CombinedSetField specific properties\n delimiter: z.string().nullish(),\n combinationType: z.string().nullish(),\n }),\n ),\n }),\n ),\n }),\n});\n\nexport type GraphQLResponse = z.infer<typeof graphqlResponse>;\n\nconst graphqlEndpoint = makeEndpoint({\n method: 'post',\n path: '/graphql',\n alias: 'graphql',\n response: graphqlResponse,\n parameters: [\n {\n name: 'query',\n type: 'Body',\n schema: z.object({\n query: z.string(),\n }),\n },\n ],\n});\n\nconst metadataApi = makeApi([graphqlEndpoint]);\nexport const metadataApis = [...metadataApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport z from 'zod';\n\nimport { isAxiosError } from '../../../utils/isAxiosError.js';\nimport { pulseApis } from '../apis/pulseApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { PulsePagination } from '../types/pagination.js';\nimport {\n pulseBundleRequestSchema,\n PulseBundleResponse,\n PulseInsightBundleType,\n PulseMetric,\n PulseMetricDefinition,\n PulseMetricDefinitionView,\n PulseMetricSubscription,\n} from '../types/pulse.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Pulse methods of the Tableau Server REST API\n *\n * @export\n * @class PulseMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm\n */\nexport default class PulseMethods extends AuthenticatedMethods<typeof pulseApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, pulseApis), creds);\n }\n\n /**\n * Returns a list of all published Pulse Metric Definitions.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param view - The view of the definition to return. If not specified, the default view is returned.\n * @param pageToken - Token for retrieving the next page of results. Omit for the first page.\n * @param pageSize - Specifies the number of results in a paged response.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListDefinitions\n */\n listAllPulseMetricDefinitions = async (\n view?: PulseMetricDefinitionView,\n pageToken?: string,\n pageSize?: number,\n ): Promise<\n PulseResult<{\n pagination: PulsePagination;\n definitions: PulseMetricDefinition[];\n }>\n > => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listAllPulseMetricDefinitions({\n queries: { view, page_token: pageToken, page_size: pageSize },\n ...this.authHeader,\n });\n return {\n pagination: {\n next_page_token: response.next_page_token,\n offset: response.offset,\n total_available: response.total_available,\n },\n definitions: response.definitions ?? [],\n };\n });\n };\n\n /**\n * Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param metricDefinitionIds - The list of metric definition IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetDefinitionsByPost\n */\n listPulseMetricDefinitionsFromMetricDefinitionIds = async (\n metricDefinitionIds: string[],\n view?: PulseMetricDefinitionView,\n ): Promise<PulseResult<PulseMetricDefinition[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricDefinitionsFromMetricDefinitionIds(\n { definition_ids: metricDefinitionIds },\n { queries: { view }, ...this.authHeader },\n );\n return response.definitions ?? [];\n });\n };\n\n /**\n * Returns a list of published Pulse Metrics.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param pulseMetricDefinitionID - The ID of the Pulse Metric Definition to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListMetrics\n */\n listPulseMetricsFromMetricDefinitionId = async (\n pulseMetricDefinitionID: string,\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricDefinitionId({\n params: { pulseMetricDefinitionID },\n ...this.authHeader,\n });\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metrics for a list of metric IDs.\n *\n * Required scopes: `tableau:insight_metrics:read`\n *\n * @param metricIds - The list of metric IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetMetrics\n */\n listPulseMetricsFromMetricIds = async (\n metricIds: string[],\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricIds(\n { metric_ids: metricIds },\n { ...this.authHeader },\n );\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metric Subscriptions for the current user.\n *\n * Required scopes: `tableau:metric_subscriptions:read`\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseSubscriptionService_ListSubscriptions\n */\n listPulseMetricSubscriptionsForCurrentUser = async (): Promise<\n PulseResult<PulseMetricSubscription[]>\n > => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricSubscriptionsForCurrentUser({\n queries: { user_id: this.userId },\n ...this.authHeader,\n });\n return response.subscriptions ?? [];\n });\n };\n\n /**\n * Returns the generated bundle of the current aggregate value for the Pulse metric.\n *\n * Required scopes: `tableau:insights:read`\n *\n * @param bundleRequest - The request to generate a bundle for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseInsightsService_GenerateInsightBundleBasic\n */\n generatePulseMetricValueInsightBundle = async (\n bundleRequest: z.infer<typeof pulseBundleRequestSchema>,\n bundleType: PulseInsightBundleType,\n ): Promise<PulseResult<PulseBundleResponse>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.generatePulseMetricValueInsightBundle(\n { bundle_request: bundleRequest.bundle_request },\n { params: { bundle_type: bundleType }, ...this.authHeader },\n );\n return response ?? {};\n });\n };\n}\n\nexport type PulseDisabledError = 'tableau-server' | 'pulse-disabled';\nexport type PulseResult<T> = Result<T, PulseDisabledError>;\nasync function guardAgainstPulseDisabled<T>(callback: () => Promise<T>): Promise<PulseResult<T>> {\n try {\n return new Ok(await callback());\n } catch (error) {\n if (isAxiosError(error)) {\n if (error.response?.status === 404) {\n return new Err('tableau-server');\n }\n\n if (\n error.response?.status === 400 &&\n error.response.headers.tableau_error_code === '0xd3408984' &&\n error.response.headers.validation_code === '400999'\n ) {\n // ntbue-service-chassis/-/blob/main/server/interceptors/site_settings.go\n return new Err('pulse-disabled');\n }\n }\n\n throw error;\n }\n}\n", "'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n", "'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n", "import FormData from 'form-data';\n\nexport default FormData;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n", "'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n", "'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n", "import crypto from 'crypto';\nimport URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n const randomValues = new Uint32Array(size);\n crypto.randomFillSync(randomValues);\n for (let i = 0; i < size; i++) {\n str += alphabet[randomValues[i] % length];\n }\n\n return str;\n}\n\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: typeof Blob !== 'undefined' && Blob || null\n },\n ALPHABET,\n generateString,\n protocols: [ 'http', 'https', 'file', 'data' ]\n};\n", "'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n", "const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n", "import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n", "'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n", "'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n", "'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n", "'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n", "'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n", "'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n", "'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n", "'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from './../helpers/buildURL.js';\nimport proxyFromEnv from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport util from 'util';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport {VERSION} from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport {EventEmitter} from 'events';\nimport formDataToStream from \"../helpers/formDataToStream.js\";\nimport readBlob from \"../helpers/readBlob.js\";\nimport ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';\nimport callbackify from \"../helpers/callbackify.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';\n\nconst zlibOptions = {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n};\n\nconst brotliOptions = {\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n}\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst {http: httpFollow, https: httpsFollow} = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map(protocol => {\n return protocol + ':';\n});\n\n\nconst flushOnFinish = (stream, [throttled, flush]) => {\n stream\n .on('end', flush)\n .on('error', flush);\n\n return throttled;\n}\n\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */\nfunction dispatchBeforeRedirect(options, responseDetails) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options, responseDetails);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = proxyFromEnv.getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n const base64 = Buffer\n .from(proxy.auth, 'utf8')\n .toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\nconst isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process';\n\n// temporary hotfix\n\nconst wrapAsync = (asyncExecutor) => {\n return new Promise((resolve, reject) => {\n let onDone;\n let isDone;\n\n const done = (value, isRejected) => {\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n }\n\n const _resolve = (value) => {\n done(value);\n resolve(value);\n };\n\n const _reject = (reason) => {\n done(reason, true);\n reject(reason);\n }\n\n asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);\n })\n};\n\nconst resolveFamily = ({address, family}) => {\n if (!utils.isString(address)) {\n throw TypeError('address must be a string');\n }\n return ({\n address,\n family: family || (address.indexOf('.') < 0 ? 6 : 4)\n });\n}\n\nconst buildAddressEntry = (address, family) => resolveFamily(utils.isObject(address) ? address : {address, family});\n\n/*eslint consistent-return:0*/\nexport default isHttpAdapterSupported && function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let {data, lookup, family} = config;\n const {responseType, responseEncoding} = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n\n if (lookup) {\n const _lookup = callbackify(lookup, (value) => utils.isArray(value) ? value : [value]);\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb) => {\n _lookup(hostname, opt, (err, arg0, arg1) => {\n if (err) {\n return cb(err);\n }\n\n const addresses = utils.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];\n\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n }\n }\n\n // temporary internal emitter until the AxiosRequest class will be implemented\n const emitter = new EventEmitter();\n\n const onFinished = () => {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n emitter.removeAllListeners();\n }\n\n onDone((value, isRejected) => {\n isDone = true;\n if (isRejected) {\n rejected = true;\n onFinished();\n }\n });\n\n function abort(reason) {\n emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);\n }\n\n emitter.once('abort', reject);\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n // Apply the same semantics as HTTP: only enforce if a finite, non-negative cap is set.\n if (config.maxContentLength > -1) {\n // Use the exact string passed to fromDataURI (config.url); fall back to fullPath if needed.\n const dataUrl = String(config.url || fullPath || '');\n const estimated = estimateDataURLDecodedBytes(dataUrl);\n\n if (estimated > config.maxContentLength) {\n return reject(new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config\n ));\n }\n }\n\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n convertedData = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: new AxiosHeaders(),\n config\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\n 'Unsupported protocol ' + protocol,\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const {onUploadProgress, onDownloadProgress} = config;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for spec compliant FormData objects\n if (utils.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n\n data = formDataToStream(data, (formHeaders) => {\n headers.set(formHeaders);\n }, {\n tag: `axios-${VERSION}-boundary`,\n boundary: userBoundary && userBoundary[1] || undefined\n });\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util.promisify(data.getLength).call(data);\n Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);\n /*eslint no-empty:0*/\n } catch (e) {\n }\n }\n } else if (utils.isBlob(data) || utils.isFile(data)) {\n data.size && headers.setContentType(data.type || 'application/octet-stream');\n headers.setContentLength(data.size || 0);\n data = stream.Readable.from(readBlob(data));\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n }\n\n const contentLength = utils.toFiniteNumber(headers.getContentLength());\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, {objectMode: false});\n }\n\n data = stream.pipeline([data, new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxUploadRate)\n })], utils.noop);\n\n onUploadProgress && data.on('progress', flushOnFinish(\n data,\n progressEventDecorator(\n contentLength,\n progressEventReducer(asyncDecorator(onUploadProgress), false, 3)\n )\n ));\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set(\n 'Accept-Encoding',\n 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false\n );\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {}\n };\n\n // cacheable-lookup integration hotfix\n !utils.isUndefined(lookup) && (options.lookup = lookup);\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname.startsWith(\"[\") ? parsed.hostname.slice(1, -1) : parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n const responseLength = +res.headers['content-length'];\n\n if (onDownloadProgress || maxDownloadRate) {\n const transformStream = new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxDownloadRate)\n });\n\n onDownloadProgress && transformStream.on('progress', flushOnFinish(\n transformStream,\n progressEventDecorator(\n responseLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)\n )\n ));\n\n streams.push(transformStream);\n }\n\n // decompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers['content-encoding']) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === 'HEAD' || res.statusCode === 204) {\n delete res.headers['content-encoding'];\n }\n\n switch ((res.headers['content-encoding'] || '').toLowerCase()) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'x-gzip':\n case 'compress':\n case 'x-compress':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'deflate':\n streams.push(new ZlibHeaderTransformStream());\n\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress(brotliOptions));\n delete res.headers['content-encoding'];\n }\n }\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n const offListeners = stream.finished(responseStream, () => {\n offListeners();\n onFinished();\n });\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'stream has been aborted',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n emitter.once('abort', err => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n emitter.once('abort', err => {\n reject(err);\n req.destroy(err);\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (Number.isNaN(timeout)) {\n reject(new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n ));\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n ));\n abort();\n });\n }\n\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', err => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n req.end(data);\n }\n });\n}\n\nexport const __setProxy = setProxy;\n", "export const VERSION = \"1.12.1\";", "'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], {type: mime});\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n", "'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform{\n constructor(options) {\n options = utils.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source) => {\n return !utils.isUndefined(source[prop]);\n });\n\n super({\n readableHighWaterMark: options.chunkSize\n });\n\n const internals = this[kInternals] = {\n timeWindow: options.timeWindow,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n\n this.on('newListener', event => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = (maxRate / divider);\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n\n const pushChunk = (_chunk, _callback) => {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n internals.isCaptured && this.emit('progress', internals.bytesSeen);\n\n if (this.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n }\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(_chunk, chunkRemainder ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n}\n\nexport default AxiosTransformStream;\n", "import util from 'util';\nimport {Readable} from 'stream';\nimport utils from \"../utils.js\";\nimport readBlob from \"./readBlob.js\";\nimport platform from \"../platform/index.js\";\n\nconst BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';\n\nconst textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util.TextEncoder();\n\nconst CRLF = '\\r\\n';\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\n\nclass FormDataPart {\n constructor(name, value) {\n const {escapeName} = this.constructor;\n const isStringValue = utils.isString(value);\n\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${\n !isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : ''\n }${CRLF}`;\n\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || \"application/octet-stream\"}${CRLF}`\n }\n\n this.headers = textEncoder.encode(headers + CRLF);\n\n this.contentLength = isStringValue ? value.byteLength : value.size;\n\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n\n this.name = name;\n this.value = value;\n }\n\n async *encode(){\n yield this.headers;\n\n const {value} = this;\n\n if(utils.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob(value);\n }\n\n yield CRLF_BYTES;\n }\n\n static escapeName(name) {\n return String(name).replace(/[\\r\\n\"]/g, (match) => ({\n '\\r' : '%0D',\n '\\n' : '%0A',\n '\"' : '%22',\n }[match]));\n }\n}\n\nconst formDataToStream = (form, headersHandler, options) => {\n const {\n tag = 'form-data-boundary',\n size = 25,\n boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)\n } = options || {};\n\n if(!utils.isFormData(form)) {\n throw TypeError('FormData instance required');\n }\n\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error('boundary must be 10-70 characters long')\n }\n\n const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);\n const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF);\n let contentLength = footerBytes.byteLength;\n\n const parts = Array.from(form.entries()).map(([name, value]) => {\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n\n contentLength += boundaryBytes.byteLength * parts.length;\n\n contentLength = utils.toFiniteNumber(contentLength);\n\n const computedHeaders = {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`\n }\n\n if (Number.isFinite(contentLength)) {\n computedHeaders['Content-Length'] = contentLength;\n }\n\n headersHandler && headersHandler(computedHeaders);\n\n return Readable.from((async function *() {\n for(const part of parts) {\n yield boundaryBytes;\n yield* part.encode();\n }\n\n yield footerBytes;\n })());\n};\n\nexport default formDataToStream;\n", "const {asyncIterator} = Symbol;\n\nconst readBlob = async function* (blob) {\n if (blob.stream) {\n yield* blob.stream()\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer()\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n}\n\nexport default readBlob;\n", "\"use strict\";\n\nimport stream from \"stream\";\n\nclass ZlibHeaderTransformStream extends stream.Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) { // Hex: 78\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C \n this.push(header, encoding);\n }\n }\n\n this.__transform(chunk, encoding, callback);\n }\n}\n\nexport default ZlibHeaderTransformStream;\n", "import utils from \"../utils.js\";\n\nconst callbackify = (fn, reducer) => {\n return utils.isAsyncFn(fn) ? function (...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value) => {\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n } : fn;\n}\n\nexport default callbackify;\n", "'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n", "/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n", "import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n", "/**\n * Estimate decoded byte length of a data:// URL *without* allocating large buffers.\n * - For base64: compute exact decoded size using length and padding;\n * handle %XX at the character-count level (no string allocation).\n * - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound.\n *\n * @param {string} url\n * @returns {number}\n */\nexport default function estimateDataURLDecodedBytes(url) {\n if (!url || typeof url !== 'string') return 0;\n if (!url.startsWith('data:')) return 0;\n\n const comma = url.indexOf(',');\n if (comma < 0) return 0;\n\n const meta = url.slice(5, comma);\n const body = url.slice(comma + 1);\n const isBase64 = /;base64/i.test(meta);\n\n if (isBase64) {\n let effectiveLen = body.length;\n const len = body.length; // cache length\n\n for (let i = 0; i < len; i++) {\n if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) {\n const a = body.charCodeAt(i + 1);\n const b = body.charCodeAt(i + 2);\n const isHex =\n ((a >= 48 && a <= 57) || (a >= 65 && a <= 70) || (a >= 97 && a <= 102)) &&\n ((b >= 48 && b <= 57) || (b >= 65 && b <= 70) || (b >= 97 && b <= 102));\n\n if (isHex) {\n effectiveLen -= 2;\n i += 2;\n }\n }\n }\n\n let pad = 0;\n let idx = len - 1;\n\n const tailIsPct3D = (j) =>\n j >= 2 &&\n body.charCodeAt(j - 2) === 37 && // '%'\n body.charCodeAt(j - 1) === 51 && // '3'\n (body.charCodeAt(j) === 68 || body.charCodeAt(j) === 100); // 'D' or 'd'\n\n if (idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n idx--;\n } else if (tailIsPct3D(idx)) {\n pad++;\n idx -= 3;\n }\n }\n\n if (pad === 1 && idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n } else if (tailIsPct3D(idx)) {\n pad++;\n }\n }\n\n const groups = Math.floor(effectiveLen / 4);\n const bytes = groups * 3 - (pad || 0);\n return bytes > 0 ? bytes : 0;\n }\n\n return Buffer.byteLength(body, 'utf8');\n}\n", "import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n", "import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n", "import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n", "import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n", "\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({fetch, Request, Response}) => ({\n fetch, Request, Response\n }))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n const {fetch, Request, Response} = Object.assign({}, globalFetchAPI, env);\n const isFetchSupported = isFunction(fetch);\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? fetch(request, fetchOptions) : fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, config ? config.env : null);\n\n const {fetch, Request, Response} = env;\n\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n", "import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters, config) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n", "'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n", "'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n", "'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n", "'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n", "'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n", "const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n", "'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n", "import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport {\n pulseBundleRequestSchema,\n pulseBundleResponseSchema,\n pulseInsightBundleTypeEnum,\n pulseMetricDefinitionSchema,\n pulseMetricDefinitionViewEnum,\n pulseMetricSchema,\n pulseMetricSubscriptionSchema,\n} from '../types/pulse.js';\n\nconst listAllPulseMetricDefinitionsRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions',\n alias: 'listAllPulseMetricDefinitions',\n description: 'Returns a list of all published Pulse Metric Definitions on the specified site.',\n parameters: [\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n {\n name: 'page_size',\n type: 'Query',\n schema: z.optional(z.coerce.number().int().positive()),\n description: 'Specifies the number of results in a paged response.',\n },\n {\n name: 'page_token',\n type: 'Query',\n schema: z.optional(z.string()),\n description: 'Token for retrieving the next page of results. Omit for the first page.',\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n next_page_token: z.string().optional(),\n offset: z.coerce.number(),\n total_available: z.coerce.number(),\n }),\n});\n\nconst listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/definitions%3AbatchGet',\n alias: 'listPulseMetricDefinitionsFromMetricDefinitionIds',\n description:\n 'Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.',\n parameters: [\n {\n name: 'definition_ids',\n type: 'Body',\n schema: z.object({ definition_ids: z.array(z.string().nonempty()).min(1) }),\n description: 'A list of metric definition IDs to retrieve.',\n },\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n }),\n});\n\nconst listPulseMetricsFromMetricDefinitionIdRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions/:pulseMetricDefinitionID/metrics',\n alias: 'listPulseMetricsFromMetricDefinitionId',\n description: 'Returns a list of published Pulse Metrics for a specific Pulse Metric Definition.',\n parameters: [\n {\n name: 'pulseMetricDefinitionID',\n type: 'Path',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n total_available: z.number(),\n }),\n});\n\nconst listPulseMetricsFromMetricIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/metrics%3AbatchGet',\n alias: 'listPulseMetricsFromMetricIds',\n description: 'Returns a list of Pulse Metrics for a list of metric IDs.',\n parameters: [\n {\n name: 'metric_ids',\n type: 'Body',\n schema: z.object({ metric_ids: z.array(z.string().nonempty()) }),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n }),\n});\n\nconst listPulseMetricSubscriptionsForCurrentUserRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/subscriptions',\n alias: 'listPulseMetricSubscriptionsForCurrentUser',\n description: 'Returns a list of Pulse Subscriptions for the current user.',\n parameters: [\n {\n name: 'user_id',\n type: 'Query',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n subscriptions: z.array(pulseMetricSubscriptionSchema),\n }),\n});\n\nconst generatePulseMetricValueInsightBundleRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/insights/:bundle_type',\n alias: 'generatePulseMetricValueInsightBundle',\n description: 'Generates a bundle for the current aggregated value for the Pulse metric.',\n parameters: [\n {\n name: 'bundle_request',\n type: 'Body',\n schema: pulseBundleRequestSchema,\n },\n {\n name: 'bundle_type',\n type: 'Path',\n schema: z.enum(pulseInsightBundleTypeEnum),\n },\n ],\n response: pulseBundleResponseSchema,\n});\n\nconst pulseApi = makeApi([\n generatePulseMetricValueInsightBundleRestEndpoint,\n listAllPulseMetricDefinitionsRestEndpoint,\n listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint,\n listPulseMetricsFromMetricDefinitionIdRestEndpoint,\n listPulseMetricSubscriptionsForCurrentUserRestEndpoint,\n listPulseMetricsFromMetricIdsRestEndpoint,\n]);\nexport const pulseApis = [...pulseApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst pulseMetadataSchema = z.object({\n name: z.string(),\n description: z.string(),\n id: z.string(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n definition_version: z.coerce.number(),\n last_updated_user: z.object({ id: z.string() }).optional(),\n});\n\nconst pulseDatasourceSchema = z.object({\n id: z.string(),\n});\n\nconst pulseFilterSchema = z.object({\n field: z.string(),\n operator: z.string(),\n categorical_values: z.array(\n z.object({\n string_value: z.string().optional(),\n bool_value: z.boolean().optional(),\n null_value: z.string().optional(),\n }),\n ),\n});\n\nconst pulseBasicSpecificationSchema = z.object({\n measure: z.object({ field: z.string(), aggregation: z.string() }),\n time_dimension: z.object({ field: z.string() }),\n filters: z.array(pulseFilterSchema),\n});\n\nconst pulseSpecificationSchema = z.object({\n datasource: pulseDatasourceSchema,\n basic_specification: pulseBasicSpecificationSchema.optional(),\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n is_running_total: z.boolean(),\n});\n\nexport const pulseExtensionOptionsSchema = z.object({\n allowed_dimensions: z.array(z.string()),\n allowed_granularities: z.array(z.string()),\n offset_from_today: z.number(),\n});\n\nexport const pulseMetricSpecificationSchema = z.object({\n filters: z.array(pulseFilterSchema),\n measurement_period: z.object({\n granularity: z.string(),\n range: z.string(),\n }),\n comparison: z.object({ comparison: z.string() }),\n});\n\nexport const pulseGoalsSchema = z.object({\n target: z.object({ value: z.number() }).optional(),\n});\n\nexport const pulseMetricSchema = z.object({\n id: z.string(),\n specification: pulseMetricSpecificationSchema,\n definition_id: z.string(),\n is_default: z.boolean(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n goals: pulseGoalsSchema.optional(),\n is_followed: z.boolean(),\n datasource_luid: z.string(),\n});\n\nexport const pulseRepresentationOptionsSchema = z.object({\n type: z.string(),\n number_units: z.object({\n singular_noun: z.string(),\n plural_noun: z.string(),\n }),\n sentiment_type: z.string(),\n row_level_id_field: z.object({ identifier_col: z.string() }),\n row_level_entity_names: z.object({\n entity_name_singular: z.string().optional(),\n entity_name_plural: z.string().optional(),\n }),\n row_level_name_field: z.object({ name_col: z.string() }),\n currency_code: z.string(),\n});\n\nexport const insightOptionsSchema = z.object({\n settings: z.array(z.object({ type: z.string(), disabled: z.boolean() })),\n});\n\nexport const comparisonSchema = z.object({\n comparisons: z.array(\n z.object({\n compare_config: z.object({ comparison: z.string() }),\n index: z.coerce.number(),\n }),\n ),\n});\n\nexport const datasourceGoalsSchema = z.array(\n z.object({\n basic_specification: pulseBasicSpecificationSchema.optional(),\n threshold_basic_specification: pulseBasicSpecificationSchema.optional(),\n threshold_viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n minimum_granularity: z.string(),\n benchmark_sentiment_type: z.string(),\n name: z.string(),\n }),\n);\n\nexport const pulseMetricDefinitionSchema = z.object({\n metadata: pulseMetadataSchema,\n specification: pulseSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n metrics: z.array(pulseMetricSchema),\n total_metrics: z.coerce.number(),\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n comparisons: comparisonSchema,\n datasource_goals: datasourceGoalsSchema,\n});\n\nexport const pulseMetricSubscriptionSchema = z.object({\n id: z.string(),\n metric_id: z.string(),\n});\n\nexport const languageEnumSchema = z.enum([\n 'LANGUAGE_UNSPECIFIED',\n 'LANGUAGE_DE_DE',\n 'LANGUAGE_EN_US',\n 'LANGUAGE_EN_GB',\n 'LANGUAGE_ES_ES',\n 'LANGUAGE_FR_FR',\n 'LANGUAGE_FR_CA',\n 'LANGUAGE_GA_IE',\n 'LANGUAGE_IT_IT',\n 'LANGUAGE_JA_JP',\n 'LANGUAGE_KO_KR',\n 'LANGUAGE_NL_NL',\n 'LANGUAGE_PT_BR',\n 'LANGUAGE_SV_SE',\n 'LANGUAGE_TH_TH',\n 'LANGUAGE_ZH_CN',\n 'LANGUAGE_ZH_TW',\n]);\nexport type LanguageEnumType = z.infer<typeof languageEnumSchema>;\n\nexport const localeEnumSchema = z.enum([\n 'LOCALE_UNSPECIFIED',\n 'LOCALE_AR_AE',\n 'LOCALE_AR_BH',\n 'LOCALE_AR_DZ',\n 'LOCALE_AR_EG',\n 'LOCALE_AR_IQ',\n 'LOCALE_AR_JO',\n 'LOCALE_AR_KW',\n 'LOCALE_AR_LB',\n 'LOCALE_AR_LY',\n 'LOCALE_AR_MA',\n 'LOCALE_AR_OM',\n 'LOCALE_AR_QA',\n 'LOCALE_AR_SA',\n 'LOCALE_AR_SD',\n 'LOCALE_AR_SY',\n 'LOCALE_AR_TN',\n 'LOCALE_AR_YE',\n 'LOCALE_BE_BY',\n 'LOCALE_BG_BG',\n 'LOCALE_CA_ES',\n 'LOCALE_CS_CZ',\n 'LOCALE_DA_DK',\n 'LOCALE_DE_AT',\n 'LOCALE_DE_CH',\n 'LOCALE_DE_DE',\n 'LOCALE_DE_LU',\n 'LOCALE_EL_CY',\n 'LOCALE_EL_GR',\n 'LOCALE_EN_AU',\n 'LOCALE_EN_CA',\n 'LOCALE_EN_GB',\n 'LOCALE_EN_IE',\n 'LOCALE_EN_IN',\n 'LOCALE_EN_MT',\n 'LOCALE_EN_NZ',\n 'LOCALE_EN_PH',\n 'LOCALE_EN_SG',\n 'LOCALE_EN_US',\n 'LOCALE_EN_ZA',\n 'LOCALE_ES_AR',\n 'LOCALE_ES_BO',\n 'LOCALE_ES_CL',\n 'LOCALE_ES_CO',\n 'LOCALE_ES_CR',\n 'LOCALE_ES_DO',\n 'LOCALE_ES_EC',\n 'LOCALE_ES_ES',\n 'LOCALE_ES_GT',\n 'LOCALE_ES_HN',\n 'LOCALE_ES_MX',\n 'LOCALE_ES_NI',\n 'LOCALE_ES_PA',\n 'LOCALE_ES_PE',\n 'LOCALE_ES_PR',\n 'LOCALE_ES_PY',\n 'LOCALE_ES_SV',\n 'LOCALE_ES_US',\n 'LOCALE_ES_UY',\n 'LOCALE_ES_VE',\n 'LOCALE_ET_EE',\n 'LOCALE_FI_FI',\n 'LOCALE_FR_BE',\n 'LOCALE_FR_CA',\n 'LOCALE_FR_CH',\n 'LOCALE_FR_FR',\n 'LOCALE_FR_LU',\n 'LOCALE_GA_IE',\n 'LOCALE_HE_IL',\n 'LOCALE_HI_IN',\n 'LOCALE_HR_HR',\n 'LOCALE_HU_HU',\n 'LOCALE_ID_ID',\n 'LOCALE_IN_ID',\n 'LOCALE_IS_IS',\n 'LOCALE_IT_CH',\n 'LOCALE_IT_IT',\n 'LOCALE_IW_IL',\n 'LOCALE_JA_JP',\n 'LOCALE_KO_KR',\n 'LOCALE_LT_LT',\n 'LOCALE_LV_LV',\n 'LOCALE_MK_MK',\n 'LOCALE_MS_MY',\n 'LOCALE_MT_MT',\n 'LOCALE_NL_BE',\n 'LOCALE_NL_NL',\n 'LOCALE_NB_NO',\n 'LOCALE_NO_NO',\n 'LOCALE_PL_PL',\n 'LOCALE_PT_BR',\n 'LOCALE_PT_PT',\n 'LOCALE_RO_RO',\n 'LOCALE_RU_RU',\n 'LOCALE_SK_SK',\n 'LOCALE_SL_SI',\n 'LOCALE_SQ_AL',\n 'LOCALE_SR_BA',\n 'LOCALE_SR_ME',\n 'LOCALE_SR_RS',\n 'LOCALE_SV_SE',\n 'LOCALE_TH_TH',\n 'LOCALE_TR_TR',\n 'LOCALE_UK_UA',\n 'LOCALE_VI_VN',\n 'LOCALE_ZH_CN',\n 'LOCALE_ZH_HK',\n 'LOCALE_ZH_SG',\n 'LOCALE_ZH_TW',\n]);\nexport type LocaleEnumType = z.infer<typeof localeEnumSchema>;\n\nexport const outputFormatEnumSchema = z.enum([\n 'OUTPUT_FORMAT_UNSPECIFIED',\n 'OUTPUT_FORMAT_HTML',\n 'OUTPUT_FORMAT_TEXT',\n]);\nexport type OutputFormatEnumType = z.infer<typeof outputFormatEnumSchema>;\n\nexport const pulseBundleRequestSchema = z.object({\n bundle_request: z.object({\n version: z.number(),\n options: z.object({\n output_format: outputFormatEnumSchema,\n time_zone: z.string(),\n language: languageEnumSchema,\n locale: localeEnumSchema,\n }),\n input: z.object({\n metadata: z.object({\n name: z.string().nonempty(),\n metric_id: z.string().nonempty(),\n definition_id: z.string().nonempty(),\n }),\n metric: z.object({\n definition: z.object({\n datasource: z.object({\n id: z.string(),\n }),\n basic_specification: pulseBasicSpecificationSchema,\n is_running_total: z.boolean(),\n }),\n metric_specification: pulseMetricSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n goals: pulseGoalsSchema.optional(),\n }),\n }),\n }),\n});\n\nexport const popcBanInsightGroupSchema = z.object({\n type: z.string(),\n insights: z.array(\n z.object({\n result: z.object({\n type: z.string(),\n version: z.number(),\n content: z.string().optional(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n facts: z.any().optional(),\n characterization: z.string().optional(),\n question: z.string(),\n score: z.number(),\n }),\n insight_type: z.string(),\n }),\n ),\n summaries: z.array(\n z.object({\n result: z.object({\n id: z.string(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n generation_id: z.string(),\n timestamp: z.string().optional(),\n last_attempted_timestamp: z.string().optional(),\n }),\n }),\n ),\n});\n\nexport const pulseBundleResponseSchema = z.object({\n bundle_response: z.object({\n result: z.object({\n insight_groups: z.array(popcBanInsightGroupSchema),\n has_errors: z.boolean(),\n characterization: z.string(),\n }),\n }),\n});\n\nexport type PulseBundleResponse = z.infer<typeof pulseBundleResponseSchema>;\n\nexport const pulseInsightBundleTypeEnum = ['ban', 'springboard', 'basic', 'detail'] as const;\nexport type PulseInsightBundleType = (typeof pulseInsightBundleTypeEnum)[number];\n\nexport const pulseMetricDefinitionViewEnum = [\n 'DEFINITION_VIEW_BASIC',\n 'DEFINITION_VIEW_FULL',\n 'DEFINITION_VIEW_DEFAULT',\n] as const;\nexport type PulseMetricDefinitionView = (typeof pulseMetricDefinitionViewEnum)[number];\n\nexport type PulseMetricDefinition = z.infer<typeof pulseMetricDefinitionSchema>;\nexport type PulseMetric = z.infer<typeof pulseMetricSchema>;\nexport type PulseMetricSubscription = z.infer<typeof pulseMetricSubscriptionSchema>;\n", "import { isErrorFromAlias, Zodios } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\n\nimport { getExceptionMessage } from '../../../utils/getExceptionMessage.js';\nimport { isAxiosError } from '../../../utils/isAxiosError.js';\nimport { serverApis, Session } from '../apis/serverApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { ServerInfo } from '../types/serverInfo.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Server methods of the Tableau Server REST API\n *\n * @export\n * @class ServerMethods\n * @extends {AuthenticatedMethods<typeof serverApis>}\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_server.htm\n */\nexport default class ServerMethods extends AuthenticatedMethods<typeof serverApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, serverApis), creds);\n }\n\n /**\n * Returns the version of Tableau Server and the supported version of the REST API.\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_server.htm#get_server_info\n */\n getServerInfo = async (): Promise<ServerInfo> => {\n return (await this._apiClient.getServerInfo()).serverInfo;\n };\n\n /**\n * Returns details of the current session of Tableau Server.\n *\n * Required scopes: none\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_server.htm#get-current-server-session\n */\n getCurrentServerSession = async (): Promise<\n Result<Session, { type: 'unauthorized' | 'unknown'; message: unknown }>\n > => {\n try {\n const response = await this._apiClient.getCurrentServerSession({\n ...this.authHeader,\n });\n return Ok(response.session);\n } catch (error) {\n if (isErrorFromAlias(this._apiClient.api, 'getCurrentServerSession', error)) {\n return Err({ type: 'unauthorized', message: error.response.data.error });\n }\n\n if (isAxiosError(error) && error.response) {\n return Err({ type: 'unknown', message: error.response.data });\n }\n\n return Err({ type: 'unknown', message: getExceptionMessage(error) });\n }\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { serverInfo } from '../types/serverInfo.js';\nimport { siteSchema } from '../types/site.js';\nimport { userSchema } from '../types/user.js';\n\nconst sessionSchema = z.object({\n site: siteSchema,\n user: userSchema,\n});\n\nconst getServerInfoEndpoint = makeEndpoint({\n method: 'get',\n path: '/serverinfo',\n alias: 'getServerInfo',\n description: 'Returns the version of Tableau Server and the supported version of the REST API.',\n response: z.object({\n serverInfo,\n }),\n});\n\nconst getCurrentServerSessionEndpoint = makeEndpoint({\n method: 'get',\n path: '/sessions/current',\n alias: 'getCurrentServerSession',\n description: 'Returns details of the current session of Tableau Server.',\n response: z.object({ session: sessionSchema }),\n errors: [\n {\n status: 401,\n schema: z.object({\n error: z.object({\n code: z.string(),\n summary: z.string(),\n detail: z.string(),\n }),\n }),\n },\n ],\n});\n\nexport type Session = z.infer<typeof sessionSchema>;\nconst serverApi = makeApi([getServerInfoEndpoint, getCurrentServerSessionEndpoint]);\nexport const serverApis = [...serverApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const serverInfo = z.object({\n productVersion: z.object({\n value: z.string(),\n build: z.string(),\n }),\n restApiVersion: z.string(),\n});\n\nexport type ServerInfo = z.infer<typeof serverInfo>;\nexport type ProductVersion = ServerInfo['productVersion'];\n", "import { z } from 'zod';\n\nexport const siteSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n", "import { z } from 'zod';\n\nexport const userSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n\nexport type User = z.infer<typeof userSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { viewsApis } from '../apis/viewsApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { View } from '../types/view.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Views methods of the Tableau Server REST API\n *\n * @export\n * @class ViewsMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class ViewsMethods extends AuthenticatedMethods<typeof viewsApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, viewsApis), creds);\n }\n\n /**\n * Gets the details of a specific view.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} viewId The ID of the view to get.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#get_view\n */\n getView = async ({ viewId, siteId }: { viewId: string; siteId: string }): Promise<View> => {\n return (await this._apiClient.getView({ params: { siteId, viewId }, ...this.authHeader })).view;\n };\n\n /**\n * Returns a specified view rendered as data in comma separated value (CSV) format.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_data\n */\n queryViewData = async ({\n viewId,\n siteId,\n }: {\n viewId: string;\n siteId: string;\n }): Promise<string> => {\n return await this._apiClient.queryViewData({\n params: { siteId, viewId },\n ...this.authHeader,\n });\n };\n\n /**\n * Returns an image of the specified view.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @param {number} width - (Optional) The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.\n * @param {number} height - (Optional) The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.\n * @param {string} resolution - (Optional) The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_image\n */\n queryViewImage = async ({\n viewId,\n siteId,\n width,\n height,\n resolution,\n }: {\n viewId: string;\n siteId: string;\n width?: number;\n height?: number;\n resolution?: 'high';\n }): Promise<string> => {\n return await this._apiClient.queryViewImage({\n params: { siteId, viewId },\n queries: { vizWidth: width, vizHeight: height, resolution },\n ...this.authHeader,\n responseType: 'arraybuffer',\n });\n };\n\n /**\n * Returns all the views for the specified workbook, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return views for.\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_workbook\n */\n queryViewsForWorkbook = async ({\n workbookId,\n siteId,\n includeUsageStatistics,\n }: {\n workbookId: string;\n siteId: string;\n includeUsageStatistics?: boolean;\n }): Promise<View[]> => {\n return (\n await this._apiClient.queryViewsForWorkbook({\n params: { siteId, workbookId },\n queries: { includeUsageStatistics },\n ...this.authHeader,\n })\n ).views.view;\n };\n\n /**\n * Returns all the views for the specified site, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @param {string} filter - (Optional) Fields and operators that you can use to filter results\n * @param {number} pageSize - (Optional) The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param {number} pageNumber - (Optional) The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_site\n */\n queryViewsForSite = async ({\n siteId,\n includeUsageStatistics,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n includeUsageStatistics?: boolean;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; views: View[] }> => {\n const response = await this._apiClient.queryViewsForSite({\n params: { siteId },\n queries: { includeUsageStatistics, filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n views: response.views.view ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { viewSchema } from '../types/view.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst getViewEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views/:viewId',\n alias: 'getView',\n description: 'Gets the details of a specific view.',\n response: z.object({ view: viewSchema }),\n});\n\nconst queryViewDataEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views/:viewId/data',\n alias: 'queryViewData',\n description: 'Returns a specified view rendered as data in comma separated value (CSV) format.',\n response: z.string(),\n});\n\nconst queryViewImageEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views/:viewId/image',\n alias: 'queryViewImage',\n description: 'Returns an image of the specified view.',\n parameters: [\n {\n name: 'vizWidth',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.',\n },\n {\n name: 'vizHeight',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.',\n },\n {\n name: 'resolution',\n type: 'Query',\n schema: z.literal('high').optional(),\n description:\n 'The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.',\n },\n ],\n response: z.string(),\n});\n\nconst queryViewsForWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/workbooks/:workbookId/views',\n alias: 'queryViewsForWorkbook',\n description:\n 'Returns all the views for the specified workbook, optionally including usage statistics.',\n parameters: [\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n ],\n response: z.object({ views: z.object({ view: z.array(viewSchema) }) }),\n});\n\nconst queryViewsForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views',\n alias: 'queryViewsForSite',\n description:\n 'Returns all the views for the specified site, optionally including usage statistics.',\n parameters: [\n ...paginationParameters,\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of views to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n views: z.object({ view: z.array(viewSchema).optional() }),\n }),\n});\n\nconst viewsApi = makeApi([\n getViewEndpoint,\n queryViewDataEndpoint,\n queryViewImageEndpoint,\n queryViewsForWorkbookEndpoint,\n queryViewsForSiteEndpoint,\n]);\n\nexport const viewsApis = [...viewsApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const viewSchema = z.object({\n id: z.string(),\n name: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n workbook: z\n .object({\n id: z.string(),\n })\n .optional(),\n owner: z\n .object({\n id: z.string(),\n })\n .optional(),\n project: z\n .object({\n id: z.string(),\n })\n .optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n usage: z\n .object({\n totalViewCount: z.coerce.number(),\n })\n .optional(),\n});\n\nexport type View = z.infer<typeof viewSchema>;\n", "import { isErrorFromAlias, Zodios, ZodiosError } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport {\n MetadataResponse,\n QueryOutput,\n QueryRequest,\n ReadMetadataRequest,\n TableauError,\n vizqlDataServiceApis,\n} from '../apis/vizqlDataServiceApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * The VizQL Data Service (VDS) provides a programmatic way for you to access your published data outside of a Tableau visualization.\n *\n * @export\n * @class VizqlDataServiceMethods\n * @extends {AuthenticatedMethods<typeof vizqlDataServiceApis>}\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/index.html\n */\nexport default class VizqlDataServiceMethods extends AuthenticatedMethods<\n typeof vizqlDataServiceApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, vizqlDataServiceApis), creds);\n }\n\n /**\n * Queries a specific data source and returns the resulting data.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {z.infer<typeof QueryRequest>} queryRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/QueryDatasource\n */\n queryDatasource = async (\n queryRequest: z.infer<typeof QueryRequest>,\n ): Promise<Result<QueryOutput, 'feature-disabled' | TableauError | ZodiosError>> => {\n try {\n return Ok(await this._apiClient.queryDatasource(queryRequest, { ...this.authHeader }));\n } catch (error) {\n if (isErrorFromAlias(this._apiClient.api, 'queryDatasource', error)) {\n if (error.response.status === 404) {\n return Err('feature-disabled');\n }\n\n return Err(error.response.data);\n }\n\n if (error instanceof ZodiosError) {\n return Err(error);\n }\n\n throw error;\n }\n };\n\n /**\n * Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {z.infer<typeof ReadMetadataRequest>} readMetadataRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/ReadMetadata\n */\n readMetadata = async (\n readMetadataRequest: z.infer<typeof ReadMetadataRequest>,\n ): Promise<Result<MetadataResponse, 'feature-disabled'>> => {\n try {\n return Ok(await this._apiClient.readMetadata(readMetadataRequest, { ...this.authHeader }));\n } catch (error) {\n if (\n isErrorFromAlias(this._apiClient.api, 'readMetadata', error) &&\n error.response.status === 404\n ) {\n return Err('feature-disabled');\n }\n\n throw error;\n }\n };\n}\n", "import { makeApi, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nconst Connection = z.object({\n connectionLuid: z.string().optional(),\n connectionUsername: z.string(),\n connectionPassword: z.string(),\n});\n\nexport const Datasource = z.object({\n datasourceLuid: z.string().nonempty(),\n connections: z.array(Connection).optional(),\n});\n\nconst ReturnFormat = z.enum(['OBJECTS', 'ARRAYS']);\n\nconst QueryOptions = z\n .object({\n returnFormat: ReturnFormat,\n debug: z.boolean().default(false),\n })\n .partial()\n .passthrough();\n\nexport const ReadMetadataRequest = z\n .object({\n datasource: Datasource,\n options: QueryOptions.optional(),\n })\n .passthrough();\n\nexport const Function = z.enum([\n 'SUM',\n 'AVG',\n 'MEDIAN',\n 'COUNT',\n 'COUNTD',\n 'MIN',\n 'MAX',\n 'STDEV',\n 'VAR',\n 'COLLECT',\n 'YEAR',\n 'QUARTER',\n 'MONTH',\n 'WEEK',\n 'DAY',\n 'TRUNC_YEAR',\n 'TRUNC_QUARTER',\n 'TRUNC_MONTH',\n 'TRUNC_WEEK',\n 'TRUNC_DAY',\n 'AGG',\n 'NONE',\n 'UNSPECIFIED',\n]);\n\nconst DataType = z.enum([\n 'INTEGER',\n 'REAL',\n 'STRING',\n 'DATETIME',\n 'BOOLEAN',\n 'DATE',\n 'SPATIAL',\n 'UNKNOWN',\n]);\n\nconst PeriodType = z.enum(['MINUTES', 'HOURS', 'DAYS', 'WEEKS', 'MONTHS', 'QUARTERS', 'YEARS']);\n\nconst FieldMetadata = z\n .object({\n fieldName: z.string(),\n fieldCaption: z.string(),\n dataType: DataType,\n defaultAggregation: Function,\n columnClass: z.enum(['COLUMN', 'BIN', 'GROUP', 'CALCULATION', 'TABLE_CALCULATION']),\n formula: z.string(),\n logicalTableId: z.string(),\n })\n .partial()\n .passthrough();\n\nconst ParameterValue = z.union([z.number(), z.string(), z.boolean(), z.null()]);\n\nconst ParameterBase = z.object({\n parameterCaption: z.string(),\n dataType: DataType.exclude(['DATETIME', 'SPATIAL', 'UNKNOWN']),\n parameterName: z.string().optional(),\n value: ParameterValue,\n});\n\nconst Parameter = z.discriminatedUnion('parameterType', [\n ParameterBase.extend({ parameterType: z.literal('ANY_VALUE') }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('LIST'),\n members: z.array(ParameterValue),\n }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('QUANTITATIVE_DATE'),\n value: z.string().nullable(),\n minDate: z.string().nullish(),\n maxDate: z.string().nullish(),\n periodValue: z.number().nullish(),\n periodType: PeriodType.nullish(),\n }).strict(),\n ParameterBase.extend({\n parameterType: z.literal('QUANTITATIVE_RANGE'),\n value: z.number().nullable(),\n min: z.number().nullish(),\n max: z.number().nullish(),\n step: z.number().nullish(),\n }).strict(),\n]);\n\nexport const MetadataOutput = z\n .object({\n data: z.array(FieldMetadata),\n extraData: z.object({\n parameters: z.array(Parameter),\n }),\n })\n .partial()\n .passthrough();\n\nexport type FieldMetadata = z.infer<typeof FieldMetadata>;\nexport type MetadataResponse = z.infer<typeof MetadataOutput>;\n\nexport const TableauError = z\n .object({\n errorCode: z.string(),\n message: z.string(),\n datetime: z.string().datetime({ offset: true }),\n debug: z.object({}).partial().passthrough(),\n 'tab-error-code': z.string(),\n })\n .partial()\n .passthrough();\n\nexport type TableauError = z.infer<typeof TableauError>;\n\nconst SortDirection = z.enum(['ASC', 'DESC']);\n\nconst FieldBase = z.object({\n fieldCaption: z.string(),\n fieldAlias: z.string().optional(),\n maxDecimalPlaces: z.number().int().optional(),\n sortDirection: SortDirection.optional(),\n sortPriority: z.number().int().optional(),\n});\n\nexport const Field = z.union([\n FieldBase.strict(),\n FieldBase.extend({ function: Function }).strict(),\n FieldBase.extend({ calculation: z.string() }).strict(),\n]);\n\nexport const FilterField = z.union([\n z.object({ fieldCaption: z.string() }).strict(),\n z.object({ fieldCaption: z.string(), function: Function }).strict(),\n z.object({ calculation: z.string() }).strict(),\n]);\n\nconst FilterBase = z.object({\n field: FilterField,\n context: z.boolean().optional(),\n});\n\nconst SimpleFilterBase = z.object({\n field: z.object({ fieldCaption: z.string() }).strict(),\n context: z.boolean().optional(),\n});\n\nexport const SetFilter = SimpleFilterBase.extend({\n filterType: z.literal('SET'),\n values: z.union([z.array(z.string()), z.array(z.number()), z.array(z.boolean())]),\n exclude: z.boolean().optional(),\n});\n\nconst RelativeDateFilterBase = SimpleFilterBase.extend({\n filterType: z.literal('DATE'),\n periodType: PeriodType,\n anchorDate: z.string().optional(),\n includeNulls: z.boolean().optional(),\n});\n\nconst RelativeDateFilter = z.discriminatedUnion('dateRangeType', [\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('CURRENT') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('LAST') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('NEXT') }).strict(),\n RelativeDateFilterBase.extend({ dateRangeType: z.literal('TODATE') }).strict(),\n RelativeDateFilterBase.extend({\n dateRangeType: z.literal('LASTN'),\n rangeN: z.number().int(),\n }).strict(),\n RelativeDateFilterBase.extend({\n dateRangeType: z.literal('NEXTN'),\n rangeN: z.number().int(),\n }).strict(),\n]);\n\nconst MatchFilterBase = SimpleFilterBase.extend({\n filterType: z.literal('MATCH'),\n startsWith: z.string().optional(),\n endsWith: z.string().optional(),\n contains: z.string().optional(),\n exclude: z.boolean().optional(),\n});\n\nexport const MatchFilter = z.union([\n MatchFilterBase.extend({ startsWith: z.string() }).strict(),\n MatchFilterBase.extend({ endsWith: z.string() }).strict(),\n MatchFilterBase.extend({ contains: z.string() }).strict(),\n]);\n\nconst QuantitativeNumericalFilterBase = FilterBase.extend({\n filterType: z.literal('QUANTITATIVE_NUMERICAL'),\n});\n\nconst QuantitativeNumericalFilter = z.discriminatedUnion('quantitativeFilterType', [\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('RANGE'),\n min: z.number(),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('MIN'),\n min: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('MAX'),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n }).strict(),\n QuantitativeNumericalFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n }).strict(),\n]);\n\nconst QuantitativeDateFilterBase = FilterBase.extend({\n filterType: z.literal('QUANTITATIVE_DATE'),\n});\n\nconst QuantitativeDateFilter = z.discriminatedUnion('quantitativeFilterType', [\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('RANGE'),\n minDate: z.string(),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('MIN'),\n minDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('MAX'),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n }).strict(),\n QuantitativeDateFilterBase.extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n }).strict(),\n]);\n\nexport const TopNFilter = FilterBase.extend({\n filterType: z.literal('TOP'),\n howMany: z.number().int(),\n fieldToMeasure: FilterField,\n direction: z.enum(['TOP', 'BOTTOM']).optional().default('TOP'),\n});\n\nexport const Filter = z.union([\n SetFilter.strict(),\n TopNFilter.strict(),\n ...MatchFilter.options,\n ...QuantitativeNumericalFilter.options,\n ...QuantitativeDateFilter.options,\n ...RelativeDateFilter.options,\n]);\n\nexport const Query = z.strictObject({\n fields: z.array(Field),\n filters: z.array(Filter).optional(),\n});\n\nconst QueryDatasourceOptions = QueryOptions.and(\n z\n .object({\n disaggregate: z.boolean(),\n })\n .partial()\n .passthrough(),\n);\n\nexport const QueryRequest = z\n .object({\n datasource: Datasource,\n query: Query,\n options: QueryDatasourceOptions.optional(),\n })\n .passthrough();\n\nexport const QueryOutput = z\n .object({\n data: z.array(z.unknown()),\n })\n .partial()\n .passthrough();\n\nexport type QueryOutput = z.infer<typeof QueryOutput>;\n\nconst vizqlDataServiceApi = makeApi([\n {\n method: 'post',\n path: '/query-datasource',\n alias: 'queryDatasource',\n description: 'Queries a specific data source and returns the resulting data.',\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: QueryRequest,\n },\n ],\n response: QueryOutput,\n errors: [\n {\n status: 'default',\n schema: TableauError,\n },\n {\n status: 404,\n schema: z.any(),\n },\n ],\n },\n {\n method: 'post',\n path: '/read-metadata',\n alias: 'readMetadata',\n description:\n 'Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.',\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: ReadMetadataRequest,\n },\n ],\n response: MetadataOutput,\n errors: [\n {\n status: 404,\n schema: z.any(),\n },\n ],\n },\n {\n method: 'get',\n path: '/simple-request',\n alias: 'simpleRequest',\n description: 'Sends a request that can be used for testing or doing a health check.',\n requestFormat: 'json',\n response: z.string(),\n },\n]);\n\nexport const vizqlDataServiceApis = [\n ...vizqlDataServiceApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\n\nimport { workbooksApis } from '../apis/workbooksApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { Workbook } from '../types/workbook.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Workbooks methods of the Tableau Server REST API\n *\n * @export\n * @class WorkbooksMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class WorkbooksMethods extends AuthenticatedMethods<typeof workbooksApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, workbooksApis), creds);\n }\n\n /**\n * Returns information about the specified workbook, including information about views and tags.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return information for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbook\n */\n getWorkbook = async ({\n workbookId,\n siteId,\n }: {\n workbookId: string;\n siteId: string;\n }): Promise<Workbook> => {\n return (\n await this._apiClient.getWorkbook({\n params: { siteId, workbookId },\n ...this.authHeader,\n })\n ).workbook;\n };\n\n /**\n * Returns the workbooks on a site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter workbooks by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbooks_for_site\n */\n queryWorkbooksForSite = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; workbooks: Workbook[] }> => {\n const response = await this._apiClient.queryWorkbooksForSite({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n workbooks: response.workbooks.workbook ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { workbookSchema } from '../types/workbook.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst getWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/workbooks/:workbookId',\n alias: 'getWorkbook',\n description:\n 'Returns information about the specified workbook, including information about views and tags.',\n response: z.object({ workbook: workbookSchema }),\n});\n\nconst queryWorkbooksForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/workbooks',\n alias: 'queryWorkbooksForSite',\n description: 'Returns the workbooks on a site.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of workbooks to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n workbooks: z.object({\n workbook: z.optional(z.array(workbookSchema)),\n }),\n }),\n});\n\nconst workbooksApi = makeApi([queryWorkbooksForSiteEndpoint, getWorkbookEndpoint]);\n\nexport const workbooksApis = [...workbooksApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\nimport { viewSchema } from './view.js';\n\nexport const workbookSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n webpageUrl: z.string().optional(),\n contentUrl: z.string(),\n project: projectSchema.optional(),\n showTabs: z.coerce.boolean(),\n defaultViewId: z.string().optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n views: z.optional(\n z.object({\n view: z.array(viewSchema),\n }),\n ),\n});\n\nexport type Workbook = z.infer<typeof workbookSchema>;\n", "import { AuthConfig } from './authConfig.js';\nimport {\n AxiosInterceptor,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n ResponseInterceptor,\n} from './interceptors.js';\nimport AuthenticationMethods, {\n AuthenticatedAuthenticationMethods,\n} from './methods/authenticationMethods.js';\nimport ContentExplorationMethods from './methods/contentExplorationMethods.js';\nimport DatasourcesMethods from './methods/datasourcesMethods.js';\nimport MetadataMethods from './methods/metadataMethods.js';\nimport PulseMethods from './methods/pulseMethods.js';\nimport ServerMethods from './methods/serverMethods.js';\nimport ViewsMethods from './methods/viewsMethods.js';\nimport VizqlDataServiceMethods from './methods/vizqlDataServiceMethods.js';\nimport WorkbooksMethods from './methods/workbooksMethods.js';\nimport { Credentials } from './types/credentials.js';\n\n/**\n * Interface for the Tableau REST APIs\n *\n * @export\n * @class RestApi\n */\nexport class RestApi {\n private _creds?: Credentials;\n private readonly _host: string;\n private readonly _baseUrl: string;\n private readonly _baseUrlWithoutVersion: string;\n\n private _authenticationMethods?: AuthenticationMethods;\n private _authenticatedAuthenticationMethods?: AuthenticatedAuthenticationMethods;\n private _contentExplorationMethods?: ContentExplorationMethods;\n private _datasourcesMethods?: DatasourcesMethods;\n private _metadataMethods?: MetadataMethods;\n private _pulseMethods?: PulseMethods;\n private _serverMethods?: ServerMethods;\n private _vizqlDataServiceMethods?: VizqlDataServiceMethods;\n private _viewsMethods?: ViewsMethods;\n private _workbooksMethods?: WorkbooksMethods;\n private static _version = '3.24';\n\n private _requestInterceptor?: [RequestInterceptor, ErrorInterceptor?];\n private _responseInterceptor?: [ResponseInterceptor, ErrorInterceptor?];\n\n constructor(\n host: string,\n options?: Partial<{\n requestInterceptor: [RequestInterceptor, ErrorInterceptor?];\n responseInterceptor: [ResponseInterceptor, ErrorInterceptor?];\n }>,\n ) {\n this._host = host;\n this._baseUrl = `${this._host}/api/${RestApi._version}`;\n this._baseUrlWithoutVersion = `${this._host}/api/-`;\n this._requestInterceptor = options?.requestInterceptor;\n this._responseInterceptor = options?.responseInterceptor;\n }\n\n private get creds(): Credentials {\n if (!this._creds) {\n throw new Error('No credentials found. Authenticate by calling signIn() first.');\n }\n\n return this._creds;\n }\n\n get siteId(): string {\n return this.creds.site.id;\n }\n\n private get authenticationMethods(): AuthenticationMethods {\n if (!this._authenticationMethods) {\n this._authenticationMethods = new AuthenticationMethods(this._baseUrl);\n this._addInterceptors(this._baseUrl, this._authenticationMethods.interceptors);\n }\n return this._authenticationMethods;\n }\n\n private get authenticatedAuthenticationMethods(): AuthenticatedAuthenticationMethods {\n if (!this._authenticatedAuthenticationMethods) {\n this._authenticatedAuthenticationMethods = new AuthenticatedAuthenticationMethods(\n this._baseUrl,\n this.creds,\n );\n this._addInterceptors(this._baseUrl, this._authenticatedAuthenticationMethods.interceptors);\n }\n return this._authenticatedAuthenticationMethods;\n }\n\n get contentExplorationMethods(): ContentExplorationMethods {\n if (!this._contentExplorationMethods) {\n this._contentExplorationMethods = new ContentExplorationMethods(\n this._baseUrlWithoutVersion,\n this.creds,\n );\n this._addInterceptors(\n this._baseUrlWithoutVersion,\n this._contentExplorationMethods.interceptors,\n );\n }\n\n return this._contentExplorationMethods;\n }\n\n get datasourcesMethods(): DatasourcesMethods {\n if (!this._datasourcesMethods) {\n this._datasourcesMethods = new DatasourcesMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._datasourcesMethods.interceptors);\n }\n\n return this._datasourcesMethods;\n }\n\n get metadataMethods(): MetadataMethods {\n if (!this._metadataMethods) {\n const baseUrl = `${this._host}/api/metadata`;\n this._metadataMethods = new MetadataMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._metadataMethods.interceptors);\n }\n\n return this._metadataMethods;\n }\n\n get pulseMethods(): PulseMethods {\n if (!this._pulseMethods) {\n this._pulseMethods = new PulseMethods(this._baseUrlWithoutVersion, this.creds);\n this._addInterceptors(this._baseUrlWithoutVersion, this._pulseMethods.interceptors);\n }\n\n return this._pulseMethods;\n }\n\n get serverMethods(): ServerMethods {\n if (!this._serverMethods) {\n this._serverMethods = new ServerMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._serverMethods.interceptors);\n }\n\n return this._serverMethods;\n }\n\n get vizqlDataServiceMethods(): VizqlDataServiceMethods {\n if (!this._vizqlDataServiceMethods) {\n const baseUrl = `${this._host}/api/v1/vizql-data-service`;\n this._vizqlDataServiceMethods = new VizqlDataServiceMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._vizqlDataServiceMethods.interceptors);\n }\n\n return this._vizqlDataServiceMethods;\n }\n\n get viewsMethods(): ViewsMethods {\n if (!this._viewsMethods) {\n this._viewsMethods = new ViewsMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._viewsMethods.interceptors);\n }\n\n return this._viewsMethods;\n }\n\n get workbooksMethods(): WorkbooksMethods {\n if (!this._workbooksMethods) {\n this._workbooksMethods = new WorkbooksMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._workbooksMethods.interceptors);\n }\n\n return this._workbooksMethods;\n }\n\n signIn = async (authConfig: AuthConfig): Promise<void> => {\n this._creds = await this.authenticationMethods.signIn(authConfig);\n };\n\n signOut = async (): Promise<void> => {\n await this.authenticatedAuthenticationMethods.signOut();\n this._creds = undefined;\n };\n\n setCredentials = (accessToken: string, userId: string): void => {\n const parts = accessToken.split('|');\n if (parts.length < 3) {\n throw new Error('Could not determine site ID. Access token must have 3 parts.');\n }\n\n const siteId = parts[2];\n this._creds = {\n site: {\n id: siteId,\n },\n user: {\n id: userId,\n },\n token: accessToken,\n };\n };\n\n private _addInterceptors = (baseUrl: string, interceptors: AxiosInterceptor): void => {\n interceptors.request.use(\n (config) => {\n this._requestInterceptor?.[0]({\n baseUrl,\n ...getRequestInterceptorConfig(config),\n });\n return config;\n },\n (error) => {\n this._requestInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n\n interceptors.response.use(\n (response) => {\n this._responseInterceptor?.[0]({\n baseUrl,\n ...getResponseInterceptorConfig(response),\n });\n return response;\n },\n (error) => {\n this._responseInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n };\n}\n", "import { RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Config, getConfig } from './config.js';\nimport { log, shouldLogWhenLevelIsAtLeast } from './logging/log.js';\nimport { maskRequest, maskResponse } from './logging/secretMask.js';\nimport {\n AxiosResponseInterceptorConfig,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n RequestInterceptorConfig,\n ResponseInterceptor,\n ResponseInterceptorConfig,\n} from './sdks/tableau/interceptors.js';\nimport { RestApi } from './sdks/tableau/restApi.js';\nimport { Server, userAgent } from './server.js';\nimport { TableauAuthInfo } from './server/oauth/schemas.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\nimport invariant from './utils/invariant.js';\nimport { isAxiosError } from './utils/isAxiosError.js';\n\ntype JwtScopes =\n | 'tableau:viz_data_service:read'\n | 'tableau:content:read'\n | 'tableau:insight_definitions_metrics:read'\n | 'tableau:insight_metrics:read'\n | 'tableau:metric_subscriptions:read'\n | 'tableau:insights:read'\n | 'tableau:views:download';\n\nconst getNewRestApiInstanceAsync = async (\n config: Config,\n requestId: RequestId,\n server: Server,\n jwtScopes: Set<JwtScopes>,\n authInfo?: TableauAuthInfo,\n): Promise<RestApi> => {\n const tableauServer = config.server || authInfo?.server;\n invariant(tableauServer, 'Tableau server could not be determined');\n\n const restApi = new RestApi(tableauServer, {\n requestInterceptor: [\n getRequestInterceptor(server, requestId),\n getRequestErrorInterceptor(server, requestId),\n ],\n responseInterceptor: [\n getResponseInterceptor(server, requestId),\n getResponseErrorInterceptor(server, requestId),\n ],\n });\n\n if (config.auth === 'pat') {\n await restApi.signIn({\n type: 'pat',\n patName: config.patName,\n patValue: config.patValue,\n siteName: config.siteName,\n });\n } else if (config.auth === 'direct-trust') {\n await restApi.signIn({\n type: 'direct-trust',\n siteName: config.siteName,\n username: getJwtSubClaim(config, authInfo),\n clientId: config.connectedAppClientId,\n secretId: config.connectedAppSecretId,\n secretValue: config.connectedAppSecretValue,\n scopes: jwtScopes,\n additionalPayload: getJwtAdditionalPayload(config, authInfo),\n });\n } else {\n if (!authInfo?.accessToken || !authInfo?.userId) {\n throw new Error('Auth info is required when not signing in first.');\n }\n\n restApi.setCredentials(authInfo.accessToken, authInfo.userId);\n }\n\n return restApi;\n};\n\nexport const useRestApi = async <T>({\n config,\n requestId,\n server,\n callback,\n jwtScopes,\n authInfo,\n}: {\n config: Config;\n requestId: RequestId;\n server: Server;\n jwtScopes: Array<JwtScopes>;\n callback: (restApi: RestApi) => Promise<T>;\n authInfo?: TableauAuthInfo;\n}): Promise<T> => {\n const restApi = await getNewRestApiInstanceAsync(\n config,\n requestId,\n server,\n new Set(jwtScopes),\n authInfo,\n );\n try {\n return await callback(restApi);\n } finally {\n if (config.auth !== 'oauth') {\n // Tableau REST sessions for 'pat' and 'direct-trust' are intentionally ephemeral.\n // Sessions for 'oauth' are not. Signing out would invalidate the session,\n // preventing the access token from being reused for subsequent requests.\n await restApi.signOut();\n }\n }\n};\n\nexport const getRequestInterceptor =\n (server: Server, requestId: RequestId): RequestInterceptor =>\n (request) => {\n request.headers['User-Agent'] = getUserAgent(server);\n logRequest(server, request, requestId);\n return request;\n };\n\nexport const getRequestErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.request) {\n log.error(server, `Request ${requestId} failed with error: ${getExceptionMessage(error)}`, {\n logger: 'rest-api',\n requestId,\n });\n return;\n }\n\n const { request } = error;\n logRequest(\n server,\n {\n baseUrl,\n ...getRequestInterceptorConfig(request),\n },\n requestId,\n );\n };\n\nexport const getResponseInterceptor =\n (server: Server, requestId: RequestId): ResponseInterceptor =>\n (response) => {\n logResponse(server, response, requestId);\n return response;\n };\n\nexport const getResponseErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.response) {\n log.error(\n server,\n `Response from request ${requestId} failed with error: ${getExceptionMessage(error)}`,\n { logger: 'rest-api', requestId },\n );\n return;\n }\n\n // The type for the AxiosResponse headers is complex and not directly assignable to that of the Axios response interceptor's.\n const { response } = error as { response: AxiosResponseInterceptorConfig };\n logResponse(\n server,\n {\n baseUrl,\n ...getResponseInterceptorConfig(response),\n },\n requestId,\n );\n };\n\nfunction logRequest(server: Server, request: RequestInterceptorConfig, requestId: RequestId): void {\n const config = getConfig();\n const maskedRequest = config.disableLogMasking ? request : maskRequest(request);\n const url = new URL(maskedRequest.url ?? '', maskedRequest.baseUrl);\n if (request.params && Object.keys(request.params).length > 0) {\n url.search = new URLSearchParams(request.params).toString();\n }\n\n const messageObj = {\n type: 'request',\n requestId,\n method: maskedRequest.method,\n url: url.toString(),\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedRequest.headers,\n data: maskedRequest.data,\n params: maskedRequest.params,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction logResponse(\n server: Server,\n response: ResponseInterceptorConfig,\n requestId: RequestId,\n): void {\n const config = getConfig();\n const maskedResponse = config.disableLogMasking ? response : maskResponse(response);\n const url = new URL(maskedResponse.url ?? '', maskedResponse.baseUrl);\n if (response.request?.params && Object.keys(response.request.params).length > 0) {\n url.search = new URLSearchParams(response.request.params).toString();\n }\n const messageObj = {\n type: 'response',\n requestId,\n url: url.toString(),\n status: maskedResponse.status,\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedResponse.headers,\n data: maskedResponse.data,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction getUserAgent(server: Server): string {\n const userAgentParts = [userAgent];\n if (server.clientInfo) {\n const { name, version } = server.clientInfo;\n if (name) {\n userAgentParts.push(version ? `(${name} ${version})` : `(${name})`);\n }\n }\n return userAgentParts.join(' ');\n}\n\nfunction getJwtSubClaim(config: Config, authInfo: TableauAuthInfo | undefined): string {\n return config.jwtSubClaim.replaceAll('{OAUTH_USERNAME}', authInfo?.username ?? '');\n}\n\nfunction getJwtAdditionalPayload(\n config: Config,\n authInfo: TableauAuthInfo | undefined,\n): Record<string, unknown> {\n const json = config.jwtAdditionalPayload.replaceAll('{OAUTH_USERNAME}', authInfo?.username ?? '');\n return JSON.parse(json || '{}');\n}\n", "import { z } from 'zod';\n\nimport { requiredString } from '../../utils/requiredString.js';\n\nexport const mcpAuthorizeSchema = z\n .object({\n client_id: requiredString('client_id'),\n redirect_uri: requiredString('redirect_uri'),\n response_type: requiredString('response_type'),\n code_challenge: requiredString('code_challenge'),\n code_challenge_method: requiredString('code_challenge_method'),\n state: z.string().optional(),\n })\n .transform((data) => ({\n clientId: data.client_id,\n redirectUri: data.redirect_uri,\n responseType: data.response_type,\n codeChallenge: data.code_challenge,\n codeChallengeMethod: data.code_challenge_method,\n state: data.state,\n }));\n\nexport const mcpTokenSchema = z\n .discriminatedUnion(\n 'grant_type',\n [\n z.object({\n grant_type: z.literal('authorization_code'),\n code: requiredString('code'),\n redirect_uri: requiredString('redirect_uri'),\n code_verifier: requiredString('code_verifier'),\n }),\n z.object({\n grant_type: z.literal('refresh_token'),\n refresh_token: requiredString('refresh_token'),\n }),\n z.object({\n grant_type: z.literal('client_credentials'),\n }),\n ],\n {\n errorMap: (issue, ctx) => ({\n message:\n issue.code === 'invalid_union_discriminator'\n ? `grant_type must be ${issue.options.map((opt) => `'${String(opt)}'`).join(' | ')}, got '${ctx.data.grant_type}'.`\n : ctx.defaultError,\n }),\n },\n )\n .and(\n z.object({\n // Optional because client/secret pair may be provided in the request body instead of the query string\n client_id: z.string().optional(),\n client_secret: z.string().optional(),\n }),\n )\n .transform((data) => {\n const { client_id, client_secret } = data;\n const clientIdSecretPair = {\n clientId: client_id,\n clientSecret: client_secret,\n };\n\n if (data.grant_type === 'authorization_code') {\n return {\n grantType: data.grant_type,\n code: data.code,\n redirectUri: data.redirect_uri,\n codeVerifier: data.code_verifier,\n ...clientIdSecretPair,\n };\n }\n\n if (data.grant_type === 'refresh_token') {\n return {\n grantType: data.grant_type,\n refreshToken: data.refresh_token,\n ...clientIdSecretPair,\n };\n }\n\n return {\n grantType: data.grant_type,\n ...clientIdSecretPair,\n };\n });\n\nexport const callbackSchema = z.object({\n code: z.string().optional(),\n state: z.string().optional(),\n error: z.string().optional(),\n});\n\nexport const mcpAccessTokenUserOnlySchema = z.object({\n iss: requiredString('iss'),\n aud: requiredString('aud'),\n exp: z.number().int().nonnegative(),\n sub: requiredString('sub'),\n clientId: requiredString('clientId'),\n tableauServer: requiredString('tableauServer'),\n // Optional because there may not be a user associated with the access token, e.g. for client credentials grant type\n tableauUserId: z.string().optional(),\n});\n\nexport const mcpAccessTokenSchema = mcpAccessTokenUserOnlySchema.extend({\n tableauAccessToken: requiredString('tableauAccessToken'),\n tableauRefreshToken: requiredString('tableauRefreshToken'),\n tableauExpiresAt: z.number().int().nonnegative(),\n // Required because it is always available when a user's Tableau access token is available\n tableauUserId: requiredString('tableauUserId'),\n});\n\nexport type McpAccessToken = z.infer<typeof mcpAccessTokenSchema>;\nexport type McpAccessTokenSubOnly = z.infer<typeof mcpAccessTokenUserOnlySchema>;\n\nexport const tableauAuthInfoSchema = z\n .object({\n username: z.string(),\n userId: z.string(),\n server: z.string(),\n accessToken: z.string(),\n refreshToken: z.string(),\n })\n .partial();\n\nexport type TableauAuthInfo = z.infer<typeof tableauAuthInfoSchema>;\n", "import { z } from 'zod';\n\nexport const requiredString = (property: string): z.ZodString =>\n z\n .string({ message: `${property} is required` })\n .nonempty({ message: `${property} must be non-empty` });\n", "import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\n\nimport { TableauAuthInfo, tableauAuthInfoSchema } from './schemas.js';\n\nexport const getTableauAuthInfo = (authInfo: AuthInfo | undefined): TableauAuthInfo | undefined => {\n if (!authInfo) {\n return;\n }\n\n const tableauAuthInfo = tableauAuthInfoSchema.safeParse(authInfo.extra);\n if (!tableauAuthInfo.success) {\n return;\n }\n\n return tableauAuthInfo.data;\n};\n", "import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { CallToolResult, RequestId, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Result } from 'ts-results-es';\nimport { z, ZodRawShape, ZodTypeAny } from 'zod';\nimport { fromError, isZodErrorLike } from 'zod-validation-error';\n\nimport { getToolLogMessage, log } from '../logging/log.js';\nimport { Server } from '../server.js';\nimport { tableauAuthInfoSchema } from '../server/oauth/schemas.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { Provider } from '../utils/provider.js';\nimport { ToolName } from './toolName.js';\n\ntype ArgsValidator<Args extends ZodRawShape | undefined = undefined> = Args extends ZodRawShape\n ? (args: z.objectOutputType<Args, ZodTypeAny>) => void\n : never;\n\ntype TypeOrProvider<T> = T | Provider<T>;\n\nexport type ConstrainedResult<T> =\n | {\n type: 'success';\n result: T;\n }\n | {\n type: 'empty';\n message: string;\n }\n | {\n type: 'error';\n message: string;\n };\n\n/**\n * The parameters for creating a tool instance\n *\n * @typeParam Args - The schema of the tool's parameters\n */\nexport type ToolParams<Args extends ZodRawShape | undefined = undefined> = {\n // The MCP server instance\n server: Server;\n\n // The name of the tool\n name: ToolName;\n\n // The description of the tool\n description: TypeOrProvider<string>;\n\n // The schema of the tool's parameters\n paramsSchema: TypeOrProvider<Args>;\n\n // The annotations of the tool\n annotations: TypeOrProvider<ToolAnnotations>;\n\n // A function that validates the tool's arguments provided by the client\n argsValidator?: TypeOrProvider<ArgsValidator<Args>>;\n\n // The implementation of the tool itself\n callback: TypeOrProvider<ToolCallback<Args>>;\n};\n\n/**\n * The parameters the logAndExecute method\n *\n * @typeParam T - The type of the result the tool's implementation returns\n * @typeParam E - The type of the error the tool's implementation can return\n * @typeParam Args - The schema of the tool's parameters\n */\ntype LogAndExecuteParams<T, E, Args extends ZodRawShape | undefined = undefined> = {\n // The request ID of the tool call\n requestId: RequestId;\n\n // The Authentication info provided when OAuth is enabled\n authInfo: AuthInfo | undefined;\n\n // The arguments of the tool call\n args: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;\n\n // A function that contains the business logic of the tool to be logged and executed\n callback: () => Promise<Result<T, E | ZodiosError>>;\n\n // A function that can transform a successful result of the callback into a CallToolResult\n getSuccessResult?: (result: T) => CallToolResult;\n\n // A function that can transform an error result of the callback into a string.\n // Required if the callback can return an error result.\n getErrorText?: (error: E) => string;\n\n // A function that constrains the success result of the tool\n constrainSuccessResult: (result: T) => ConstrainedResult<T> | Promise<ConstrainedResult<T>>;\n};\n\n/**\n * Represents an MCP tool\n *\n * @template Args - The schema of the tool's parameters or undefined if the tool has no parameters\n */\nexport class Tool<Args extends ZodRawShape | undefined = undefined> {\n server: Server;\n name: ToolName;\n description: string;\n paramsSchema: Args;\n annotations: ToolAnnotations;\n argsValidator?: ArgsValidator<Args>;\n callback: ToolCallback<Args>;\n\n constructor({\n server,\n name,\n description,\n paramsSchema,\n annotations,\n argsValidator,\n callback,\n }: ToolParams<Args>) {\n this.server = server;\n this.name = name;\n this.description = description instanceof Provider ? description.get() : description;\n this.paramsSchema = paramsSchema instanceof Provider ? paramsSchema.get() : paramsSchema;\n this.annotations = annotations instanceof Provider ? annotations.get() : annotations;\n this.argsValidator = argsValidator instanceof Provider ? argsValidator.get() : argsValidator;\n this.callback = callback instanceof Provider ? callback.get() : callback;\n }\n\n logInvocation({\n requestId,\n args,\n username,\n }: {\n requestId: RequestId;\n args: unknown;\n username?: string;\n }): void {\n log.debug(\n this.server,\n getToolLogMessage({\n requestId,\n toolName: this.name,\n args,\n username,\n }),\n );\n }\n\n // Overload for E = undefined (getErrorText omitted)\n async logAndExecute<T>(\n params: Omit<LogAndExecuteParams<T, undefined, Args>, 'getErrorText'>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getSuccessResult omitted)\n async logAndExecute<T, E>(\n params: Required<Omit<LogAndExecuteParams<T, E, Args>, 'getSuccessResult'>>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getErrorText required)\n async logAndExecute<T, E>(\n params: Required<LogAndExecuteParams<T, E, Args>>,\n ): Promise<CallToolResult>;\n\n // Implementation\n async logAndExecute<T, E>({\n requestId,\n args,\n authInfo,\n callback,\n getSuccessResult,\n getErrorText,\n constrainSuccessResult,\n }: LogAndExecuteParams<T, E, Args>): Promise<CallToolResult> {\n const username = authInfo?.extra\n ? tableauAuthInfoSchema.safeParse(authInfo.extra).data?.username\n : undefined;\n\n this.logInvocation({ requestId, args, username });\n\n if (args) {\n try {\n this.argsValidator?.(args);\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n\n try {\n const result = await callback();\n\n if (result.isOk()) {\n const constrainedResult = await constrainSuccessResult(result.value);\n\n if (constrainedResult.type !== 'success') {\n return {\n isError: constrainedResult.type === 'error',\n content: [{ type: 'text', text: constrainedResult.message }],\n };\n }\n\n if (getSuccessResult) {\n return getSuccessResult(constrainedResult.result);\n }\n\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify(constrainedResult.result),\n },\n ],\n };\n }\n\n if (result.error instanceof ZodiosError) {\n return getErrorResult(requestId, result.error);\n }\n\n if (getErrorText) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: getErrorText(result.error),\n },\n ],\n };\n } else {\n return getErrorResult(requestId, result.error);\n }\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n}\n\nfunction getErrorResult(requestId: RequestId, error: unknown): CallToolResult {\n if (error instanceof ZodiosError && isZodErrorLike(error.cause)) {\n // Schema validation errors on otherwise successful API calls will not return an \"error\" result to the MCP client.\n // We instead return the full response from the API with a data quality warning message\n // that mentions why the schema validation failed.\n // This should make it so users don't get \"stuck\" when our schemas are too strict or wrong.\n // The only con is that the full response from the API might be larger than normal\n // since a successful schema validation \"trims\" the response down to the shape of the schema.\n const validationError = fromError(error.cause);\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n data: error.data,\n warning: validationError.toString(),\n }),\n },\n ],\n };\n }\n\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `requestId: ${requestId}, error: ${getExceptionMessage(error)}`,\n },\n ],\n };\n}\n", "export class Provider<T> {\n private readonly _provider: () => T;\n\n constructor(provider: () => T) {\n this._provider = provider;\n }\n\n get(): T {\n return this._provider();\n }\n}\n", "import { BoundedContext } from '../../config.js';\nimport {\n OrderBy,\n SearchContentFilter,\n SearchContentResponse,\n} from '../../sdks/tableau/types/contentExploration.js';\nimport { ConstrainedResult } from '../tool.js';\n\nexport type ReducedSearchContentResponse = Partial<Record<SearchItemContent, unknown>>;\n\nexport function buildOrderByString(orderBy: OrderBy): string {\n const methodsUsed = new Set<string>();\n return orderBy\n .flatMap((ordering) => {\n if (methodsUsed.has(ordering.method)) {\n return []; // skip duplicate methods\n }\n methodsUsed.add(ordering.method);\n return ordering.method + (ordering.sortDirection ? `:${ordering.sortDirection}` : '');\n })\n .join(',');\n}\n\nexport function buildFilterString(filter: SearchContentFilter): string {\n const filterExpressions: Array<string> = [];\n if (filter.contentTypes) {\n if (filter.contentTypes.length === 1) {\n filterExpressions.push(`type:eq:${filter.contentTypes[0]}`);\n } else {\n const typesUsed = new Set<string>();\n for (const type of filter.contentTypes) {\n typesUsed.add(type);\n }\n filterExpressions.push(`type:in:[${Array.from(typesUsed).join(',')}]`);\n }\n }\n if (filter.ownerIds) {\n if (filter.ownerIds.length === 1) {\n filterExpressions.push(`ownerId:eq:${filter.ownerIds[0]}`);\n } else {\n const idsUsed = new Set<number>();\n for (const id of filter.ownerIds) {\n idsUsed.add(id);\n }\n filterExpressions.push(`ownerId:in:[${Array.from(idsUsed).join(',')}]`);\n }\n }\n if (filter.modifiedTime) {\n if (Array.isArray(filter.modifiedTime)) {\n if (filter.modifiedTime.length === 1) {\n filterExpressions.push(`modifiedTime:eq:${filter.modifiedTime[0]}`);\n } else {\n const modifiedTimesUsed = new Set<string>();\n for (const modifiedTime of filter.modifiedTime) {\n modifiedTimesUsed.add(modifiedTime);\n }\n filterExpressions.push(`modifiedTime:in:[${Array.from(modifiedTimesUsed).join(',')}]`);\n }\n } else if (filter.modifiedTime.startDate && filter.modifiedTime.endDate) {\n let startDate = filter.modifiedTime.startDate;\n let endDate = filter.modifiedTime.endDate;\n // if the client provides startDate and endDate in the wrong order, we swap them\n if (startDate > endDate) {\n startDate = filter.modifiedTime.endDate;\n endDate = filter.modifiedTime.startDate;\n }\n filterExpressions.push(`modifiedTime:gte:${startDate}`);\n filterExpressions.push(`modifiedTime:lte:${endDate}`);\n } else if (filter.modifiedTime.startDate) {\n filterExpressions.push(`modifiedTime:gte:${filter.modifiedTime.startDate}`);\n } else if (filter.modifiedTime.endDate) {\n filterExpressions.push(`modifiedTime:lte:${filter.modifiedTime.endDate}`);\n }\n }\n\n return filterExpressions.join(',');\n}\n\nexport function reduceSearchContentResponse(\n response: SearchContentResponse,\n): Array<ReducedSearchContentResponse> {\n let searchResults: Array<ReducedSearchContentResponse> = [];\n if (response.items) {\n for (const item of response.items) {\n searchResults.push(getReducedSearchItemContent(item.content));\n }\n }\n\n // Remove duplicate datasources with luid matching a unifieddatasource's datasourceLuid\n const unifiedDatasourceLuids = new Set(\n searchResults\n .filter((item) => item.type === 'unifieddatasource')\n .map((item) => item.datasourceLuid)\n .filter((datasourceLuid): datasourceLuid is string => typeof datasourceLuid === 'string'),\n );\n\n searchResults = searchResults.filter((item) => {\n if (item.type === 'datasource') {\n return typeof item.luid === 'string' && !unifiedDatasourceLuids.has(item.luid);\n }\n\n return true;\n });\n\n // Normalize unifieddatasource entries to datasource entries\n for (const item of searchResults) {\n if (item.type === 'unifieddatasource') {\n item.type = 'datasource';\n item.luid = item.datasourceLuid;\n delete item.datasourceLuid;\n }\n }\n\n return searchResults;\n}\n\ntype SearchItemContent =\n | 'caption'\n | 'comments'\n | 'connectedWorkbooksCount'\n | 'connectionType'\n | 'containerName'\n | 'datasourceIsPublished'\n | 'datasourceLuid'\n | 'downstreamWorkbookCount'\n | 'extractCreationPending'\n | 'extractRefreshedAt'\n | 'extractUpdatedAt'\n | 'favoritesTotal'\n | 'hasActiveDataQualityWarning'\n | 'hasExtracts'\n | 'hasSevereDataQualityWarning'\n | 'hitsSmallSpanTotal'\n | 'hitsTotal'\n | 'isCertified'\n | 'isConnectable'\n | 'locationName'\n | 'luid'\n | 'modifiedTime'\n | 'ownerId'\n | 'ownerName'\n | 'parentWorkbookName'\n | 'projectId'\n | 'projectName'\n | 'sheetType'\n | 'tags'\n | 'title'\n | 'totalViewCount'\n | 'viewCountLastMonth'\n | 'type'\n | 'workbookDescription';\n\nfunction getReducedSearchItemContent(\n content: Record<any, any>,\n): Partial<Record<SearchItemContent, unknown>> {\n const reducedContent: ReducedSearchContentResponse = {};\n if (content.modifiedTime) {\n reducedContent.modifiedTime = content.modifiedTime;\n }\n if (content.sheetType) {\n reducedContent.sheetType = content.sheetType;\n }\n if (content.caption) {\n reducedContent.caption = content.caption;\n }\n if (content.workbookDescription) {\n reducedContent.workbookDescription = content.workbookDescription;\n }\n if (content.type) {\n reducedContent.type = content.type;\n }\n if (content.ownerId) {\n reducedContent.ownerId = content.ownerId;\n }\n if (content.title) {\n reducedContent.title = content.title;\n }\n if (content.ownerName) {\n reducedContent.ownerName = content.ownerName;\n }\n if (content.containerName) {\n if (content.type === 'view') {\n reducedContent.parentWorkbookName = content.containerName;\n } else {\n reducedContent.containerName = content.containerName;\n }\n }\n if (content.luid) {\n reducedContent.luid = content.luid;\n }\n if (content.locationName) {\n reducedContent.locationName = content.locationName;\n }\n if (content.comments?.length) {\n reducedContent.comments = content.comments;\n }\n if (content.hitsTotal != undefined) {\n reducedContent.totalViewCount = content.hitsTotal;\n }\n if (content.favoritesTotal != undefined) {\n reducedContent.favoritesTotal = content.favoritesTotal;\n }\n if (content.tags?.length) {\n reducedContent.tags = content.tags;\n }\n if (content.projectId) {\n reducedContent.projectId = content.projectId;\n }\n if (content.projectName) {\n reducedContent.projectName = content.projectName;\n }\n if (content.hitsSmallSpanTotal != undefined) {\n reducedContent.viewCountLastMonth = content.hitsSmallSpanTotal;\n }\n if (content.downstreamWorkbookCount != undefined) {\n reducedContent.downstreamWorkbookCount = content.downstreamWorkbookCount;\n }\n if (content.isConnectable != undefined) {\n reducedContent.isConnectable = content.isConnectable;\n }\n if (content.datasourceIsPublished != undefined) {\n reducedContent.datasourceIsPublished = content.datasourceIsPublished;\n }\n if (content.connectionType) {\n reducedContent.connectionType = content.connectionType;\n }\n if (content.isCertified != undefined) {\n reducedContent.isCertified = content.isCertified;\n }\n if (content.hasExtracts != undefined) {\n reducedContent.hasExtracts = content.hasExtracts;\n }\n if (content.extractRefreshedAt) {\n reducedContent.extractRefreshedAt = content.extractRefreshedAt;\n }\n if (content.extractUpdatedAt) {\n reducedContent.extractUpdatedAt = content.extractUpdatedAt;\n }\n if (content.connectedWorkbooksCount != undefined) {\n reducedContent.connectedWorkbooksCount = content.connectedWorkbooksCount;\n }\n if (content.extractCreationPending != undefined) {\n reducedContent.extractCreationPending = content.extractCreationPending;\n }\n if (content.hasSevereDataQualityWarning != undefined) {\n reducedContent.hasSevereDataQualityWarning = content.hasSevereDataQualityWarning;\n }\n if (content.datasourceLuid) {\n reducedContent.datasourceLuid = content.datasourceLuid;\n }\n if (content.hasActiveDataQualityWarning != undefined) {\n reducedContent.hasActiveDataQualityWarning = content.hasActiveDataQualityWarning;\n }\n return reducedContent;\n}\n\nexport function constrainSearchContent({\n items,\n boundedContext,\n}: {\n items: Array<ReducedSearchContentResponse>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<ReducedSearchContentResponse>> {\n if (items.length === 0) {\n return {\n type: 'empty',\n message:\n 'No search results were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, datasourceIds, workbookIds } = boundedContext;\n\n if (projectIds) {\n items = items.filter((item) => {\n if (typeof item.projectId === 'number' && projectIds.has(item.projectId.toString())) {\n // \u26A0\uFE0F The Search API returns the project \"id\" (e.g. 861566)\n // but the Project REST APIs return the project \"LUID\" and there is no good way to look up one from the other.\n // Admins who want to use a project filter here will need to provide both the id and LUID in their bounded context.\n return true;\n }\n\n return false;\n });\n }\n\n if (datasourceIds) {\n items = items.filter((item) => {\n if (\n item.type === 'datasource' &&\n typeof item.luid === 'string' &&\n !datasourceIds.has(item.luid)\n ) {\n return false;\n }\n\n return true;\n });\n }\n\n if (workbookIds) {\n items = items.filter((item) => {\n if (\n item.type === 'workbook' &&\n typeof item.luid === 'string' &&\n !workbookIds.has(item.luid)\n ) {\n return false;\n }\n\n return true;\n });\n }\n\n if (items.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed content that can be queried is limited by the server configuration.',\n 'While search results were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: items,\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport {\n combineFields,\n FieldsResult,\n simplifyReadMetadataResult,\n} from './datasourceMetadataUtils.js';\n\nexport const getGraphqlQuery = (datasourceLuid: string): string => `\n query datasourceFieldInfo {\n publishedDatasources(filter: { luid: \"${datasourceLuid}\" }) {\n name\n description\n owner {\n name\n }\n fields {\n name\n isHidden\n description\n descriptionInherited {\n attribute\n value\n }\n fullyQualifiedName\n __typename\n ... on AnalyticsField {\n __typename\n }\n ... on ColumnField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n }\n ... on CalculatedField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n formula\n isAutoGenerated\n hasUserReference\n }\n ... on BinField {\n dataCategory\n role\n dataType\n formula\n binSize\n }\n ... on GroupField {\n dataCategory\n role\n dataType\n hasOther\n }\n ... on CombinedSetField {\n delimiter\n combinationType\n }\n }\n }\n }`;\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n};\n\nexport type GetDatasourceMetadataError =\n | {\n type: 'feature-disabled';\n }\n | {\n type: 'datasource-not-allowed';\n message: string;\n };\n\nexport const getGetDatasourceMetadataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getDatasourceMetadataTool = new Tool({\n server,\n name: 'get-datasource-metadata',\n description: `\n This tool retrieves field metadata for a specified datasource by taking the basic, high level, metadata results from Tableau's VizQL Data Service and enriches them with additional context provided by Tableau's Metadata API.\n The fields provided by this tool will contain properties such as name and dataType, but may also expose richer context such as descriptions, dataCategories, roles, etc.\n This tool should be used for getting the metadata to ground the use of a tool that queries Tableau published data sources.\n `,\n paramsSchema,\n annotations: {\n title: 'Get Datasource Metadata',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateDatasourceLuid,\n callback: async ({ datasourceLuid }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n const query = getGraphqlQuery(datasourceLuid);\n\n return await getDatasourceMetadataTool.logAndExecute<\n FieldsResult,\n GetDatasourceMetadataError\n >({\n requestId,\n authInfo,\n args: { datasourceLuid },\n callback: async () => {\n const isDatasourceAllowedResult = await resourceAccessChecker.isDatasourceAllowed({\n datasourceLuid,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isDatasourceAllowedResult.allowed) {\n return new Err({\n type: 'datasource-not-allowed',\n message: isDatasourceAllowedResult.message,\n });\n }\n\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read', 'tableau:viz_data_service:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n // Fetching metadata from VizQL Data Service API.\n const readMetadataResult = await restApi.vizqlDataServiceMethods.readMetadata({\n datasource: {\n datasourceLuid,\n },\n });\n\n if (readMetadataResult.isErr()) {\n return Err({ type: 'feature-disabled' });\n }\n\n if (config.disableMetadataApiRequests) {\n // Exit early since requests to the Tableau Metadata API are disabled.\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n let listFieldsResult: GraphQLResponse;\n\n try {\n // Fetching metadata from Tableau Metadata API.\n // Using try-catch here since requests could fail if the service is not enabled.\n listFieldsResult = await restApi.metadataMethods.graphql(query);\n } catch {\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n // Combine the results from the VizQL Data Service API and the Tableau Metadata API.\n return Ok(combineFields(readMetadataResult.value, listFieldsResult));\n },\n });\n },\n constrainSuccessResult: (fields) => {\n return {\n type: 'success',\n result: fields,\n };\n },\n getErrorText: (error: GetDatasourceMetadataError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n case 'datasource-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getDatasourceMetadataTool;\n};\n", "export function getVizqlDataServiceDisabledError(): string {\n return [\n 'The VizQL Data Service is disabled on this Tableau Server.',\n 'To enable it, use TSM using the instructions at https://help.tableau.com/current/server-linux/en-us/cli_configuration-set_tsm.htm#featuresvizqldataservicedeploywithtsm.',\n ].join(' ');\n}\n", "import { RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { BoundedContext, Config, getConfig } from '../config.js';\nimport { useRestApi } from '../restApiInstance.js';\nimport { Workbook } from '../sdks/tableau/types/workbook.js';\nimport { Server } from '../server.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\n\ntype AllowedResult<T = unknown> =\n | { allowed: true; content?: T }\n | { allowed: false; message: string };\n\nexport type RestApiArgs = {\n config: Config;\n requestId: RequestId;\n server: Server;\n};\n\nclass ResourceAccessChecker {\n private _allowedProjectIds: Set<string> | null | undefined;\n private _allowedDatasourceIds: Set<string> | null | undefined;\n private _allowedWorkbookIds: Set<string> | null | undefined;\n\n private readonly _cachedDatasourceIds: Map<string, AllowedResult>;\n private readonly _cachedWorkbookIds: Map<string, AllowedResult<Workbook>>;\n private readonly _cachedViewIds: Map<string, AllowedResult>;\n\n static create(): ResourceAccessChecker {\n return new ResourceAccessChecker();\n }\n\n static createForTesting(boundedContext: BoundedContext): ResourceAccessChecker {\n return new ResourceAccessChecker(boundedContext);\n }\n\n // Optional bounded context to use for testing.\n private constructor(boundedContext?: BoundedContext) {\n // The methods assume these sets are non-empty.\n this._allowedProjectIds = boundedContext?.projectIds;\n this._allowedDatasourceIds = boundedContext?.datasourceIds;\n this._allowedWorkbookIds = boundedContext?.workbookIds;\n\n this._cachedDatasourceIds = new Map();\n this._cachedWorkbookIds = new Map();\n this._cachedViewIds = new Map();\n }\n\n private get allowedProjectIds(): Set<string> | null {\n if (this._allowedProjectIds === undefined) {\n this._allowedProjectIds = getConfig().boundedContext.projectIds;\n }\n\n return this._allowedProjectIds;\n }\n\n private get allowedDatasourceIds(): Set<string> | null {\n if (this._allowedDatasourceIds === undefined) {\n this._allowedDatasourceIds = getConfig().boundedContext.datasourceIds;\n }\n\n return this._allowedDatasourceIds;\n }\n\n private get allowedWorkbookIds(): Set<string> | null {\n if (this._allowedWorkbookIds === undefined) {\n this._allowedWorkbookIds = getConfig().boundedContext.workbookIds;\n }\n\n return this._allowedWorkbookIds;\n }\n\n async isDatasourceAllowed({\n datasourceLuid,\n restApiArgs,\n }: {\n datasourceLuid: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const result = await this._isDatasourceAllowed({\n datasourceLuid,\n restApiArgs,\n });\n\n if (!this.allowedProjectIds) {\n // If project filtering is enabled, we cannot cache the result since the datasource may be moved between projects.\n this._cachedDatasourceIds.set(datasourceLuid, result);\n }\n\n return result;\n }\n\n async isWorkbookAllowed({\n workbookId,\n restApiArgs,\n }: {\n workbookId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult<Workbook>> {\n const result = await this._isWorkbookAllowed({\n workbookId,\n restApiArgs,\n });\n\n if (!this.allowedProjectIds) {\n // If project filtering is enabled, we cannot cache the result since the workbook may be moved between projects.\n this._cachedWorkbookIds.set(workbookId, result);\n }\n\n return result;\n }\n\n async isViewAllowed({\n viewId,\n restApiArgs,\n }: {\n viewId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const result = await this._isViewAllowed({\n viewId,\n restApiArgs,\n });\n\n if (!this.allowedProjectIds) {\n // If project filtering is enabled, we cannot cache the result since the workbook containing the view may be moved between projects.\n this._cachedViewIds.set(viewId, result);\n }\n\n return result;\n }\n\n private async _isDatasourceAllowed({\n datasourceLuid,\n restApiArgs: { config, requestId, server },\n }: {\n datasourceLuid: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const cachedResult = this._cachedDatasourceIds.get(datasourceLuid);\n if (cachedResult) {\n return cachedResult;\n }\n\n if (this.allowedDatasourceIds && !this.allowedDatasourceIds.has(datasourceLuid)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n `Querying the datasource with LUID ${datasourceLuid} is not allowed.`,\n ].join(' '),\n };\n }\n\n if (this.allowedProjectIds) {\n try {\n const datasourceProjectId = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const datasource = await restApi.datasourcesMethods.queryDatasource({\n siteId: restApi.siteId,\n datasourceId: datasourceLuid,\n });\n\n return datasource.project.id;\n },\n });\n\n if (!this.allowedProjectIds.has(datasourceProjectId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n `The datasource with LUID ${datasourceLuid} cannot be queried because it does not belong to an allowed project.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n `An error occurred while checking if the datasource with LUID ${datasourceLuid} is in an allowed project:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n return { allowed: true };\n }\n\n private async _isWorkbookAllowed({\n workbookId,\n restApiArgs: { config, requestId, server },\n }: {\n workbookId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult<Workbook>> {\n const cachedResult = this._cachedWorkbookIds.get(workbookId);\n if (cachedResult) {\n return cachedResult;\n }\n\n if (this.allowedWorkbookIds && !this.allowedWorkbookIds.has(workbookId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `Querying the workbook with LUID ${workbookId} is not allowed.`,\n ].join(' '),\n };\n }\n\n let workbook: Workbook | undefined;\n if (this.allowedProjectIds) {\n try {\n workbook = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbook = await restApi.workbooksMethods.getWorkbook({\n siteId: restApi.siteId,\n workbookId,\n });\n\n return workbook;\n },\n });\n\n if (!this.allowedProjectIds.has(workbook.project?.id ?? '')) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `The workbook with LUID ${workbookId} cannot be queried because it does not belong to an allowed project.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `An error occurred while checking if the workbook with LUID ${workbookId} is in an allowed project:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n return { allowed: true, content: workbook };\n }\n\n private async _isViewAllowed({\n viewId,\n restApiArgs: { config, requestId, server },\n }: {\n viewId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const cachedResult = this._cachedViewIds.get(viewId);\n if (cachedResult) {\n return cachedResult;\n }\n\n let viewWorkbookId = '';\n let viewProjectId = '';\n\n if (this.allowedWorkbookIds) {\n try {\n const view = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n return await restApi.viewsMethods.getView({\n siteId: restApi.siteId,\n viewId,\n });\n },\n });\n\n viewWorkbookId = view.workbook?.id ?? '';\n viewProjectId = view.project?.id ?? '';\n\n if (!this.allowedWorkbookIds.has(viewWorkbookId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `The view with LUID ${viewId} cannot be queried because it does not belong to an allowed workbook.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `An error occurred while checking if the workbook containing the view with LUID ${viewId} is in an allowed workbook:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n if (this.allowedProjectIds) {\n try {\n viewProjectId =\n viewProjectId ||\n (await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const view = await restApi.viewsMethods.getView({\n siteId: restApi.siteId,\n viewId,\n });\n\n return view.project?.id ?? '';\n },\n }));\n\n if (!this.allowedProjectIds.has(viewProjectId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed views that can be queried is limited by the server configuration.',\n `The view with LUID ${viewId} cannot be queried because it does not belong to an allowed project.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed views that can be queried is limited by the server configuration.',\n `An error occurred while checking if the workbook containing the view with LUID ${viewId} is in an allowed project:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n return { allowed: true };\n }\n}\n\nlet resourceAccessChecker = ResourceAccessChecker.create();\nconst exportedForTesting = {\n createResourceAccessChecker: ResourceAccessChecker.createForTesting,\n resetResourceAccessCheckerSingleton: () => {\n resourceAccessChecker = ResourceAccessChecker.create();\n },\n};\n\nexport { exportedForTesting, resourceAccessChecker };\n", "export function validateDatasourceLuid({ datasourceLuid }: { datasourceLuid: string }): void {\n if (!datasourceLuid) {\n throw new Error('datasourceLuid must be a non-empty string.');\n }\n}\n", "import { z } from 'zod';\n\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { MetadataResponse } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\nexport const fieldSchema = z\n .object({\n name: z.string(),\n columnClass: z.string(),\n dataType: z.string().nullable(),\n defaultAggregation: z.string().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(z.object({ attribute: z.string(), value: z.string().nullable() }).nullable())\n .nullable(),\n dataCategory: z.string().nullable(),\n role: z.string().nullable(),\n defaultFormat: z.string().nullable(),\n semanticRole: z.string().nullable(),\n aggregation: z.string().nullable(),\n aggregationParam: z.string().nullable(),\n formula: z.string().nullable(),\n isAutoGenerated: z.boolean().nullable(),\n hasUserReference: z.boolean().nullable(),\n binSize: z.number().nullable(),\n })\n .partial();\n\nexport const parameterSchema = z\n .object({\n name: z.string(),\n parameterType: z.string(),\n dataType: z.string().nullable(),\n value: z.union([z.number(), z.string(), z.boolean(), z.null()]),\n members: z.array(z.union([z.number(), z.string(), z.boolean(), z.null()])),\n min: z.number().nullable(),\n max: z.number().nullable(),\n step: z.number().nullable(),\n minDate: z.string().nullable(),\n maxDate: z.string().nullable(),\n periodValue: z.number().nullable(),\n periodType: z.string().nullable(),\n })\n .partial();\n\nexport const fieldsResultSchema = z.object({\n fields: z.array(fieldSchema),\n parameters: z.array(parameterSchema),\n});\n\ntype Parameter = z.infer<typeof parameterSchema>;\ntype Field = z.infer<typeof fieldSchema>;\nexport type FieldsResult = z.infer<typeof fieldsResultSchema>;\n\nexport function simplifyReadMetadataResult(readMetadataResult: MetadataResponse): FieldsResult {\n const simplifiedResponse: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n return simplifiedResponse;\n }\n\n // This is a simplified response that attempts to reduce tokens by\n // only including essential fields and renaming properties.\n for (const field of readMetadataResult.data) {\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n simplifiedResponse.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n simplifiedResponse.parameters.push(toPush);\n }\n }\n\n return simplifiedResponse;\n}\n\nexport function combineFields(\n readMetadataResult: MetadataResponse,\n listFieldsResult: GraphQLResponse,\n): FieldsResult {\n // Create a response object that combines field data from\n // readMetadata (VizQL Data Service API) and listFields (GraphQL Metadata API) results\n // to optimize for LLM accuracy and reduce tokens in response.\n const combinedFields: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n if (listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n // fallback to returning listFields results if we don't have any fields from readMetadata.\n for (const field of listFieldsResult.data.publishedDatasources[0].fields) {\n const toPush: Field = { name: field.name };\n if (field.dataType) {\n toPush.dataType = field.dataType;\n }\n if (field.aggregation) {\n toPush.defaultAggregation = field.aggregation;\n }\n populateFieldWithAdditionalProperties(field, toPush);\n combinedFields.fields.push(toPush);\n }\n }\n\n return combinedFields;\n }\n\n // Only include fields from readMetadata results in our response object since only those can be used in queries.\n for (const field of readMetadataResult.data) {\n // only keeping essential field properties.\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n combinedFields.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n combinedFields.parameters.push(toPush);\n }\n }\n\n if (!listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n return combinedFields;\n }\n\n // Of the fields in our response object, populate them with additional properties we get from listFields results.\n for (const field of combinedFields.fields) {\n const matchingListField = listFieldsResult.data.publishedDatasources[0].fields.find(\n (f) => f.name === field.name,\n );\n if (matchingListField) {\n populateFieldWithAdditionalProperties(matchingListField, field);\n }\n }\n\n return combinedFields;\n}\n\nfunction populateFieldWithAdditionalProperties(sourceField: Field, targetField: Field): void {\n if (sourceField.description) {\n targetField.description = sourceField.description;\n }\n if (sourceField.descriptionInherited?.length) {\n targetField.descriptionInherited = sourceField.descriptionInherited;\n }\n if (sourceField.dataCategory) {\n targetField.dataCategory = sourceField.dataCategory;\n }\n if (sourceField.role) {\n targetField.role = sourceField.role;\n }\n if (sourceField.defaultFormat) {\n targetField.defaultFormat = sourceField.defaultFormat;\n }\n if (sourceField.formula) {\n targetField.formula = sourceField.formula;\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.isAutoGenerated != undefined) {\n targetField.isAutoGenerated = sourceField.isAutoGenerated;\n }\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.hasUserReference != undefined) {\n targetField.hasUserReference = sourceField.hasUserReference;\n }\n }\n // Possibly null or undefined, only populate if defined.\n if (sourceField.binSize != undefined) {\n targetField.binSize = sourceField.binSize;\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { BoundedContext, getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { DataSource } from '../../sdks/tableau/types/dataSource.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { ConstrainedResult, Tool } from '../tool.js';\nimport { parseAndValidateDatasourcesFilterString } from './datasourcesFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListDatasourcesTool = (server: Server): Tool<typeof paramsSchema> => {\n const listDatasourcesTool = new Tool({\n server,\n name: 'list-datasources',\n description: `\n Retrieves a list of published data sources from a specified Tableau site using the Tableau REST API. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Views) for precise and flexible data source discovery. Use this tool when a user requests to list, search, or filter Tableau data sources on a site.\n \n **Supported Filter Fields and Operators**\n | Field | Operators |\n |------------------------|-------------------------------------------|\n | authenticationType | eq, in |\n | connectedWorkbookType | eq, gt, gte, lt, lte |\n | connectionTo | eq, in |\n | connectionType | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | databaseName | eq, in |\n | databaseUserName | eq, in |\n | description | eq, in |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlert | eq |\n | hasEmbeddedPassword | eq |\n | hasExtracts | eq |\n | isCertified | eq |\n | isConnectable | eq |\n | isDefaultPort | eq |\n | isHierarchical | eq |\n | isPublished | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq |\n | ownerName | eq, in |\n | projectName* | eq, in |\n | serverName | eq, in |\n | serverPort | eq |\n | size | eq, gt, gte, lt, lte |\n | tableName | eq, in |\n | tags | eq, in |\n | type | eq |\n | updatedAt | eq, gt, gte, lt, lte |\n \n ${genericFilterDescription}\n \n **Example Usage:**\n - List all data sources on a site\n - List data sources with the name \"Project Views\":\n filter: \"name:eq:Project Views\"\n - List data sources in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List data sources created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List data sources with the name \"Project Views\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Project Views,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"\n `,\n paramsSchema,\n annotations: {\n title: 'List Datasources',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { filter, pageSize, limit },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateDatasourcesFilterString(filter) : undefined;\n return await listDatasourcesTool.logAndExecute({\n requestId,\n authInfo,\n args: { filter, pageSize, limit },\n callback: async () => {\n const datasources = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const datasources = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, datasources: data } =\n await restApi.datasourcesMethods.listDatasources({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return datasources;\n },\n });\n\n return new Ok(datasources);\n },\n constrainSuccessResult: (datasources) =>\n constrainDatasources({ datasources, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return listDatasourcesTool;\n};\n\nexport function constrainDatasources({\n datasources,\n boundedContext,\n}: {\n datasources: Array<DataSource>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<DataSource>> {\n if (datasources.length === 0) {\n return {\n type: 'empty',\n message:\n 'No datasources were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, datasourceIds } = boundedContext;\n if (projectIds) {\n datasources = datasources.filter((datasource) => projectIds.has(datasource.project.id));\n }\n\n if (datasourceIds) {\n datasources = datasources.filter((datasource) => datasourceIds.has(datasource.id));\n }\n\n if (datasources.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n 'While data sources were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: datasources,\n };\n}\n", "import { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { PulseResult } from '../sdks/tableau/methods/pulseMethods.js';\nimport { Pagination, PulsePagination } from '../sdks/tableau/types/pagination.js';\n\nconst pageConfigSchema = z\n .object({\n pageSize: z.coerce.number().gt(0),\n pageNumber: z.coerce.number().gt(0),\n limit: z.coerce.number().gt(0),\n })\n .partial();\n\ntype PageConfig = z.infer<typeof pageConfigSchema>;\n\ntype PaginateArgs<T> = {\n pageConfig: PageConfig;\n getDataFn: (pagination: PageConfig) => Promise<{ pagination: Pagination; data: Array<T> }>;\n};\n\nexport async function paginate<T>({ pageConfig, getDataFn }: PaginateArgs<T>): Promise<Array<T>> {\n const { pageSize, limit } = pageConfigSchema.parse(pageConfig);\n const { pagination, data } = await getDataFn(pageConfig);\n const result = [...data];\n\n let { totalAvailable, pageNumber } = pagination;\n while (totalAvailable > result.length && (!limit || limit > result.length)) {\n const { pagination: nextPagination, data: nextData } = await getDataFn({\n pageSize,\n pageNumber: pageNumber + 1,\n limit,\n });\n\n if (nextData.length === 0) {\n throw new Error(\n `No more data available. Last fetched page number: ${pageNumber}, Total available: ${totalAvailable}, Total fetched: ${result.length}`,\n );\n }\n\n ({ totalAvailable, pageNumber } = nextPagination);\n result.push(...nextData);\n }\n\n if (limit && limit < result.length) {\n result.length = limit;\n }\n\n return result;\n}\n\nconst pulsePaginateConfigSchema = z\n .object({\n limit: z.coerce.number().gt(0).optional(),\n pageSize: z.coerce.number().gt(0).optional(),\n })\n .optional();\n\ntype PulsePaginateConfig = z.infer<typeof pulsePaginateConfigSchema>;\n\ntype PulsePaginateArgs<T> = {\n config: PulsePaginateConfig;\n getDataFn: (\n pageToken?: string,\n pageSize?: number,\n ) => Promise<PulseResult<{ pagination: PulsePagination; data: Array<T> }>>;\n};\n\nexport async function pulsePaginate<T>({\n config,\n getDataFn,\n}: PulsePaginateArgs<T>): Promise<PulseResult<Array<T>>> {\n const validatedConfig = pulsePaginateConfigSchema.parse(config);\n const limit = validatedConfig?.limit;\n let pageSize = validatedConfig?.pageSize;\n\n const result = await getDataFn(undefined, pageSize);\n if (result.isErr()) {\n return result;\n }\n const { pagination, data } = result.value;\n const resultArray = [...data];\n const total_available = pagination.total_available;\n\n let next_page_token = pagination.next_page_token;\n\n // If pageSize is not provided, set it to the minimum of the total available data and the remaining limit\n if (!pageSize && total_available) {\n pageSize = Math.min(\n total_available - resultArray.length,\n limit ? limit - resultArray.length : Number.MAX_SAFE_INTEGER,\n );\n }\n\n while (next_page_token && (!limit || limit > resultArray.length)) {\n const result = await getDataFn(next_page_token, pageSize);\n if (result.isErr()) {\n return result;\n }\n const { pagination: nextPagination, data: nextData } = result.value;\n\n if (nextData.length === 0) {\n throw new Error(`No more data available. Total fetched: ${resultArray.length}`);\n }\n\n ({ next_page_token } = nextPagination);\n resultArray.push(...nextData);\n }\n\n if (limit && limit < resultArray.length) {\n resultArray.length = limit;\n }\n\n return new Ok(resultArray);\n}\n", "export const genericFilterDescription = `**Supported Operators**\n - \\`eq\\`: equals\n - \\`gt\\`: greater than\n - \\`gte\\`: greater than or equal\n - \\`in\\`: any of [list] (for searching tags)\n - \\`lt\\`: less than\n - \\`lte\\`: less than or equal\n \n **Filter Expression Notes**\n - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded.\n - Operators are delimited with colons (:). For example: \\`filter=name:eq:Project Views\\`\n - Field names, operator names, and values are case-sensitive.\n - To filter on multiple fields, combine expressions using a comma: \\`filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher\\`\n - Multiple expressions are combined using a logical AND.\n - If you include the same field multiple times, only the last reference is used.\n - For date-time values, use ISO 8601 format (e.g., \\`2016-05-04T21:24:49Z\\`).\n - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions:\n - Starts with: \\`?filter=name:eq:mark*\\`\n - Ends with: \\`?filter=name:eq:*-ample\\`\n - Contains: \\`?filter=name:eq:mark*ex*\\``;\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\n// === Field and Operator Definitions ===\n// [Tableau REST API Data Sources filter fields](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_filtering_and_sorting.htm#datasources)\n\nconst FilterFieldSchema = z.enum([\n 'authenticationType',\n 'connectedWorkbookType',\n 'connectionTo',\n 'connectionType',\n 'contentUrl',\n 'createdAt',\n 'databaseName',\n 'databaseUserName',\n 'description',\n 'favoritesTotal',\n 'hasAlert',\n 'hasEmbeddedPassword',\n 'hasExtracts',\n 'isCertified',\n 'isConnectable',\n 'isDefaultPort',\n 'isHierarchical',\n 'isPublished',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'serverName',\n 'serverPort',\n 'size',\n 'tableName',\n 'tags',\n 'type',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n authenticationType: ['eq', 'in'],\n connectedWorkbookType: ['eq', 'gt', 'gte', 'lt', 'lte'],\n connectionTo: ['eq', 'in'],\n connectionType: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n databaseName: ['eq', 'in'],\n databaseUserName: ['eq', 'in'],\n description: ['eq', 'in'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlert: ['eq'],\n hasEmbeddedPassword: ['eq'],\n hasExtracts: ['eq'],\n isCertified: ['eq'],\n isConnectable: ['eq'],\n isDefaultPort: ['eq'],\n isHierarchical: ['eq'],\n isPublished: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n serverName: ['eq', 'in'],\n serverPort: ['eq'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tableName: ['eq', 'in'],\n tags: ['eq', 'in'],\n type: ['eq'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateDatasourcesFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import z from 'zod';\n\nexport const FilterOperatorSchema = z.enum(['eq', 'in', 'gt', 'gte', 'lt', 'lte']);\nexport type FilterOperator = z.infer<typeof FilterOperatorSchema>;\n\nexport function isISO8601DateTime(value: string): boolean {\n // Basic ISO 8601 regex (covers most common cases)\n // Example: 2016-05-04T21:24:49Z\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/.test(value);\n}\n\nconst dateTimeFields = ['createdAt', 'updatedAt'];\n\n/**\n * Parses and validates a Tableau-style filter string\n * @param filterString e.g. 'name:eq:Project Views,type:eq:Workbook'\n * @param allowedOperatorsByField - A map of filter fields to allowed operators\n * @param filterFieldSchema - A schema for the filter field\n * @returns validated filter string\n * @throws ZodError or custom error for invalid operators\n */\nexport function parseAndValidateFilterString<\n TFilterField extends string,\n TFilterExpression extends { field: TFilterField; operator: FilterOperator; value: string } = {\n field: TFilterField;\n operator: FilterOperator;\n value: string;\n },\n>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema,\n}: {\n filterString: string;\n allowedOperatorsByField: Record<TFilterField, FilterOperator[]>;\n filterFieldSchema: z.ZodSchema<TFilterField>;\n}): string {\n function isOperatorAllowed(field: TFilterField, operator: FilterOperator): boolean {\n const allowed = allowedOperatorsByField[field];\n return allowed.includes(operator);\n }\n\n const expressions = filterString\n .split(',')\n .map((f) => f.trim())\n .filter(Boolean);\n\n const parsedFilters: Record<string, TFilterExpression> = {};\n\n for (const expr of expressions) {\n const [fieldRaw, operatorRaw, ...valueParts] = expr.split(':');\n if (!fieldRaw || !operatorRaw || valueParts.length === 0) {\n throw new Error(`Invalid filter expression format: \"${expr}\"`);\n }\n\n const value = valueParts.join(':');\n\n const field = filterFieldSchema.parse(fieldRaw);\n const operator = FilterOperatorSchema.parse(operatorRaw);\n\n if (!isOperatorAllowed(field, operator)) {\n throw new Error(\n `Operator '${operator}' is not allowed for field '${field}'. Allowed operators: ${allowedOperatorsByField[field].join(', ')}`,\n );\n }\n\n // Validate ISO 8601 for date-time fields\n if (dateTimeFields.includes(field) && !isISO8601DateTime(value)) {\n throw new Error(\n `Value for field '${field}' must be a valid ISO 8601 date-time string (e.g., 2016-05-04T21:24:49Z)`,\n );\n }\n\n parsedFilters[field] = { field, operator, value } as TFilterExpression;\n }\n\n // Reconstruct the filter string from validated filters\n return Object.values(parsedFilters)\n .map((f) => `${f.field}:${f.operator}:${f.value}`)\n .join(',');\n}\n\nexport const exportedForTesting = {\n FilterOperatorSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err } from 'ts-results-es';\nimport z from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { PulseDisabledError } from '../../../sdks/tableau/methods/pulseMethods.js';\nimport {\n pulseBundleRequestSchema,\n PulseBundleResponse,\n pulseInsightBundleTypeEnum,\n} from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n bundleRequest: pulseBundleRequestSchema,\n bundleType: z.optional(z.enum(pulseInsightBundleTypeEnum)),\n};\n\nexport type GeneratePulseMetricValueInsightBundleError =\n | {\n type: 'feature-disabled';\n reason: PulseDisabledError;\n }\n | {\n type: 'datasource-not-allowed';\n message: string;\n };\n\nexport const getGeneratePulseMetricValueInsightBundleTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const generatePulseMetricValueInsightBundleTool = new Tool({\n server,\n name: 'generate-pulse-metric-value-insight-bundle',\n description: `\nGenerate an insight bundle for the current aggregated value for Pulse Metric using Tableau REST API. You need the full information of the Pulse Metric and Pulse Metric Definition to use this tool.\n\n**Parameters:**\n- \\`bundleRequest\\` (required): The request to generate a bundle for. Most of the information comes from data returned from other tools that retrieve Pulse Metric and Pulse Metric Definition information. When creating the bundleRequest, you will need to set options using the following values:\n - output_format: 'OUTPUT_FORMAT_HTML'\n - time_zone: 'UTC'\n - language: 'LANGUAGE_EN_US'\n - locale: 'LOCALE_EN_US'\n- \\`bundleType\\` (optional): The type of bundle to generate. The default is 'ban'.\n - 'ban' - Return a basic insight bundle with the current aggregated value for the Pulse Metric, period over period change, and the highest ranked insight for each filterable dimension of the metric.\n - 'springboard' - Return a springboard insight bundle with the current value, period over period change, and the highest ranked insight for the metric.\n - 'basic' - Similar to a springboard insight, but data is focused on the dimensions of a metric that are low bandwidth because they have small value sets. It shows the current value, period over period change, and the highest ranked insight for the metric for that data.\n - 'detail' - Shows insights on performance over time of the metric, a summary visualization of metric highs and lows and trends, breakdowns of top contributors for each filterable dimension of the metric, and followup insights based on the top ranked insights not already presented.\n\n**Example Usage:**\n- Generate the default insight bundle for the Pulse metric:\n bundleRequest: {\n bundle_request: {\n version: 1,\n options: {\n output_format: 'OUTPUT_FORMAT_HTML',\n time_zone: 'UTC',\n language: 'LANGUAGE_EN_US',\n locale: 'LOCALE_EN_US',\n },\n input: {\n metadata: {\n name: 'Pulse Metric',\n metric_id: 'CF32DDCC-362B-4869-9487-37DA4D152552',\n definition_id: 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3',\n },\n metric: {\n definition: {\n datasource: {\n id: 'A6FC3C9F-4F40-4906-8DB0-AC70C5FB5A11',\n },\n basic_specification: {\n measure: {\n field: 'Sales',\n aggregation: 'AGGREGATION_SUM', \n },\n time_dimension: {\n field: 'Order Date',\n },\n filters: [],\n },\n is_running_total: false,\n },\n metric_specification: {\n filters: [],\n measurement_period: {\n granularity: 'GRANULARITY_BY_QUARTER',\n range: 'RANGE_LAST_COMPLETE',\n },\n comparison: {\n comparison: 'TIME_COMPARISON_PREVIOUS_PERIOD',\n },\n },\n extension_options: {\n allowed_dimensions: [],\n allowed_granularities: [],\n offset_from_today: 0,\n },\n representation_options: {\n type: 'NUMBER_FORMAT_TYPE_NUMBER',\n number_units: {\n singular_noun: 'unit',\n plural_noun: 'units',\n },\n row_level_id_field: {\n identifier_col: 'Order ID',\n identifier_label: '',\n },\n row_level_entity_names: {\n entity_name_singular: 'Order',\n },\n row_level_name_field: {\n name_col: 'Order Name',\n },\n currency_code: 'CURRENCY_CODE_USD',\n },\n insights_options: {\n show_insights: true,\n settings: [],\n },\n goals: {\n target: {\n value: 100,\n },\n },\n },\n },\n },\n },\n- Generate the ban insight bundle for the Pulse metric:\n bundleType: 'ban',\n bundleRequest: (See default example above)\n- Generate the springboard insight bundle for the Pulse metric:\n bundleType: 'springboard',\n bundleRequest: (See default example above)\n- Generate the basic insight bundle for the Pulse metric:\n bundleType: 'basic',\n bundleRequest: (See default example above)\n- Generate the detail insight bundle for the Pulse metric:\n bundleType: 'detail',\n bundleRequest: (See default example above)\n`,\n paramsSchema,\n annotations: {\n title: 'Generate Pulse Metric Value Insight Bundle',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { bundleRequest, bundleType },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await generatePulseMetricValueInsightBundleTool.logAndExecute<\n PulseBundleResponse,\n GeneratePulseMetricValueInsightBundleError\n >({\n requestId,\n authInfo,\n args: { bundleRequest, bundleType },\n callback: async () => {\n const { datasourceIds } = config.boundedContext;\n if (datasourceIds) {\n const datasourceLuid =\n bundleRequest.bundle_request.input.metric.definition.datasource.id;\n\n if (!datasourceIds.has(datasourceLuid)) {\n return new Err({\n type: 'datasource-not-allowed',\n message: [\n 'The set of allowed metric insights that can be queried is limited by the server configuration.',\n 'Generating the Pulse Metric Value Insight Bundle is not allowed because the definition is derived',\n `from the data source with LUID ${datasourceLuid}, which is not in the allowed set of data sources.`,\n ].join(' '),\n });\n }\n }\n\n const result = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insights:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) =>\n await restApi.pulseMethods.generatePulseMetricValueInsightBundle(\n bundleRequest,\n bundleType ?? 'ban',\n ),\n });\n\n if (result.isErr()) {\n return new Err({\n type: 'feature-disabled',\n reason: result.error,\n });\n }\n\n return result;\n },\n constrainSuccessResult: (insightBundle) => {\n return {\n type: 'success',\n result: insightBundle,\n };\n },\n getErrorText: (error) => {\n switch (error.type) {\n case 'feature-disabled':\n return getPulseDisabledError(error.reason);\n case 'datasource-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return generatePulseMetricValueInsightBundleTool;\n};\n", "import { PulseDisabledError } from '../../sdks/tableau/methods/pulseMethods.js';\n\nexport function getPulseDisabledError(reason: PulseDisabledError): string {\n switch (reason) {\n case 'tableau-server':\n return [\n 'Pulse is not available on Tableau Server.',\n 'Consider disabling the Pulse MCP tools in your client or removing them using the EXCLUDE_TOOLS environment variable.',\n 'To enable Pulse on your Tableau Cloud site, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n case 'pulse-disabled':\n return [\n 'Pulse is disabled on this Tableau Cloud site.',\n 'To enable Pulse, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport {\n PulseMetricDefinition,\n pulseMetricDefinitionViewEnum,\n} from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { pulsePaginate } from '../../../utils/paginate.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseDefinitions } from '../constrainPulseDefinitions.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n limit: z.coerce.number().gt(0).optional(),\n pageSize: z.coerce.number().gt(0).optional(),\n};\n\nexport const getListAllPulseMetricDefinitionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listAllPulseMetricDefinitionsTool = new Tool({\n server,\n name: 'list-all-pulse-metric-definitions',\n description: `\nRetrieves a list of all published Pulse Metric Definitions using the Tableau REST API. Use this tool when a user requests to list all Tableau Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n- \\`limit\\` (optional): Maximum number of metric definitions to return. If not specified, all definitions are returned.\n- \\`pageSize\\` (optional): Number of results per page. Controls how many definitions are fetched in each API request during pagination.\n\n**Example Usage:**\n- List all Pulse Metric Definitions on the current site\n- List all Pulse Metric Definitions on the current site with the default view:\n view: 'DEFINITION_VIEW_DEFAULT'\n- List the first 50 Pulse Metric Definitions:\n limit: 50\n- List all Pulse Metric Definitions on the current site with the full view:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List all Pulse Metric Definitions on the current site with the basic view:\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for my Pulse Metric Definitions:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List All Pulse Metric Definitions',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { view, limit, pageSize },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await listAllPulseMetricDefinitionsTool.logAndExecute({\n requestId,\n authInfo,\n args: { view, limit, pageSize },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const definitions = await pulsePaginate({\n config: {\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n pageSize,\n },\n getDataFn: async (pageToken, pageSize) => {\n const apiResult = await restApi.pulseMethods.listAllPulseMetricDefinitions(\n view,\n pageToken,\n pageSize,\n );\n\n if (apiResult.isOk()) {\n return new Ok({\n pagination: apiResult.value.pagination,\n data: apiResult.value.definitions,\n });\n }\n\n return apiResult;\n },\n });\n return definitions;\n },\n });\n },\n constrainSuccessResult: (definitions: Array<PulseMetricDefinition>) =>\n constrainPulseDefinitions({ definitions, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listAllPulseMetricDefinitionsTool;\n};\n", "import { BoundedContext } from '../../config.js';\nimport { PulseMetricDefinition } from '../../sdks/tableau/types/pulse.js';\nimport { ConstrainedResult } from '../tool.js';\n\nexport function constrainPulseDefinitions({\n boundedContext,\n definitions,\n}: {\n boundedContext: BoundedContext;\n definitions: Array<PulseMetricDefinition>;\n}): ConstrainedResult<Array<PulseMetricDefinition>> {\n if (definitions.length === 0) {\n return {\n type: 'empty',\n message:\n 'No Pulse Metric Definitions were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { datasourceIds } = boundedContext;\n\n if (datasourceIds) {\n definitions = definitions.filter((definition) =>\n datasourceIds.has(definition.specification.datasource.id),\n );\n }\n\n if (definitions.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed Pulse Metric Definitions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Definitions were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: definitions,\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { pulseMetricDefinitionViewEnum } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseDefinitions } from '../constrainPulseDefinitions.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricDefinitionIds: z.array(z.string().length(36)).min(1),\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n};\n\nexport const getListPulseMetricDefinitionsFromDefinitionIdsTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricDefinitionsFromDefinitionIdsTool = new Tool({\n server,\n name: 'list-pulse-metric-definitions-from-definition-ids',\n description: `\nRetrieves a list of specific Pulse Metric Definitions using the Tableau REST API from a list of metric definition IDs. Use this tool when a user requests information about specific Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`metricDefinitionIds\\` (required): A list of metric definition IDs to retrieve.\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n\n**Example Usage:**\n- Can you show me details about Pulse Metric Definition with id 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3'\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3']\n- List Pulse Metric Definitions from a list of metric definition IDs:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4']\n- List these Pulse Metric Definitions with the default view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_DEFAULT'\n- List these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL',\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List these Pulse Metric Definitions with the basic view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Definitions from Metric Definition IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { view, metricDefinitionIds },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricDefinitionsFromDefinitionIdsTool.logAndExecute({\n requestId,\n authInfo,\n args: { metricDefinitionIds, view },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricDefinitionsFromMetricDefinitionIds(\n metricDefinitionIds,\n view,\n );\n },\n });\n },\n constrainSuccessResult: (definitions) =>\n constrainPulseDefinitions({ definitions, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricDefinitionsFromDefinitionIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { PulseDisabledError } from '../../../sdks/tableau/methods/pulseMethods.js';\nimport { PulseMetric } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseMetrics } from '../constrainPulseMetrics.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n pulseMetricDefinitionID: z.string().length(36),\n};\n\nexport const getListPulseMetricsFromMetricDefinitionIdTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricDefinitionIdTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-definition-id',\n description: `\nRetrieves a list of published Pulse Metrics from a Pulse Metric Definition using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a specific Pulse Metric Definition on the current site.\n\n**Parameters:**\n- \\`pulseMetricDefinitionID\\` (required): The ID of the Pulse Metric Definition to list metrics for. It should be the ID of the Pulse Metric Definition, not the name. Example: BBC908D8-29ED-48AB-A78E-ACF8A424C8C3\n\n**Example Usage:**\n- List all Pulse Metrics for this Pulse Metric Definition\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric Definition ID',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { pulseMetricDefinitionID },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricDefinitionIdTool.logAndExecute<\n Array<PulseMetric>,\n PulseDisabledError\n >({\n requestId,\n authInfo,\n args: { pulseMetricDefinitionID },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricDefinitionId(\n pulseMetricDefinitionID,\n );\n },\n });\n },\n constrainSuccessResult: (metrics) =>\n constrainPulseMetrics({ metrics, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricDefinitionIdTool;\n};\n", "import { BoundedContext } from '../../config.js';\nimport { PulseMetric } from '../../sdks/tableau/types/pulse.js';\nimport { ConstrainedResult } from '../tool.js';\n\nexport function constrainPulseMetrics({\n metrics,\n boundedContext,\n}: {\n boundedContext: BoundedContext;\n metrics: Array<PulseMetric>;\n}): ConstrainedResult<Array<PulseMetric>> {\n if (metrics.length === 0) {\n return {\n type: 'empty',\n message:\n 'No Pulse Metrics were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { datasourceIds } = boundedContext;\n\n if (datasourceIds) {\n metrics = metrics.filter((metric) => datasourceIds.has(metric.datasource_luid));\n }\n\n if (metrics.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed Pulse Metrics that can be queried is limited by the server configuration.',\n 'While Pulse Metrics were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: metrics,\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseMetrics } from '../constrainPulseMetrics.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricIds: z.array(z.string().length(36)),\n};\n\nexport const getListPulseMetricsFromMetricIdsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricIdsTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-ids',\n description: `\nRetrieves a list of published Pulse Metrics from a list of metric IDs using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a list of metric IDs on the current site.\n\n**Parameters:**\n- \\`metricIds\\` (required): The list of Pulse Metric IDs to list metrics for. It should be the list of metric IDs, not the names or metric definition ids. Example: ['CF32DDCC-362B-4869-9487-37DA4D152552', 'CF32DDCC-362B-4869-9487-37DA4D152553']\n - For data in a Pulse Metric Subscription, use the metric_id field.\n\n**Example Usage:**\n- List all Pulse Metrics from a list of Pulse Metric IDs\n\n**Note:**\n- This tool is recommended for use with data in Pulse Metric Subscriptions.\n- 00000000-0000-0000-0000-000000000000 is not a valid datasource id.\n- If you need a valid datasource id, you may need to retrieve the Pulse Metric Definition for the Pulse Metric which should have a valid datasource information.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ metricIds }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricIdsTool.logAndExecute({\n requestId,\n authInfo,\n args: { metricIds },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricIds(metricIds);\n },\n });\n },\n constrainSuccessResult: (metrics) =>\n constrainPulseMetrics({ metrics, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nimport { BoundedContext, getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { PulseMetricSubscription } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { getExceptionMessage } from '../../../utils/getExceptionMessage.js';\nimport { RestApiArgs } from '../../resourceAccessChecker.js';\nimport { ConstrainedResult, Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {};\n\nexport const getListPulseMetricSubscriptionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricSubscriptionsTool = new Tool({\n server,\n name: 'list-pulse-metric-subscriptions',\n description: `\nRetrieves a list of published Pulse Metric Subscriptions for the current user using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metric Subscriptions for the current user.\n\n**Example Usage:** \n- List all Pulse Metric Subscriptions for the current user on the current site\n- List all of my Pulse Metric Subscriptions\n\n**Note:**\n- This tool does not directly provide information about Pulse Metric Definitions. If you need to know information about Pulse Metric Defintiions associated with your subscriptions you need to:\n 1. Retrieve Pulse Metrics from the metric ids returned in the Pulse Metric Subscriptions.\n 2. Retrieve Pulse Metric Definitions from the metric definition id returned in the Pulse Metrics.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Subscriptions for Current User',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (_, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricSubscriptionsTool.logAndExecute({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:metric_subscriptions:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricSubscriptionsForCurrentUser();\n },\n });\n },\n constrainSuccessResult: async (subscriptions) => {\n return await constrainPulseMetricSubscriptions({\n subscriptions,\n boundedContext: config.boundedContext,\n restApiArgs: { config, requestId, server },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricSubscriptionsTool;\n};\n\nexport async function constrainPulseMetricSubscriptions({\n subscriptions,\n boundedContext,\n restApiArgs,\n}: {\n subscriptions: Array<PulseMetricSubscription>;\n boundedContext: BoundedContext;\n restApiArgs: RestApiArgs;\n}): Promise<ConstrainedResult<Array<PulseMetricSubscription>>> {\n if (subscriptions.length === 0) {\n return {\n type: 'empty',\n message:\n 'No Pulse Metric Subscriptions were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { datasourceIds } = boundedContext;\n\n if (!datasourceIds) {\n // No datasource IDs to filter by, return all subscriptions.\n return {\n type: 'success',\n result: subscriptions,\n };\n }\n\n const { config, requestId, server } = restApiArgs;\n try {\n const metricsResult = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricIds(\n subscriptions.map((subscription) => subscription.metric_id),\n );\n },\n });\n\n if (metricsResult.isErr()) {\n return {\n type: 'error',\n message: [\n 'The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.',\n getExceptionMessage(metricsResult.error),\n ].join(' '),\n };\n }\n\n const allowedMetricIds = new Set(\n metricsResult.value\n .filter((metric) => datasourceIds.has(metric.datasource_luid))\n .map((metric) => metric.id),\n );\n\n subscriptions = subscriptions.filter((subscription) =>\n allowedMetricIds.has(subscription.metric_id),\n );\n\n if (subscriptions.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Subscriptions were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: subscriptions,\n };\n } catch (error) {\n return {\n type: 'error',\n message: [\n 'The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.',\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Err } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n Datasource,\n Query,\n QueryOutput,\n TableauError,\n} from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\nimport { getDatasourceCredentials } from './datasourceCredentials.js';\nimport { handleQueryDatasourceError } from './queryDatasourceErrorHandler.js';\nimport { validateQuery } from './queryDatasourceValidator.js';\nimport { queryDatasourceToolDescription } from './queryDescription.js';\nimport { validateFilterValues } from './validators/validateFilterValues.js';\n\ntype Datasource = z.infer<typeof Datasource>;\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n query: Query,\n};\n\nexport type QueryDatasourceError =\n | {\n type: 'feature-disabled';\n }\n | {\n type: 'datasource-not-allowed';\n message: string;\n }\n | {\n type: 'filter-validation';\n message: string;\n }\n | {\n type: 'tableau-error';\n error: z.infer<typeof TableauError>;\n };\n\nexport const getQueryDatasourceTool = (server: Server): Tool<typeof paramsSchema> => {\n const queryDatasourceTool = new Tool({\n server,\n name: 'query-datasource',\n description: queryDatasourceToolDescription,\n paramsSchema,\n annotations: {\n title: 'Query Datasource',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateQuery,\n callback: async (\n { datasourceLuid, query },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await queryDatasourceTool.logAndExecute<QueryOutput, QueryDatasourceError>({\n requestId,\n authInfo,\n args: { datasourceLuid, query },\n callback: async () => {\n const isDatasourceAllowedResult = await resourceAccessChecker.isDatasourceAllowed({\n datasourceLuid,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isDatasourceAllowedResult.allowed) {\n return new Err({\n type: 'datasource-not-allowed',\n message: isDatasourceAllowedResult.message,\n });\n }\n\n const datasource: Datasource = { datasourceLuid };\n const options = {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n } as const;\n\n const credentials = getDatasourceCredentials(datasourceLuid);\n if (credentials) {\n datasource.connections = credentials;\n }\n\n const queryRequest = {\n datasource,\n query,\n options,\n };\n\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:viz_data_service:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n if (!config.disableQueryDatasourceFilterValidation) {\n // Validate filters values for SET and MATCH filters\n const filterValidationResult = await validateFilterValues(\n server,\n query,\n restApi.vizqlDataServiceMethods,\n datasource,\n );\n\n if (filterValidationResult.isErr()) {\n const errors = filterValidationResult.error;\n const errorMessage = errors.map((error) => error.message).join(', ');\n return new Err({\n type: 'filter-validation',\n message: errorMessage,\n });\n }\n }\n\n const result = await restApi.vizqlDataServiceMethods.queryDatasource(queryRequest);\n if (result.isErr()) {\n return new Err(\n result.error instanceof ZodiosError\n ? result.error\n : result.error === 'feature-disabled'\n ? { type: 'feature-disabled' }\n : {\n type: 'tableau-error',\n error: result.error,\n },\n );\n }\n return result;\n },\n });\n },\n constrainSuccessResult: (queryOutput) => {\n return {\n type: 'success',\n result: queryOutput,\n };\n },\n getErrorText: (error: QueryDatasourceError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n case 'datasource-not-allowed':\n return error.message;\n case 'filter-validation':\n return JSON.stringify({\n requestId,\n errorType: 'validation',\n message: error.message,\n });\n case 'tableau-error':\n return JSON.stringify({\n requestId,\n ...handleQueryDatasourceError(error.error),\n });\n }\n },\n });\n },\n });\n\n return queryDatasourceTool;\n};\n", "import { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\n\nconst schema = z.record(\n z.string().nonempty(),\n z.array(\n z\n .object({ luid: z.string().optional(), u: z.string().nonempty(), p: z.string().nonempty() })\n .transform(({ luid, u, p }) => ({\n connectionLuid: luid,\n connectionUsername: u,\n connectionPassword: p,\n })),\n ),\n);\n\ntype Connection = {\n connectionLuid: string | undefined;\n connectionUsername: string;\n connectionPassword: string;\n};\n\nlet credentialMap: Map<string, Array<Connection>> | undefined;\nlet initialized = false;\n\nexport const getDatasourceCredentials = (datasourceLuid: string): Array<Connection> | undefined => {\n if (!initialized) {\n initialized = true;\n\n const { datasourceCredentials } = getConfig();\n if (!datasourceCredentials) {\n return;\n }\n\n let obj: any;\n try {\n obj = JSON.parse(datasourceCredentials);\n } catch (e) {\n throw new Error(\n `Invalid datasource credentials format. Could not parse JSON string: ${datasourceCredentials}`,\n { cause: e },\n );\n }\n\n const parsed = schema.parse(obj);\n credentialMap = new Map(Object.entries(parsed));\n }\n\n return credentialMap?.get(datasourceLuid);\n};\n\nexport const exportedForTesting = {\n resetDatasourceCredentials: () => {\n initialized = false;\n credentialMap = undefined;\n },\n};\n", "/* v8 ignore start -- Exhaustive tests have limited value for this file */\n\nimport { TableauError } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\ntype TableauErrorDetail = TableauError & Partial<{ condition: string; details: string }>;\n\n/**\n * Adds additional context to the VizQl Data Service errors.\n *\n * @param {TableauError} error - The error object\n * @returns {*} {TableauErrorDetail} - The error object with additional context\n * @see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_error_codes.html\n */\nexport function handleQueryDatasourceError(error: TableauError): TableauErrorDetail {\n const errorDetail: TableauErrorDetail = {\n ...error,\n };\n\n switch (error.errorCode) {\n case '400000':\n errorDetail.condition = 'Bad request';\n errorDetail.details =\n 'The content of the request body is invalid. Check for missing or incomplete JSON.';\n break;\n case '400800':\n errorDetail.condition = 'Invalid formula for calculation';\n errorDetail.details =\n 'Invalid custom calculation syntax. For help, see https://help.tableau.com/current/pro/desktop/en-us/functions_operators.htm';\n break;\n case '400802':\n errorDetail.condition = 'Invalid API request';\n errorDetail.details = \"The incoming request isn't valid per the OpenAPI specification.\";\n break;\n case '400803':\n errorDetail.condition = 'Validation failed';\n errorDetail.details = \"The incoming request isn't valid per the validation rules.\";\n break;\n case '400804':\n errorDetail.condition = 'Response too large';\n errorDetail.details =\n 'The response value exceeds the limit. You must apply a filter in your request.';\n break;\n case '401001':\n errorDetail.condition = 'Login error';\n errorDetail.details = 'The login failed for the given user.';\n break;\n case '401002':\n errorDetail.condition = 'Invalid authorization credentials';\n errorDetail.details = 'The provided auth token is formatted incorrectly.';\n break;\n case '403157':\n errorDetail.condition = 'Feature disabled';\n errorDetail.details = 'The feature is disabled.';\n break;\n case '403800':\n errorDetail.condition = 'API access permission denied';\n errorDetail.details =\n \"The user doesn't have API Access granted on the given data source. Set the API Access capability for the given data source to Allowed. For help, see https://help.tableau.com/current/online/en-us/permissions_capabilities.htm\";\n break;\n case '404934':\n errorDetail.condition = 'Unknown field';\n errorDetail.details = \"The requested field doesn't exist.\";\n break;\n case '404950':\n errorDetail.condition = 'API endpoint not found';\n errorDetail.details = \"The request endpoint doesn't exist.\";\n break;\n case '408000':\n errorDetail.condition = 'Request timeout';\n errorDetail.details = 'The request timed out.';\n break;\n case '409000':\n errorDetail.condition = 'User already on site';\n errorDetail.details = 'HTTP status conflict.';\n break;\n case '429000':\n errorDetail.condition = 'Too many requests';\n errorDetail.details =\n 'Too many requests in the allotted amount of time. For help, see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_limitations.html#licensing-and-data-transfer';\n break;\n case '500000':\n errorDetail.condition = 'Internal server error';\n errorDetail.details = 'The request could not be completed.';\n break;\n case '500810':\n errorDetail.condition = 'VDS empty table response';\n errorDetail.details = 'The underlying data engine returned empty data value response.';\n break;\n case '500811':\n errorDetail.condition = 'VDS missing table';\n errorDetail.details =\n 'The underlying data engine returned empty metadata associated with response.';\n break;\n case '500812':\n errorDetail.condition = 'Error while processing an error';\n errorDetail.details = 'Internal processing error.';\n break;\n case '501000':\n errorDetail.condition = 'Not implemented';\n errorDetail.details = \"Can't find response from upstream server.\";\n break;\n case '503800':\n errorDetail.condition = 'VDS unavailable';\n errorDetail.details = 'The underlying data engine is unavailable.';\n break;\n case '503801':\n errorDetail.condition = 'VDS discovery error';\n errorDetail.details = \"The upstream service can't be found.\";\n break;\n case '504000':\n errorDetail.condition = 'Gateway timeout';\n errorDetail.details = 'The upstream service response timed out.';\n break;\n }\n\n return errorDetail;\n}\n/* v8 ignore stop */\n", "import { FilterField, Query } from '../queryDatasourceValidator.js';\n\ntype Fields = Query['fields'];\ntype Field = Fields[number];\n\nexport function validateFields(fields: Fields): void {\n {\n // You must query at least one field.\n if (fields.length === 0) {\n throw new Error(\n 'The query must include at least one field. The fields property cannot be an empty array.',\n );\n }\n }\n\n {\n // Field caption must be a non-empty string.\n if (fields.some(hasEmptyFieldCaption)) {\n throw new Error('The query must not include any fields with an empty fieldCaption.');\n }\n }\n\n {\n // You can't have duplicate sort priorities.\n const sortPriorities = fields.reduce<Record<number, Array<string>>>((acc, field) => {\n if (field.sortPriority === undefined) {\n return acc;\n }\n\n if (!acc[field.sortPriority]) {\n acc[field.sortPriority] = [];\n }\n\n acc[field.sortPriority].push(field.fieldCaption);\n return acc;\n }, {});\n\n const duplicateSortPriorities = Object.entries(sortPriorities).filter(\n ([_, fields]) => fields.length > 1,\n );\n\n if (duplicateSortPriorities.length > 0) {\n const duplicateSortPrioritiesArr = duplicateSortPriorities.reduce<Array<string>>(\n (acc, [priority, fields]) => {\n acc.push(\n `${fields.map((field) => `\"${field}\"`).join(', ')} with a sort priority of ${priority}`,\n );\n return acc;\n },\n [],\n );\n\n throw new Error(\n `The query must not include duplicate sort priorities. The following fields have sort priorities that are duplicated: ${duplicateSortPrioritiesArr.join('. ')}.`,\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n const fieldsWithBothFunctionAndCalculation = fields\n .filter(hasFunctionAndCalculation)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithBothFunctionAndCalculation.length > 0) {\n throw new Error(\n `The query must not include fields that contain both a function and a calculation. The following fields contain both a function and a calculation: ${fieldsWithBothFunctionAndCalculation.join(', ')}.`,\n );\n }\n }\n\n {\n // The maxDecimalPlaces value must be greater or equal to 0.\n const fieldsWithNegativeMaxDecimalPlace = fields\n .filter(hasNegativeMaxDecimalPlace)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithNegativeMaxDecimalPlace.length > 0) {\n throw new Error(\n `The query must not include fields that have a maxDecimalPlaces value that is less than 0. The following fields have a maxDecimalPlaces value that is less than 0: ${fieldsWithNegativeMaxDecimalPlace.join(', ')}.`,\n );\n }\n }\n}\n\nfunction hasEmptyFieldCaption(field: Field): boolean {\n return !field.fieldCaption;\n}\n\nexport function hasFunctionAndCalculation(field: Field | FilterField): boolean {\n return !!('function' in field && field.function && 'calculation' in field && field.calculation);\n}\n\nexport function hasFieldCaptionAndCalculation(field: Field | FilterField): boolean {\n return !!(\n 'fieldCaption' in field &&\n field.fieldCaption &&\n 'calculation' in field &&\n field.calculation\n );\n}\n\nfunction hasNegativeMaxDecimalPlace(field: Field): boolean {\n return field.maxDecimalPlaces !== undefined && field.maxDecimalPlaces < 0;\n}\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport { FilterField, Query } from '../queryDatasourceValidator.js';\nimport { hasFieldCaptionAndCalculation, hasFunctionAndCalculation } from './validateFields.js';\n\nexport function validateFilters(filters: Query['filters']): void {\n if (!filters) {\n return;\n }\n\n if (filters.some((filter) => !('field' in filter))) {\n throw new Error(\n 'The query must not include filters with invalid fields. The following field errors occurred: The filter must include a field property.',\n );\n }\n\n {\n // You can't have multiple filters for a single field.\n const fieldCounts = filters.reduce<Record<string, number>>((acc, filter) => {\n if (!('fieldCaption' in filter.field)) {\n return acc;\n }\n\n if (!acc[filter.field.fieldCaption]) {\n acc[filter.field.fieldCaption] = 0;\n }\n\n acc[filter.field.fieldCaption]++;\n return acc;\n }, {});\n\n const fieldsWithMultipleFilters = Object.entries(fieldCounts).filter(([_, count]) => count > 1);\n\n if (fieldsWithMultipleFilters.length > 0) {\n throw new Error(\n `The query must not include multiple filters for the following fields: ${fieldsWithMultipleFilters.map(([field]) => field).join(', ')}.`,\n );\n }\n }\n\n {\n // Fields must be valid.\n const filtersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (!('field' in filter)) {\n return acc;\n }\n\n const result = validateFilterField(filter.field);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (filtersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include filters with invalid fields. The following field errors occurred: ${filtersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n\n {\n // Set, Match, and Relative Date filters can't have functions or calculations.\n const setFiltersWithFunctionsOrCalculations = filters.filter((filter) => {\n return (\n ['SET', 'MATCH', 'DATE'].includes(filter.filterType) &&\n (('function' in filter.field && filter.field.function) ||\n ('calculation' in filter.field && filter.field.calculation))\n );\n });\n\n if (setFiltersWithFunctionsOrCalculations.length > 0) {\n throw new Error(\n 'The query must not include Set Filters, Match Filters, or Relative Date Filters with functions or calculations.',\n );\n }\n }\n\n {\n // Set filters\n {\n // Values array can't be empty.\n const setFiltersWithEmptyValues = filters.filter((filter) => {\n return filter.filterType === 'SET' && filter.values.length === 0;\n });\n\n if (setFiltersWithEmptyValues.length > 0) {\n throw new Error('The query must not include Set Filters with an empty values array.');\n }\n }\n }\n\n {\n // Quantitative filters\n {\n // Dates must be valid RFC 3339.\n const quantitativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n if (filter.filterType !== 'QUANTITATIVE_DATE') {\n return false;\n }\n\n switch (filter.quantitativeFilterType) {\n case 'RANGE':\n return isNaN(Date.parse(filter.minDate)) || isNaN(Date.parse(filter.maxDate));\n case 'MIN':\n return isNaN(Date.parse(filter.minDate));\n case 'MAX':\n return isNaN(Date.parse(filter.maxDate));\n }\n });\n\n if (quantitativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n 'The query must not include Quantitative Date Filters with invalid dates. Dates must use the RFC 3339 standard. Example: 2025-03-14',\n );\n }\n }\n }\n\n {\n // Relative Date Filters\n {\n // Dates must be valid RFC 3339.\n const relativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n return (\n filter.filterType === 'DATE' && filter.anchorDate && isNaN(Date.parse(filter.anchorDate))\n );\n });\n\n if (relativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n 'The query must not include Relative Date Filters with invalid anchor dates. Anchor dates must use the RFC 3339 standard. Example: 2025-03-14',\n );\n }\n }\n }\n\n {\n // Top N Filters\n {\n // Field to measure must be valid.\n const topNFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'TOP') {\n return acc;\n }\n\n const result = validateFilterField(filter.fieldToMeasure);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (topNFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Top N filters with invalid fields. The following field errors occurred: ${topNFiltersWithInvalidFields.join(', ')}`,\n );\n }\n }\n }\n\n {\n // Match Filters\n {\n // You must have at least one of startsWith, endsWith, or contains.\n const matchFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'MATCH') {\n return acc;\n }\n\n if (!filter.startsWith && !filter.endsWith && !filter.contains) {\n acc.push(\n `The match filter for field \"${filter.field.fieldCaption}\" must include at least one of the following properties: startsWith, endsWith, or contains`,\n );\n }\n\n return acc;\n }, []);\n\n if (matchFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Match Filters with invalid fields. The following field errors occurred: ${matchFiltersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n }\n}\n\nfunction validateFilterField(field: FilterField): Result<void, string> {\n {\n // Field caption must be a non-empty string.\n if (hasEmptyFieldCaption(field)) {\n return new Err('The fieldCaption property must be a non-empty string.');\n }\n }\n\n {\n // Field cannot have a fieldCaption and a Calculation.\n if (hasFieldCaptionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a fieldCaption and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n if (hasFunctionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a function and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n return Ok.EMPTY;\n}\n\nfunction hasEmptyFieldCaption(field: FilterField): boolean {\n return 'fieldCaption' in field && !field.fieldCaption;\n}\n", "import { z } from 'zod';\n\nimport { FilterField, Query } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport { validateFields } from './validators/validateFields.js';\nimport { validateFilters } from './validators/validateFilters.js';\n\nexport type Query = z.infer<typeof Query>;\nexport type FilterField = z.infer<typeof FilterField>;\n\nexport function validateQuery({\n datasourceLuid,\n query,\n}: {\n datasourceLuid: string;\n query: Query;\n}): void {\n validateDatasourceLuid({ datasourceLuid });\n\n const { fields, filters } = query;\n validateFields(fields);\n validateFilters(filters);\n\n const result = Query.safeParse(query);\n if (!result.success) {\n throw new Error('The query does not match the expected schema.');\n }\n}\n", "export const queryDatasourceToolDescription = `# Query Tableau Data Source Tool\n\nExecutes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping.\n\n## Prerequisites\nBefore using this tool, you should:\n1. Understand available fields and their types\n3. Understand the data structure and field relationships\n\n## Best Practices\n\n### Data Volume Management\n- **Always prefer aggregation** - Use aggregated fields (SUM, COUNT, AVG, etc.) instead of raw row-level data to reduce response size\n- **Profile data before querying** - When unsure about data volume, first run a COUNT query to understand the scale:\n \\`\\`\\`json\n {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n }\n \\`\\`\\`\n- **Use TOP filters for rankings** - When users ask for \"top N\" results, use TOP filter type to limit results at the database level\n- **Apply restrictive filters** - Use SET, QUANTITATIVE, or DATE filters to reduce data volume before processing\n- **Avoid row-level queries when possible** - Only retrieve individual records when specifically requested and the business need is clear\n\n### Field Usage Guidelines\n- **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations\n- **Use calculations sparingly** - Only create calculated fields when absolutely necessary and the calculation cannot be achieved through existing fields and aggregations\n- **Validate field availability** - Always check field metadata before constructing queries\n\n### Query Construction\n- **Group by meaningful dimensions** - Ensure grouping supports the business question being asked\n- **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way\n- **Use appropriate date functions** - Choose the right date aggregation (YEAR, QUARTER, MONTH, WEEK, DAY, or TRUNC_* variants)\n- **Leverage filter capabilities** - Use the extensive filter options to narrow results\n\n## Data Profiling Strategy\n\nWhen a query might return large amounts of data, follow this profiling approach:\n\n**Step 1: Count total records**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Primary_Key_Field\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 2: Count by key dimensions**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Category\",\n \"fieldAlias\": \"Category\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Record Count\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 3: Apply appropriate aggregation or filtering based on counts**\n\n## Filter Types and Usage\n\n### SET Filters\nFilter by specific values:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Region\"},\n \"filterType\": \"SET\",\n \"values\": [\"North\", \"South\", \"East\"],\n \"exclude\": false\n}\n\\`\\`\\`\n\n### TOP Filters \nGet top/bottom N records by a measure:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n}\n\\`\\`\\`\n\n### QUANTITATIVE Filters\nFilter numeric ranges:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"RANGE\",\n \"min\": 1000,\n \"max\": 50000,\n \"includeNulls\": false\n}\n\\`\\`\\`\n\n### DATE Filters\nFilter relative date periods:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"MONTHS\",\n \"dateRangeType\": \"LAST\"\n}\n\\`\\`\\`\n\n## Example Queries\n\n### Example 1: Data Profiling Before Large Query\n**Question:** \"Show me all customer orders this year\"\n\n**Step 1 - Profile the data volume:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Orders This Year\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n**If count is manageable (< 10,000), proceed with detail query. If large, suggest aggregation:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 2: Top Customers Query (Using TOP Filter)\n**Question:** \"Who are our top 10 customers by revenue?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Revenue\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 3: Time Series with Aggregation\n**Question:** \"What are our monthly sales trends?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"fieldAlias\": \"Month\",\n \"sortDirection\": \"ASC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 4: Filtered Category Analysis\n**Question:** \"What's the performance by product category for high-value orders?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Category\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"AVG\",\n \"fieldAlias\": \"Average Order Value\",\n \"maxDecimalPlaces\": 2\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"MIN\",\n \"min\": 500\n }\n ]\n }\n}\n\\`\\`\\`\n\n## Error Prevention and Data Management\n\n**When to profile data first:**\n- User asks for \"all records\" or similar broad requests\n- Query involves high-cardinality fields without filters\n- Request could potentially return row-level data for large tables\n\n**Suggest aggregation when:**\n- Profile queries return very high counts (> 10,000 records)\n- User asks questions that can be answered with summaries\n- Performance or response size might be an issue\n\n**Don't call this tool if:**\n- The requested fields are not available in the data source\n- The question requires data not present in the current data source\n- Field validation shows incompatible field types for the requested operation\n\n**Instead:**\n- Use metadata tools to understand available fields\n- Suggest alternative questions that can be answered with available data\n- Recommend appropriate aggregation levels for the business question`;\n", "import levenshtein from 'fast-levenshtein';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { log } from '../../../logging/log.js';\nimport {\n Datasource,\n MatchFilter,\n Query as QueryType,\n QueryRequest,\n SetFilter,\n} from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport VizqlDataServiceMethods from '../../../sdks/tableau/methods/vizqlDataServiceMethods.js';\nimport { Server } from '../../../server.js';\nimport { Query } from '../queryDatasourceValidator.js';\n\ntype MatchFilter = z.infer<typeof MatchFilter>;\ntype SetFilter = z.infer<typeof SetFilter>;\n\ninterface FilterValidationError {\n field: string;\n invalidValues: string[];\n sampleValues: string[];\n message: string;\n}\n\n/**\n * Validates SET and MATCH filter values by querying the VDS to check if they exist in the target field.\n * Returns fuzzy matched sample values from the field if validation fails.\n */\nexport async function validateFilterValues(\n server: Server,\n query: Query,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError[]>> {\n if (!query.filters) {\n return Ok.EMPTY;\n }\n\n const validationErrors: FilterValidationError[] = [];\n\n // Filter for SET and MATCH filters that need validation\n const filtersToValidate = query.filters.filter(\n (filter) =>\n (filter.filterType === 'SET' || filter.filterType === 'MATCH') &&\n 'fieldCaption' in filter.field &&\n filter.field.fieldCaption,\n ) as Array<MatchFilter | SetFilter>;\n\n if (filtersToValidate.length === 0) {\n return Ok.EMPTY;\n }\n\n // Validate each filter\n for (const filter of filtersToValidate) {\n const fieldCaption = filter.field.fieldCaption;\n\n try {\n if (filter.filterType === 'SET') {\n const result = await validateSetFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n } else if (filter.filterType === 'MATCH') {\n const result = await validateMatchFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n }\n } catch (error) {\n log.warning(server, `Filter value validation failed for field ${fieldCaption}: ${error}`);\n }\n }\n\n if (validationErrors.length > 0) {\n return new Err(validationErrors);\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a SET filter by checking if all values exist in the target field\n */\nasync function validateSetFilter(\n filter: SetFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n const filterValues = filter.values.map((v) => String(v));\n\n // Query to get distinct values from the field\n const distinctValuesQuery: z.infer<typeof QueryType> = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'DistinctValues',\n },\n ],\n };\n\n const queryRequest: z.infer<typeof QueryRequest> = {\n datasource,\n query: distinctValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const existingValues = new Set(\n (data as Record<string, unknown>[]).map((row) =>\n String(row.DistinctValues || row[fieldCaption] || ''),\n ),\n );\n\n // Check which filter values don't exist in the field\n const invalidValues = filterValues.filter((value) => !existingValues.has(value));\n\n if (invalidValues.length > 0) {\n // Use fuzzy matching to find similar values\n const suggestedValues = getFuzzyMatches(\n invalidValues,\n Array.from(existingValues),\n 3, // max edit distance\n 5, // max suggestions\n );\n\n let message = `Filter validation failed for field \"${fieldCaption}\". The following values were not found: ${invalidValues.join(', ')}.`;\n if (suggestedValues.length > 0) {\n message += ` Did you mean: ${suggestedValues.join(', ')}?`;\n }\n message +=\n ' Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.';\n\n return new Err({\n field: fieldCaption,\n invalidValues,\n sampleValues: suggestedValues,\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a MATCH filter by checking if the pattern matches any values in the target field\n */\nasync function validateMatchFilter(\n filter: MatchFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: z.infer<typeof Datasource>,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n\n // Query to get a sample of values from the field\n const sampleValuesQuery: z.infer<typeof QueryType> = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'SampleValues',\n },\n ],\n };\n\n const queryRequest: z.infer<typeof QueryRequest> = {\n datasource,\n query: sampleValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const fieldValues = (data as Record<string, unknown>[]).map((row: any) =>\n String(row.SampleValues || row[fieldCaption] || ''),\n );\n\n // Check if any values match the pattern\n const hasMatch = fieldValues.some((value) => {\n if (filter.startsWith && !value.startsWith(filter.startsWith)) return false;\n if (filter.endsWith && !value.endsWith(filter.endsWith)) return false;\n if (filter.contains && !value.includes(filter.contains)) return false;\n return true;\n });\n\n if (!hasMatch) {\n const similarValues = new Set<string>();\n\n // Find up to 5 similar values to avoid processing all field values\n for (const value of fieldValues) {\n if (similarValues.size >= 5) break;\n\n const lowerValue = value.toLowerCase();\n\n const fuzzyStartMatch = filter.startsWith\n ? (() => {\n const pattern = filter.startsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const startSlice = lowerValue.slice(0, len);\n return levenshtein.get(pattern, startSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyEndMatch = filter.endsWith\n ? (() => {\n const pattern = filter.endsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const endSlice = lowerValue.slice(-len);\n return levenshtein.get(pattern, endSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyContainsMatch = filter.contains\n ? (() => {\n const pattern = filter.contains!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n if (lowerValue.length >= len) {\n return Array.from({ length: lowerValue.length - len + 1 }, (_, i) =>\n levenshtein.get(pattern, lowerValue.slice(i, i + len)),\n ).some((dist) => dist <= dynamicDistance);\n } else {\n return levenshtein.get(pattern, lowerValue) <= dynamicDistance;\n }\n })()\n : true;\n\n if (fuzzyStartMatch && fuzzyEndMatch && fuzzyContainsMatch) {\n similarValues.add(value);\n }\n }\n\n const patternDescriptions: Array<string> = [];\n if (filter.startsWith) patternDescriptions.push(`starts with \"${filter.startsWith}\"`);\n if (filter.endsWith) patternDescriptions.push(`ends with \"${filter.endsWith}\"`);\n if (filter.contains) patternDescriptions.push(`contains \"${filter.contains}\"`);\n const similarValuesString =\n similarValues.size > 0\n ? `Similar values in this field: ${Array.from(similarValues).join(', ')}.`\n : '';\n\n const message =\n `Filter validation failed for field \"${fieldCaption}\". ` +\n `No values found that ${patternDescriptions.join(' and ')}. ` +\n `${similarValuesString} ` +\n 'Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.';\n\n return new Err({\n field: fieldCaption,\n invalidValues: patternDescriptions,\n sampleValues: Array.from(similarValues),\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Finds the closest matches to invalid filter values using fuzzy matching\n */\nexport function getFuzzyMatches(\n invalidValues: string[],\n existingValues: string[],\n maxDistance: number = 3,\n maxSuggestions: number = 5,\n): string[] {\n const suggestions: Array<{\n invalidValue: string;\n suggestionForInvalidValue: string;\n distance: number;\n }> = [];\n\n for (const existingValue of existingValues) {\n const matches = invalidValues\n .map((invalidValue) => ({\n value: invalidValue,\n distance: levenshtein.get(invalidValue.toLowerCase(), existingValue.toLowerCase()),\n }))\n .filter((match) => match.distance <= maxDistance)\n .sort((a, b) => a.distance - b.distance);\n if (matches.length > 0) {\n const bestMatch = matches[0];\n suggestions.push({\n invalidValue: bestMatch.value,\n suggestionForInvalidValue: existingValue,\n distance: bestMatch.distance,\n });\n }\n }\n\n // now that we have all the suggestions, sort them by distance.\n suggestions.sort((a, b) => a.distance - b.distance);\n\n // pick the best suggestions, but prevent having too many suggestions for the same invalid value.\n const toReturn: Array<string> = [];\n const suggestionLimitPerInvalidValue = Math.ceil(maxSuggestions / invalidValues.length);\n // create and initialize a suggestion counter for each invalid value.\n const invalidValueSuggestionCounter: Map<string, number> = new Map();\n for (const invalidValue of invalidValues) {\n invalidValueSuggestionCounter.set(invalidValue, 0);\n }\n\n for (const { invalidValue, suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n }\n\n if (invalidValueSuggestionCounter.get(invalidValue) === suggestionLimitPerInvalidValue) {\n continue;\n }\n\n toReturn.push(suggestionForInvalidValue);\n invalidValueSuggestionCounter.set(\n invalidValue,\n invalidValueSuggestionCounter.get(invalidValue)! + 1,\n );\n }\n\n // If we don't have enough suggestions, include more suggestions (ignoring the suggestion limit per invalid value).\n for (const { suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n } else if (toReturn.includes(suggestionForInvalidValue)) {\n continue;\n }\n toReturn.push(suggestionForInvalidValue);\n }\n\n return toReturn;\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n};\n\nexport type GetViewDataError = {\n type: 'view-not-allowed';\n message: string;\n};\n\nexport const getGetViewDataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewDataTool = new Tool({\n server,\n name: 'get-view-data',\n description:\n 'Retrieves data in comma separated value (CSV) format for the specified view in a Tableau workbook.',\n paramsSchema,\n annotations: {\n title: 'Get View Data',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ viewId }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewDataTool.logAndExecute<string, GetViewDataError>({\n requestId,\n authInfo,\n args: { viewId },\n callback: async () => {\n const isViewAllowedResult = await resourceAccessChecker.isViewAllowed({\n viewId,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isViewAllowedResult.allowed) {\n return new Err({\n type: 'view-not-allowed',\n message: isViewAllowedResult.message,\n });\n }\n\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewData({\n viewId,\n siteId: restApi.siteId,\n });\n },\n }),\n );\n },\n constrainSuccessResult: (viewData) => {\n return {\n type: 'success',\n result: viewData,\n };\n },\n getErrorText: (error: GetViewDataError) => {\n switch (error.type) {\n case 'view-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getViewDataTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { convertPngDataToToolResult } from '../convertPngDataToToolResult.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n width: z.number().gt(0).optional(),\n height: z.number().gt(0).optional(),\n};\n\nexport type GetViewImageError = {\n type: 'view-not-allowed';\n message: string;\n};\n\nexport const getGetViewImageTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewImageTool = new Tool({\n server,\n name: 'get-view-image',\n description:\n 'Retrieves an image of the specified view in a Tableau workbook. The width and height in pixels can be provided. The default width and height are both 800 pixels.',\n paramsSchema,\n annotations: {\n title: 'Get View Image',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { viewId, width, height },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewImageTool.logAndExecute<string, GetViewImageError>({\n requestId,\n authInfo,\n args: { viewId },\n callback: async () => {\n const isViewAllowedResult = await resourceAccessChecker.isViewAllowed({\n viewId,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isViewAllowedResult.allowed) {\n return new Err({\n type: 'view-not-allowed',\n message: isViewAllowedResult.message,\n });\n }\n\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewImage({\n viewId,\n siteId: restApi.siteId,\n width,\n height,\n resolution: 'high',\n });\n },\n }),\n );\n },\n constrainSuccessResult: (viewImage) => {\n return {\n type: 'success',\n result: viewImage,\n };\n },\n getSuccessResult: convertPngDataToToolResult,\n getErrorText: (error: GetViewImageError) => {\n switch (error.type) {\n case 'view-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getViewImageTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport function convertPngDataToToolResult(pngData: string): CallToolResult {\n const base64Data = Buffer.from(pngData).toString('base64');\n\n return {\n isError: false,\n content: [\n {\n type: 'image',\n data: base64Data,\n mimeType: 'image/png',\n },\n ],\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { BoundedContext, getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { View } from '../../sdks/tableau/types/view.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { ConstrainedResult, Tool } from '../tool.js';\nimport { parseAndValidateViewsFilterString } from './viewsFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListViewsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listViewsTool = new Tool({\n server,\n name: 'list-views',\n description: `\n Retrieves a list of views on a Tableau site including their metadata such as name, owner, and the workbook they are found in. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Overview) for precise and flexible view discovery. Use this tool when a user requests to list, search, or filter Tableau views on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |---------------------|----------------------|\n | caption | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | fields | eq, in |\n | hitsTotal | eq, gt, gte, lt, lte |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetNumber | eq, gt, gte, lt, lte |\n | sheetType | eq, in |\n | tags | eq, in |\n | title | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n | viewUrlname | eq, in |\n | workbookDescription | eq, in |\n | workbookName | eq, in |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all views on a site\n - List views with the name \"Overview\":\n filter: \"name:eq:Overview\"\n - List views in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List views created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List views with the name \"Overview\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Overview,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Views',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { filter, pageSize, limit },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateViewsFilterString(filter) : undefined;\n\n return await listViewsTool.logAndExecute({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const views = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, views: data } =\n await restApi.viewsMethods.queryViewsForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n includeUsageStatistics: true,\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return views;\n },\n }),\n );\n },\n constrainSuccessResult: (views) =>\n constrainViews({ views, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return listViewsTool;\n};\n\nexport function constrainViews({\n views,\n boundedContext,\n}: {\n views: Array<View>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<View>> {\n if (views.length === 0) {\n return {\n type: 'empty',\n message: 'No views were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, workbookIds } = boundedContext;\n if (projectIds) {\n views = views.filter((view) => (view.project?.id ? projectIds.has(view.project.id) : false));\n }\n\n if (workbookIds) {\n views = views.filter((view) => (view.workbook?.id ? workbookIds.has(view.workbook.id) : false));\n }\n\n if (views.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed views that can be queried is limited by the server configuration.',\n 'While views were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: views,\n };\n}\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'caption',\n 'contentUrl',\n 'createdAt',\n 'favoritesTotal',\n 'fields',\n 'hitsTotal',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetNumber',\n 'sheetType',\n 'tags',\n 'title',\n 'updatedAt',\n 'viewUrlname',\n 'workbookDescription',\n 'workbookName',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n caption: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n fields: ['eq', 'in'],\n hitsTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetNumber: ['eq', 'gt', 'gte', 'lt', 'lte'],\n sheetType: ['eq', 'in'],\n tags: ['eq', 'in'],\n title: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n viewUrlname: ['eq', 'in'],\n workbookDescription: ['eq', 'in'],\n workbookName: ['eq', 'in'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateViewsFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Workbook } from '../../sdks/tableau/types/workbook.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n workbookId: z.string(),\n};\n\nexport type GetWorkbookError = {\n type: 'workbook-not-allowed';\n message: string;\n};\n\nexport const getGetWorkbookTool = (server: Server): Tool<typeof paramsSchema> => {\n const getWorkbookTool = new Tool({\n server,\n name: 'get-workbook',\n description:\n 'Retrieves information about the specified workbook, including information about the views contained in the workbook.',\n paramsSchema,\n annotations: {\n title: 'Get Workbook',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ workbookId }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getWorkbookTool.logAndExecute<Workbook, GetWorkbookError>({\n requestId,\n authInfo,\n args: { workbookId },\n callback: async () => {\n const isWorkbookAllowedResult = await resourceAccessChecker.isWorkbookAllowed({\n workbookId,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isWorkbookAllowedResult.allowed) {\n return new Err({\n type: 'workbook-not-allowed',\n message: isWorkbookAllowedResult.message,\n });\n }\n\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n // Notice that we already have the workbook if it had been allowed by a project scope.\n const workbook =\n isWorkbookAllowedResult.content ??\n (await restApi.workbooksMethods.getWorkbook({\n workbookId,\n siteId: restApi.siteId,\n }));\n\n // The views returned by the getWorkbook API do not include usage statistics.\n // Query the views for the workbook to get each view's usage statistics.\n if (workbook.views) {\n const views = await restApi.viewsMethods.queryViewsForWorkbook({\n workbookId,\n siteId: restApi.siteId,\n includeUsageStatistics: true,\n });\n\n workbook.views.view = views;\n }\n\n return workbook;\n },\n }),\n );\n },\n constrainSuccessResult: (workbook) => {\n return {\n type: 'success',\n result: workbook,\n };\n },\n getErrorText: (error: GetWorkbookError) => {\n switch (error.type) {\n case 'workbook-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getWorkbookTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { BoundedContext, getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Workbook } from '../../sdks/tableau/types/workbook.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { ConstrainedResult, Tool } from '../tool.js';\nimport { parseAndValidateWorkbooksFilterString } from './workbooksFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListWorkbooksTool = (server: Server): Tool<typeof paramsSchema> => {\n const listWorkbooksTool = new Tool({\n server,\n name: 'list-workbooks',\n description: `\n Retrieves a list of workbooks on a Tableau site including their metadata such as name, description, and information about the views contained in the workbook. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Superstore) for precise and flexible workbook discovery. Use this tool when a user requests to list, search, or filter Tableau workbooks on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |-------------------|----------------------|\n | createdAt | eq, gt, gte, lt, lte |\n | contentUrl | eq, in |\n | displayTabs | eq |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlerts | eq |\n | hasExtracts | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetCount | eq, gt, gte, lt, lte |\n | size | eq, gt, gte, lt, lte |\n | subscriptionTotal | eq, gt, gte, lt, lte |\n | tags | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all workbooks on a site\n - List workbooks with the name \"Superstore\":\n filter: \"name:eq:Superstore\"\n - List workbooks in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List workbooks created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List workbooks with the name \"Superstore\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Superstore,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Workbooks',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { filter, pageSize, limit },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateWorkbooksFilterString(filter) : undefined;\n\n return await listWorkbooksTool.logAndExecute({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const workbooks = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, workbooks: data } =\n await restApi.workbooksMethods.queryWorkbooksForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return workbooks;\n },\n }),\n );\n },\n constrainSuccessResult: (workbooks) =>\n constrainWorkbooks({ workbooks, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return listWorkbooksTool;\n};\n\nexport function constrainWorkbooks({\n workbooks,\n boundedContext,\n}: {\n workbooks: Array<Workbook>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<Workbook>> {\n if (workbooks.length === 0) {\n return {\n type: 'empty',\n message:\n 'No workbooks were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, workbookIds } = boundedContext;\n if (projectIds) {\n workbooks = workbooks.filter((workbook) =>\n workbook.project?.id ? projectIds.has(workbook.project.id) : false,\n );\n }\n\n if (workbookIds) {\n workbooks = workbooks.filter((workbook) => workbookIds.has(workbook.id));\n }\n\n if (workbooks.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n 'While workbooks were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: workbooks,\n };\n}\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'createdAt',\n 'contentUrl',\n 'displayTabs',\n 'favoritesTotal',\n 'hasAlerts',\n 'hasExtracts',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetCount',\n 'size',\n 'subscriptionTotal',\n 'tags',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n contentUrl: ['eq', 'in'],\n displayTabs: ['eq'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlerts: ['eq'],\n hasExtracts: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetCount: ['eq', 'gt', 'gte', 'lt', 'lte'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n subscriptionTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tags: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateWorkbooksFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { getSearchContentTool } from './contentExploration/searchContent.js';\nimport { getGetDatasourceMetadataTool } from './getDatasourceMetadata/getDatasourceMetadata.js';\nimport { getListDatasourcesTool } from './listDatasources/listDatasources.js';\nimport { getGeneratePulseMetricValueInsightBundleTool } from './pulse/generateMetricValueInsightBundle/generatePulseMetricValueInsightBundleTool.js';\nimport { getListAllPulseMetricDefinitionsTool } from './pulse/listAllMetricDefinitions/listAllPulseMetricDefinitions.js';\nimport { getListPulseMetricDefinitionsFromDefinitionIdsTool } from './pulse/listMetricDefinitionsFromDefinitionIds/listPulseMetricDefinitionsFromDefinitionIds.js';\nimport { getListPulseMetricsFromMetricDefinitionIdTool } from './pulse/listMetricsFromMetricDefinitionId/listPulseMetricsFromMetricDefinitionId.js';\nimport { getListPulseMetricsFromMetricIdsTool } from './pulse/listMetricsFromMetricIds/listPulseMetricsFromMetricIds.js';\nimport { getListPulseMetricSubscriptionsTool } from './pulse/listMetricSubscriptions/listPulseMetricSubscriptions.js';\nimport { getQueryDatasourceTool } from './queryDatasource/queryDatasource.js';\nimport { getGetViewDataTool } from './views/getViewData.js';\nimport { getGetViewImageTool } from './views/getViewImage.js';\nimport { getListViewsTool } from './views/listViews.js';\nimport { getGetWorkbookTool } from './workbooks/getWorkbook.js';\nimport { getListWorkbooksTool } from './workbooks/listWorkbooks.js';\n\nexport const toolFactories = [\n getGetDatasourceMetadataTool,\n getListDatasourcesTool,\n getQueryDatasourceTool,\n getListAllPulseMetricDefinitionsTool,\n getListPulseMetricDefinitionsFromDefinitionIdsTool,\n getListPulseMetricsFromMetricDefinitionIdTool,\n getListPulseMetricsFromMetricIdsTool,\n getListPulseMetricSubscriptionsTool,\n getGeneratePulseMetricValueInsightBundleTool,\n getGetWorkbookTool,\n getGetViewDataTool,\n getGetViewImageTool,\n getListWorkbooksTool,\n getListViewsTool,\n getSearchContentTool,\n];\n", "import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { isInitializeRequest, LoggingLevel } from '@modelcontextprotocol/sdk/types.js';\nimport cors from 'cors';\nimport express, { Request, RequestHandler, Response } from 'express';\nimport fs, { existsSync } from 'fs';\nimport http from 'http';\nimport https from 'https';\n\nimport { Config } from '../config.js';\nimport { setLogLevel } from '../logging/log.js';\nimport { Server } from '../server.js';\nimport { createSession, getSession, Session } from '../sessions.js';\nimport { validateProtocolVersion } from './middleware.js';\nimport { OAuthProvider } from './oauth/provider.js';\n\nconst SESSION_ID_HEADER = 'mcp-session-id';\n\nexport async function startExpressServer({\n basePath,\n config,\n logLevel,\n}: {\n basePath: string;\n config: Config;\n logLevel: LoggingLevel;\n}): Promise<{ url: string; app: express.Application; server: http.Server }> {\n const app = express();\n\n app.use(express.json());\n app.use(express.urlencoded());\n\n app.use(\n cors({\n origin: config.corsOriginConfig,\n credentials: true,\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'Cache-Control',\n 'Accept',\n 'MCP-Protocol-Version',\n ],\n exposedHeaders: [SESSION_ID_HEADER, 'x-session-id'],\n }),\n );\n\n if (config.trustProxyConfig !== null) {\n // https://expressjs.com/en/guide/behind-proxies.html\n app.set('trust proxy', config.trustProxyConfig);\n }\n\n const middleware: Array<RequestHandler> = [];\n if (config.oauth.enabled) {\n const oauthProvider = new OAuthProvider();\n oauthProvider.setupRoutes(app);\n middleware.push(oauthProvider.authMiddleware);\n middleware.push(validateProtocolVersion);\n }\n\n const path = `/${basePath}`;\n app.post(path, ...middleware, createMcpServer);\n app.get(\n path,\n ...middleware,\n config.disableSessionManagement ? methodNotAllowed : handleSessionRequest,\n );\n app.delete(\n path,\n ...middleware,\n config.disableSessionManagement ? methodNotAllowed : handleSessionRequest,\n );\n\n const useSsl = !!(config.sslKey && config.sslCert);\n if (!useSsl) {\n return new Promise((resolve) => {\n const server = http\n .createServer(app)\n .listen(config.httpPort, () =>\n resolve({ url: `http://localhost:${config.httpPort}/${basePath}`, app, server }),\n );\n });\n }\n\n if (!existsSync(config.sslKey)) {\n throw new Error('SSL key file does not exist');\n }\n\n if (!existsSync(config.sslCert)) {\n throw new Error('SSL cert file does not exist');\n }\n\n const options = {\n key: fs.readFileSync(config.sslKey),\n cert: fs.readFileSync(config.sslCert),\n };\n\n return new Promise((resolve) => {\n const server = https\n .createServer(options, app)\n .listen(config.httpPort, () =>\n resolve({ url: `https://localhost:${config.httpPort}/${basePath}`, app, server }),\n );\n });\n\n async function createMcpServer(req: Request, res: Response): Promise<void> {\n try {\n let transport: StreamableHTTPServerTransport;\n\n if (config.disableSessionManagement) {\n const server = new Server();\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n res.on('close', () => {\n transport.close();\n server.close();\n });\n\n await connect(server, transport, logLevel);\n } else {\n const sessionId = req.headers[SESSION_ID_HEADER] as string | undefined;\n\n let session: Session | undefined;\n if (sessionId && (session = getSession(sessionId))) {\n transport = session.transport;\n } else if (!sessionId && isInitializeRequest(req.body)) {\n const clientInfo = req.body.params.clientInfo;\n transport = createSession({ clientInfo });\n\n const server = new Server({ clientInfo });\n await connect(server, transport, logLevel);\n } else {\n // Invalid request\n res.status(400).json({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Bad Request: No valid session ID provided',\n },\n id: null,\n });\n return;\n }\n }\n\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n console.error('Error handling MCP request:', error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n }\n }\n}\n\nasync function connect(\n server: Server,\n transport: StreamableHTTPServerTransport,\n logLevel: LoggingLevel,\n): Promise<void> {\n server.registerTools();\n server.registerRequestHandlers();\n\n await server.connect(transport);\n setLogLevel(server, logLevel);\n}\n\nasync function methodNotAllowed(_req: Request, res: Response): Promise<void> {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Method not allowed.',\n },\n id: null,\n }),\n );\n}\n\nasync function handleSessionRequest(req: express.Request, res: express.Response): Promise<void> {\n const sessionId = req.headers[SESSION_ID_HEADER] as string | undefined;\n\n let session: Session | undefined;\n if (!sessionId || !(session = getSession(sessionId))) {\n res.status(400).send('Invalid or missing session ID');\n return;\n }\n\n await session.transport.handleRequest(req, res);\n}\n", "import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { randomUUID } from 'crypto';\n\nimport { ClientInfo } from './server.js';\n\nexport type Session = {\n transport: StreamableHTTPServerTransport;\n clientInfo: ClientInfo;\n};\n\nconst sessions: { [sessionId: string]: Session } = {};\n\nexport const createSession = ({\n clientInfo,\n}: {\n clientInfo: ClientInfo;\n}): StreamableHTTPServerTransport => {\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sessionId) => {\n sessions[sessionId] = { transport, clientInfo };\n },\n });\n\n transport.onclose = () => {\n if (transport.sessionId) {\n deleteSession(transport.sessionId);\n }\n };\n\n return transport;\n};\n\nexport const getSession = (sessionId: string): Session | undefined => {\n return sessions[sessionId];\n};\n\nconst deleteSession = (sessionId: string): void => {\n delete sessions[sessionId];\n};\n", "import { NextFunction, Request, Response } from 'express';\n\n/**\n * Validate MCP protocol version\n */\nexport function validateProtocolVersion(req: Request, res: Response, next: NextFunction): void {\n const version = req.headers['mcp-protocol-version'];\n\n // If no version header, continue (backwards compatibility)\n if (!version) {\n next();\n return;\n }\n\n // Check supported versions\n const supportedVersions = ['2025-06-18', '2025-03-26', '2024-11-05'];\n if (!supportedVersions.includes(version as string)) {\n res.status(400).json({\n jsonrpc: '2.0',\n error: {\n code: -32600,\n message: 'Unsupported protocol version',\n data: { supported: supportedVersions, requested: version },\n },\n id: null,\n });\n return;\n }\n\n next();\n}\n", "import { createPrivateKey, createPublicKey, KeyObject } from 'crypto';\nimport express, { RequestHandler } from 'express';\nimport { readFileSync } from 'fs';\n\nimport { getConfig } from '../../config.js';\nimport { oauthAuthorizationServer } from './.well-known/oauth-authorization-server.js';\nimport { oauthProtectedResource } from './.well-known/oauth-protected-resource.js';\nimport { authMiddleware } from './authMiddleware.js';\nimport { authorize } from './authorize.js';\nimport { callback } from './callback.js';\nimport { register } from './register.js';\nimport { token } from './token.js';\nimport { AuthorizationCode, PendingAuthorization, RefreshTokenData } from './types.js';\n\nexport const TABLEAU_CLOUD_SERVER_URL = 'https://online.tableau.com';\nexport const AUDIENCE = 'tableau-mcp-server';\n\n/**\n * OAuth 2.1 Provider\n *\n * Implements the complete MCP OAuth 2.1 flow with PKCE\n * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization\n *\n */\nexport class OAuthProvider {\n private readonly config = getConfig();\n\n private readonly pendingAuthorizations = new Map<string, PendingAuthorization>();\n private readonly authorizationCodes = new Map<string, AuthorizationCode>();\n private readonly refreshTokens = new Map<string, RefreshTokenData>();\n\n private readonly privateKey: KeyObject;\n private readonly publicKey: KeyObject;\n\n constructor() {\n this.privateKey = this.getPrivateKey();\n this.publicKey = createPublicKey(this.privateKey);\n }\n\n get authMiddleware(): RequestHandler {\n return authMiddleware(this.privateKey);\n }\n\n setupRoutes(app: express.Application): void {\n // .well-known/oauth-authorization-server\n oauthAuthorizationServer(app);\n\n // .well-known/oauth-protected-resource\n oauthProtectedResource(app);\n\n // oauth/register\n register(app);\n\n // oauth/authorize\n authorize(app, this.pendingAuthorizations);\n\n // /Callback\n callback(app, this.pendingAuthorizations, this.authorizationCodes);\n\n // oauth/token\n token(app, this.authorizationCodes, this.refreshTokens, this.publicKey);\n }\n\n private getPrivateKey(): KeyObject {\n let privateKeyContents = this.config.oauth.jwePrivateKey.replace(/\\\\n/g, '\\n');\n if (!privateKeyContents) {\n try {\n privateKeyContents = readFileSync(this.config.oauth.jwePrivateKeyPath, 'utf8');\n } catch {\n throw new Error('Failed to read private key file');\n }\n }\n\n try {\n return createPrivateKey({\n key: privateKeyContents,\n format: 'pem',\n passphrase: this.config.oauth.jwePrivateKeyPassphrase,\n });\n } catch {\n throw new Error('Failed to create private key');\n }\n }\n}\n", "import express from 'express';\n\nimport { getConfig } from '../../../config.js';\n\n/**\n * OAuth 2.0 Authorization Server Metadata\n *\n * Returns metadata about the authorization server including\n * available endpoints, supported flows, and capabilities.\n */\nexport function oauthAuthorizationServer(app: express.Application): void {\n app.get('/.well-known/oauth-authorization-server', (_req, res) => {\n const origin = getConfig().oauth.issuer;\n res.json({\n issuer: origin,\n authorization_endpoint: `${origin}/oauth/authorize`,\n token_endpoint: `${origin}/oauth/token`,\n registration_endpoint: `${origin}/oauth/register`,\n response_types_supported: ['code'],\n grant_types_supported: ['authorization_code', 'refresh_token', 'client_credentials'],\n code_challenge_methods_supported: ['S256'],\n scopes_supported: [],\n token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post'],\n subject_types_supported: ['public'],\n });\n });\n}\n", "import express from 'express';\n\nimport { getConfig } from '../../../config.js';\nimport { serverName } from '../../../server.js';\n\n/**\n * OAuth 2.0 Protected Resource Metadata\n *\n * Returns metadata about the protected resource and its\n * authorization servers. Client discovers this URL from\n * WWW-Authenticate header in 401 response.\n */\nexport function oauthProtectedResource(app: express.Application): void {\n app.get('/.well-known/oauth-protected-resource', (_req, res) => {\n const issuer = getConfig().oauth.issuer;\n res.json({\n resource: `${issuer}/${serverName}`,\n authorization_servers: [issuer],\n bearer_methods_supported: ['header'],\n });\n });\n}\n", "import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { KeyObject } from 'crypto';\nimport express, { RequestHandler } from 'express';\nimport { compactDecrypt } from 'jose';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig } from '../../config.js';\nimport { AUDIENCE } from './provider.js';\nimport { mcpAccessTokenSchema, mcpAccessTokenUserOnlySchema, TableauAuthInfo } from './schemas.js';\nimport { AuthenticatedRequest } from './types.js';\n\n/**\n * Express middleware for OAuth authentication\n *\n * This middleware checks for Bearer token authorization.\n * If no token is present, returns 401 with WWW-Authenticate header\n * pointing to resource metadata endpoint.\n *\n * @returns Express middleware function\n */\nexport function authMiddleware(privateKey: KeyObject): RequestHandler {\n return async (\n req: AuthenticatedRequest,\n res: express.Response,\n next: express.NextFunction,\n ): Promise<void> => {\n const authHeader = req.headers.authorization;\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n // For SSE requests (GET), provide proper SSE error response\n if (req.method === 'GET' && req.headers.accept?.includes('text/event-stream')) {\n res.writeHead(401, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n res.write('event: error\\n');\n res.write(\n 'data: {\"error\": \"unauthorized\", \"error_description\": \"Authorization required\"}\\n\\n',\n );\n res.end();\n return;\n }\n\n const baseUrl = `${req.protocol}://${req.get('host')}`;\n res\n .status(401)\n .header(\n 'WWW-Authenticate',\n `Bearer realm=\"MCP\", resource_metadata=\"${baseUrl}/.well-known/oauth-protected-resource\"`,\n )\n .json({\n error: 'unauthorized',\n error_description: 'Authorization required. Use OAuth 2.1 flow.',\n });\n return;\n }\n\n const token = authHeader.slice(7);\n const result = await verifyAccessToken(token, privateKey);\n\n if (result.isErr()) {\n // For SSE requests (GET), provide proper SSE error response\n if (req.method === 'GET' && req.headers.accept?.includes('text/event-stream')) {\n res.writeHead(401, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n res.write('event: error\\n');\n res.write(`data: {\"error\": \"invalid_token\", \"error_description\": \"${result.error}\"}\\n\\n`);\n res.end();\n return;\n }\n\n res.status(401).json({\n error: 'invalid_token',\n error_description: result.error,\n });\n return;\n }\n req.auth = result.value;\n next();\n };\n}\n\n/**\n * Verifies JWE access token and extracts credentials\n *\n * Decrypts and validates JWE signature and expiration.\n * Extracts access/refresh tokens for API calls.\n *\n * @param token - JWT access token from Authorization header\n * @param jwePrivateKey - Private key for decrypting the token\n *\n * @returns AuthInfo with user details and tokens\n */\nasync function verifyAccessToken(\n token: string,\n jwePrivateKey: KeyObject,\n): Promise<Result<AuthInfo, string>> {\n const config = getConfig();\n\n try {\n const { plaintext } = await compactDecrypt(token, jwePrivateKey);\n const payload = JSON.parse(new TextDecoder().decode(plaintext));\n\n const mcpAccessToken = mcpAccessTokenUserOnlySchema.safeParse(payload);\n if (!mcpAccessToken.success) {\n return Err(`Invalid access token: ${fromError(mcpAccessToken.error).toString()}`);\n }\n\n const { iss, aud, exp, clientId } = mcpAccessToken.data;\n if (iss !== config.oauth.issuer || aud !== AUDIENCE || exp < Math.floor(Date.now() / 1000)) {\n // https://github.com/modelcontextprotocol/inspector/issues/608\n // MCP Inspector Not Using Refresh Token for Token Validation\n return new Err('Invalid or expired access token');\n }\n\n let tableauAuthInfo: TableauAuthInfo;\n if (config.auth === 'oauth') {\n const mcpAccessToken = mcpAccessTokenSchema.safeParse(payload);\n if (!mcpAccessToken.success) {\n return Err(`Invalid access token: ${fromError(mcpAccessToken.error).toString()}`);\n }\n\n const {\n tableauAccessToken,\n tableauRefreshToken,\n tableauExpiresAt,\n tableauUserId,\n tableauServer,\n sub,\n } = mcpAccessToken.data;\n\n if (tableauExpiresAt < Math.floor(Date.now() / 1000)) {\n return new Err('Invalid or expired access token');\n }\n\n tableauAuthInfo = {\n username: sub,\n userId: tableauUserId,\n server: tableauServer,\n accessToken: tableauAccessToken,\n refreshToken: tableauRefreshToken,\n };\n } else {\n const { tableauUserId, tableauServer, sub } = mcpAccessToken.data;\n tableauAuthInfo = {\n username: sub,\n server: tableauServer,\n ...(tableauUserId ? { userId: tableauUserId } : {}),\n };\n }\n\n return Ok({\n token,\n clientId,\n scopes: [],\n expiresAt: payload.exp,\n extra: tableauAuthInfo,\n });\n } catch {\n return new Err('Invalid or expired access token');\n }\n}\n", "import { randomBytes, randomUUID } from 'crypto';\nimport express from 'express';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig } from '../../config.js';\nimport { setLongTimeout } from '../../utils/setLongTimeout.js';\nimport { generateCodeChallenge } from './generateCodeChallenge.js';\nimport { isValidRedirectUri } from './isValidRedirectUri.js';\nimport { TABLEAU_CLOUD_SERVER_URL } from './provider.js';\nimport { mcpAuthorizeSchema } from './schemas.js';\nimport { PendingAuthorization } from './types.js';\n\n/**\n * OAuth 2.1 Authorization Endpoint\n *\n * Handles authorization requests with PKCE parameters.\n * Validates request, stores pending authorization, and\n * redirects to Tableau OAuth.\n */\nexport function authorize(\n app: express.Application,\n pendingAuthorizations: Map<string, PendingAuthorization>,\n): void {\n const config = getConfig();\n\n app.get('/oauth/authorize', (req, res) => {\n const result = mcpAuthorizeSchema.safeParse(req.query);\n\n if (!result.success) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: fromError(result.error).toString(),\n });\n return;\n }\n\n const { clientId, redirectUri, responseType, codeChallenge, codeChallengeMethod, state } =\n result.data;\n\n if (responseType !== 'code') {\n res.status(400).json({\n error: 'unsupported_response_type',\n error_description: 'Only authorization code flow is supported',\n });\n return;\n }\n\n if (codeChallengeMethod !== 'S256') {\n res.status(400).json({\n error: 'invalid_request',\n error_description: 'Only S256 code challenge method is supported',\n });\n return;\n }\n\n if (!isValidRedirectUri(redirectUri)) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: `Invalid redirect URI: ${redirectUri}`,\n });\n return;\n }\n\n // Generate Tableau state and store pending authorization\n const tableauState = randomBytes(32).toString('hex');\n const authKey = randomBytes(32).toString('hex');\n\n const tableauClientId = randomUUID();\n // 22-64 bytes (44-128 chars) is the recommended length for code verifiers\n const numCodeVerifierBytes = Math.floor(Math.random() * (64 - 22 + 1)) + 22;\n const tableauCodeVerifier = randomBytes(numCodeVerifierBytes).toString('hex');\n const tableauCodeChallenge = generateCodeChallenge(tableauCodeVerifier);\n pendingAuthorizations.set(authKey, {\n clientId,\n redirectUri,\n codeChallenge,\n state: state ?? '',\n tableauState,\n tableauClientId,\n tableauCodeVerifier,\n });\n\n // Clean up expired authorizations\n setLongTimeout(() => pendingAuthorizations.delete(authKey), config.oauth.authzCodeTimeoutMs);\n\n // Redirect to Tableau OAuth\n const server = config.server || TABLEAU_CLOUD_SERVER_URL;\n const oauthUrl = new URL(`${server}/oauth2/v1/auth`);\n oauthUrl.searchParams.set('client_id', tableauClientId);\n oauthUrl.searchParams.set('code_challenge', tableauCodeChallenge);\n oauthUrl.searchParams.set('code_challenge_method', 'S256');\n oauthUrl.searchParams.set('response_type', 'code');\n oauthUrl.searchParams.set('redirect_uri', config.oauth.redirectUri);\n oauthUrl.searchParams.set('state', `${authKey}:${tableauState}`);\n oauthUrl.searchParams.set('device_id', randomUUID());\n oauthUrl.searchParams.set('target_site', config.siteName);\n oauthUrl.searchParams.set('device_name', getDeviceName(redirectUri, state ?? ''));\n oauthUrl.searchParams.set('client_type', 'tableau-mcp');\n\n res.redirect(oauthUrl.toString());\n });\n}\n\nfunction getDeviceName(redirectUri: string, state: string): string {\n const defaultDeviceName = 'tableau-mcp (Unknown agent)';\n\n try {\n const url = new URL(redirectUri);\n if (url.protocol === 'https:' || url.protocol === 'http:') {\n if (redirectUri === 'https://vscode.dev/redirect' && new URL(state).protocol === 'vscode:') {\n // VS Code normally authenticates in a way that doesn't give any clues about who it is.\n // It has a backup authentication method they call \"URL Handler\" that does though.\n return 'tableau-mcp (VS Code)';\n }\n\n return defaultDeviceName;\n } else if (url.protocol === 'cursor:') {\n return 'tableau-mcp (Cursor)';\n } else {\n return `tableau-mcp (${url.protocol.slice(0, -1)})`;\n }\n } catch {\n return defaultDeviceName;\n }\n}\n", "/* v8 ignore file -- @preserve */\n\nconst MAX_SIGNED_INT32 = 2 ** 31 - 1;\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\nexport function setLongTimeout<TArgs extends any[]>(\n callback: (...args: TArgs) => void,\n delay: number,\n ...args: TArgs\n): NodeJS.Timeout {\n const MAX_DELAY = MAX_SIGNED_INT32;\n\n if (delay > MAX_DELAY) {\n return setTimeout(() => {\n setLongTimeout(callback, delay - MAX_DELAY, ...args);\n }, MAX_DELAY);\n }\n\n return setTimeout(callback, delay, ...args);\n}\n", "import { createHash } from 'crypto';\n\n/**\n * Generates PKCE code challenge from verifier\n *\n * @param verifier - Random code verifier string\n * @returns Base64url-encoded SHA256 hash of verifier\n */\nexport function generateCodeChallenge(verifier: string): string {\n return createHash('sha256').update(verifier).digest('base64url');\n}\n", "export function isValidRedirectUri(redirectUri: unknown): boolean {\n if (typeof redirectUri !== 'string') {\n return false;\n }\n\n try {\n const url = new URL(redirectUri);\n\n // Allow HTTPS URLs\n if (url.protocol === 'https:') {\n return true;\n }\n\n // Allow HTTP only for localhost\n if (url.protocol === 'http:') {\n return url.hostname === 'localhost' || url.hostname === '127.0.0.1';\n }\n\n // Allow custom schemes (like systemprompt://)\n if (url.protocol.match(/^[a-zA-Z][a-zA-Z0-9+.-]*:$/)) {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n}\n", "import { randomBytes } from 'crypto';\nimport express from 'express';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig } from '../../config.js';\nimport { RestApi } from '../../sdks/tableau/restApi.js';\nimport { getTokenResult } from '../../sdks/tableau-oauth/methods.js';\nimport { TableauAccessToken } from '../../sdks/tableau-oauth/types.js';\nimport { TABLEAU_CLOUD_SERVER_URL } from './provider.js';\nimport { callbackSchema } from './schemas.js';\nimport { AuthorizationCode, PendingAuthorization } from './types.js';\n\n/**\n * OAuth Callback Handler\n *\n * Receives callback from Tableau OAuth after user authorization.\n * Exchanges code for tokens, generates MCP authorization\n * code, and redirects back to client with code.\n */\nexport function callback(\n app: express.Application,\n pendingAuthorizations: Map<string, PendingAuthorization>,\n authorizationCodes: Map<string, AuthorizationCode>,\n): void {\n const config = getConfig();\n\n app.get('/Callback', async (req, res) => {\n const result = callbackSchema.safeParse(req.query);\n\n if (!result.success) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: fromError(result.error).toString(),\n });\n return;\n }\n\n const { error, code, state } = result.data;\n\n if (error) {\n res.status(400).json({\n error: 'access_denied',\n error_description: 'User denied authorization',\n });\n return;\n }\n\n try {\n // Parse state to get auth key and Tableau state\n const [authKey, tableauState] = state?.split(':') ?? [];\n const pendingAuth = pendingAuthorizations.get(authKey);\n\n if (!pendingAuth || pendingAuth.tableauState !== tableauState) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: 'Invalid state parameter',\n });\n return;\n }\n\n const tokensResult = await exchangeAuthorizationCode({\n server: config.server || TABLEAU_CLOUD_SERVER_URL,\n code: code ?? '',\n redirectUri: config.oauth.redirectUri,\n clientId: pendingAuth.tableauClientId,\n codeVerifier: pendingAuth.tableauCodeVerifier,\n });\n\n if (tokensResult.isErr()) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: tokensResult.error,\n });\n return;\n }\n\n const { accessToken, refreshToken, expiresInSeconds, originHost } = tokensResult.value;\n const originHostUrl = new URL(`https://${originHost}`);\n\n if (config.server) {\n const configServerUrl = new URL(config.server);\n if (originHostUrl.hostname !== configServerUrl.hostname) {\n // Not sure if this can actually happen but without returning an error here,\n // this would fail downstream when attempting to authenticate to the REST API.\n res.status(400).json({\n error: 'invalid_request',\n error_description: `Invalid origin host: ${originHost}. Expected: ${new URL(config.server).hostname}`,\n });\n return;\n }\n }\n\n const server = originHostUrl.toString();\n const restApi = new RestApi(server);\n restApi.setCredentials(accessToken, 'unknown user id');\n const sessionResult = await restApi.serverMethods.getCurrentServerSession();\n if (sessionResult.isErr()) {\n if (sessionResult.error.type === 'unauthorized') {\n res.status(401).json({\n error: 'unauthorized',\n error_description: `Unable to get the Tableau server session. Error: ${JSON.stringify(sessionResult.error)}`,\n });\n } else {\n res.status(500).json({\n error: 'server_error',\n error_description:\n 'Internal server error during authorization. Unable to get the Tableau server session. Contact your administrator.',\n });\n }\n return;\n }\n\n // Generate authorization code\n const authorizationCode = randomBytes(32).toString('hex');\n authorizationCodes.set(authorizationCode, {\n clientId: pendingAuth.clientId,\n redirectUri: pendingAuth.redirectUri,\n codeChallenge: pendingAuth.codeChallenge,\n user: sessionResult.value.user,\n server,\n tableauClientId: pendingAuth.tableauClientId,\n tokens: {\n accessToken,\n refreshToken,\n expiresInSeconds,\n },\n expiresAt: Math.floor((Date.now() + config.oauth.authzCodeTimeoutMs) / 1000),\n });\n\n // Clean up\n pendingAuthorizations.delete(authKey);\n\n // Redirect back to client with authorization code\n const redirectUrl = new URL(pendingAuth.redirectUri);\n redirectUrl.searchParams.set('code', authorizationCode);\n redirectUrl.searchParams.set('state', pendingAuth.state);\n\n res.redirect(redirectUrl.toString());\n } catch (error) {\n console.error('OAuth callback error:', error);\n res.status(500).json({\n error: 'server_error',\n error_description:\n 'Internal server error during authorization. Contact your administrator.',\n });\n }\n });\n}\n\n/**\n * Exchanges authorization code for Tableau access tokens\n *\n * @param server - Tableau server host\n * @param code - Authorization code\n * @param redirectUri - Redirect URI used in initial request\n * @param clientId - Client ID\n * @param codeVerifier - Code verifier\n * @returns token response with access_token and refresh_token\n */\nasync function exchangeAuthorizationCode({\n server,\n code,\n redirectUri,\n clientId,\n codeVerifier,\n}: {\n server: string;\n code: string;\n redirectUri: string;\n clientId: string;\n codeVerifier: string;\n}): Promise<Result<TableauAccessToken, string>> {\n try {\n const result = await getTokenResult(server, {\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: codeVerifier,\n });\n\n return Ok(result);\n } catch {\n return Err('Failed to exchange authorization code');\n }\n}\n", "import { Zodios, ZodiosInstance } from '@zodios/core';\n\nimport { tableauTokenApi } from './apis.js';\n\nexport const getClient = (basePath: string): ZodiosInstance<typeof tableauTokenApi> => {\n return new Zodios(basePath, tableauTokenApi);\n};\n", "import { makeApi } from '@zodios/core';\n\nimport { tableauAccessTokenRequestSchema, tableauAccessTokenResponseSchema } from './types.js';\n\nexport const tableauTokenApi = makeApi([\n {\n method: 'post',\n path: '/oauth2/v1/token',\n alias: 'token',\n response: tableauAccessTokenResponseSchema,\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: tableauAccessTokenRequestSchema,\n },\n ],\n },\n]);\n", "import { z } from 'zod';\n\nimport { requiredString } from '../../utils/requiredString.js';\n\nexport const tableauAccessTokenRequestSchema = z.discriminatedUnion('grant_type', [\n z.object({\n grant_type: z.literal('authorization_code'),\n code: z.string(),\n code_verifier: z.string(),\n redirect_uri: z.string(),\n client_id: z.string(),\n }),\n z.object({\n grant_type: z.literal('refresh_token'),\n client_id: z.string(),\n refresh_token: z.string(),\n site_namespace: z.string(),\n }),\n]);\n\nexport const tableauAccessTokenResponseSchema = z\n .object({\n access_token: requiredString('access_token'),\n expires_in: z.number().int().nonnegative(),\n refresh_token: requiredString('refresh_token'),\n origin_host: requiredString('origin_host'),\n })\n .transform((data) => ({\n accessToken: data.access_token,\n expiresInSeconds: data.expires_in,\n refreshToken: data.refresh_token,\n originHost: data.origin_host,\n }));\n\nexport type TableauAccessTokenRequest = z.infer<typeof tableauAccessTokenRequestSchema>;\nexport type TableauAccessToken = z.infer<typeof tableauAccessTokenResponseSchema>;\n", "import { userAgent } from '../../server.js';\nimport { getClient } from './client.js';\nimport { TableauAccessToken, TableauAccessTokenRequest } from './types.js';\n\nexport async function getTokenResult(\n basePath: string,\n request: TableauAccessTokenRequest,\n): Promise<TableauAccessToken> {\n return await getClient(basePath).token(request, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': userAgent,\n },\n });\n}\n", "import express from 'express';\n\nimport { isValidRedirectUri } from './isValidRedirectUri.js';\n\n/**\n * Dynamic Client Registration Endpoint\n *\n * Allows clients to dynamically register with the authorization\n * server. For public clients (like desktop apps), no client\n * secret is required - security comes from PKCE.\n */\nexport function register(app: express.Application): void {\n app.post('/oauth/register', express.json(), (req, res) => {\n const { redirect_uris } = req.body;\n\n const validatedRedirectUris = [];\n if (redirect_uris && Array.isArray(redirect_uris)) {\n for (const uri of redirect_uris) {\n if (!isValidRedirectUri(uri)) {\n res.status(400).json({\n error: 'invalid_redirect_uri',\n error_description: `Invalid redirect URI: ${uri}`,\n });\n return;\n }\n\n validatedRedirectUris.push(uri);\n }\n }\n\n let { token_endpoint_auth_method } = req.body;\n if (\n !token_endpoint_auth_method ||\n typeof token_endpoint_auth_method !== 'string' ||\n !['client_secret_basic', 'client_secret_post'].includes(token_endpoint_auth_method)\n ) {\n token_endpoint_auth_method = 'client_secret_basic';\n }\n\n // For public clients, we use a fixed client ID since no authentication is required\n // The security comes from PKCE (code challenge/verifier) at authorization time\n res.json({\n client_id: 'mcp-public-client',\n redirect_uris: validatedRedirectUris,\n grant_types: ['authorization_code', 'client_credentials'],\n response_types: ['code'],\n token_endpoint_auth_method,\n application_type: 'native',\n });\n });\n}\n", "import { KeyObject, randomBytes, timingSafeEqual } from 'crypto';\nimport express from 'express';\nimport { CompactEncrypt } from 'jose';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig } from '../../config.js';\nimport { getTokenResult } from '../../sdks/tableau-oauth/methods.js';\nimport { TableauAccessToken } from '../../sdks/tableau-oauth/types.js';\nimport { setLongTimeout } from '../../utils/setLongTimeout.js';\nimport { generateCodeChallenge } from './generateCodeChallenge.js';\nimport { AUDIENCE } from './provider.js';\nimport { mcpTokenSchema } from './schemas.js';\nimport { AuthorizationCode, ClientCredentials, RefreshTokenData, UserAndTokens } from './types.js';\n\n/**\n * OAuth 2.1 Token Endpoint\n *\n * Exchanges authorization code for access token.\n * Verifies PKCE code_verifier matches the original challenge.\n * Returns JWE containing tokens for API access.\n */\nexport function token(\n app: express.Application,\n authorizationCodes: Map<string, AuthorizationCode>,\n refreshTokens: Map<string, RefreshTokenData>,\n publicKey: KeyObject,\n): void {\n const config = getConfig();\n\n app.post('/oauth/token', async (req, res) => {\n const result = mcpTokenSchema.safeParse(req.body);\n\n if (!result.success) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: fromError(result.error).toString(),\n });\n return;\n }\n\n const clientCredentialsResult = verifyClientCredentials({\n required: result.data.grantType === 'client_credentials',\n clientId: result.data.clientId,\n clientSecret: result.data.clientSecret,\n clientIdSecretPairs: getConfig().oauth.clientIdSecretPairs,\n authorizationHeader: req.headers.authorization,\n });\n\n if (clientCredentialsResult.isErr()) {\n res.status(401).json({\n error: 'invalid_client',\n error_description: clientCredentialsResult.error,\n });\n return;\n }\n\n try {\n switch (result.data.grantType) {\n case 'authorization_code': {\n // Handle authorization code exchange\n const { code, codeVerifier } = result.data;\n const authCode = authorizationCodes.get(code);\n if (!authCode || authCode.expiresAt < Math.floor(Date.now() / 1000)) {\n authorizationCodes.delete(code);\n res.status(400).json({\n error: 'invalid_grant',\n error_description: 'Invalid or expired authorization code',\n });\n return;\n }\n\n // Verify PKCE\n const challengeFromVerifier = generateCodeChallenge(codeVerifier);\n if (challengeFromVerifier !== authCode.codeChallenge) {\n res.status(400).json({\n error: 'invalid_grant',\n error_description: 'Invalid code verifier',\n });\n return;\n }\n\n // Generate tokens\n const refreshTokenId = randomBytes(32).toString('hex');\n const accessToken = await createAccessToken(authCode, publicKey);\n refreshTokens.set(refreshTokenId, {\n user: authCode.user,\n server: authCode.server,\n clientId: authCode.clientId,\n tokens: authCode.tokens,\n expiresAt: Math.floor((Date.now() + config.oauth.refreshTokenTimeoutMs) / 1000),\n tableauClientId: authCode.tableauClientId,\n });\n\n setLongTimeout(\n () => refreshTokens.delete(refreshTokenId),\n config.oauth.refreshTokenTimeoutMs,\n );\n\n authorizationCodes.delete(code);\n\n res.json({\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: config.oauth.accessTokenTimeoutMs / 1000,\n refresh_token: refreshTokenId,\n });\n return;\n }\n case 'client_credentials': {\n // Generate access token for client credentials grant type.\n // Refresh token is not supported for client credentials grant type.\n // https://www.rfc-editor.org/rfc/rfc6749#section-4.4.3\n const accessToken = await createClientCredentialsAccessToken(\n {\n clientId: clientCredentialsResult.value.clientId,\n server: config.server,\n },\n publicKey,\n );\n\n res.json({\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: config.oauth.accessTokenTimeoutMs / 1000,\n });\n return;\n }\n case 'refresh_token': {\n // Handle refresh token\n const { refreshToken } = result.data;\n const tokenData = refreshTokens.get(refreshToken);\n if (!tokenData || tokenData.expiresAt < Math.floor(Date.now() / 1000)) {\n // Refresh token is expired\n refreshTokens.delete(refreshToken);\n res.status(400).json({\n error: 'invalid_grant',\n error_description: 'Invalid or expired refresh token',\n });\n return;\n }\n\n let accessToken: string;\n const { refreshToken: tableauRefreshToken } = tokenData.tokens;\n\n const tokensResult = await exchangeRefreshToken(\n tokenData.server,\n tableauRefreshToken,\n tokenData.tableauClientId,\n );\n\n if (tokensResult.isErr()) {\n // If the refresh token exchange fails, reuse the existing Tableau access token\n // which may or may not be expired.\n accessToken = await createAccessToken(\n {\n user: tokenData.user,\n clientId: tokenData.clientId,\n server: tokenData.server,\n tokens: tokenData.tokens,\n },\n publicKey,\n );\n } else {\n const {\n accessToken: newTableauAccessToken,\n refreshToken: newTableauRefreshToken,\n expiresInSeconds,\n } = tokensResult.value;\n\n accessToken = await createAccessToken(\n {\n user: tokenData.user,\n clientId: tokenData.clientId,\n server: tokenData.server,\n tokens: {\n accessToken: newTableauAccessToken,\n refreshToken: newTableauRefreshToken,\n expiresInSeconds,\n },\n },\n publicKey,\n );\n }\n\n // Rotate the refresh token and extend its expiration time\n refreshTokens.delete(refreshToken);\n const refreshTokenId = randomBytes(32).toString('hex');\n\n refreshTokens.set(refreshTokenId, {\n user: tokenData.user,\n server: tokenData.server,\n clientId: tokenData.clientId,\n tokens: tokenData.tokens,\n expiresAt: Math.floor((Date.now() + config.oauth.refreshTokenTimeoutMs) / 1000),\n tableauClientId: tokenData.tableauClientId,\n });\n\n res.json({\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: config.oauth.accessTokenTimeoutMs / 1000,\n refresh_token: refreshTokenId,\n });\n return;\n }\n }\n } catch (error) {\n console.error('Token endpoint error:', error);\n res.status(500).json({\n error: 'server_error',\n error_description: 'Internal server error',\n });\n return;\n }\n });\n}\n\n/**\n * Creates JWE access token containing credentials\n *\n * @param tokenData - token data\n * @param publicKey - public key for encrypting the token\n * @returns Encrypted JWE token for MCP authentication\n */\nasync function createAccessToken(tokenData: UserAndTokens, publicKey: KeyObject): Promise<string> {\n const config = getConfig();\n\n const payload = JSON.stringify({\n sub: tokenData.user.name,\n clientId: tokenData.clientId,\n tableauServer: tokenData.server,\n tableauUserId: tokenData.user.id,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor((Date.now() + config.oauth.accessTokenTimeoutMs) / 1000),\n aud: AUDIENCE,\n iss: config.oauth.issuer,\n ...(config.auth === 'oauth'\n ? {\n tableauAccessToken: tokenData.tokens.accessToken,\n tableauRefreshToken: tokenData.tokens.refreshToken,\n tableauExpiresAt: Math.floor(Date.now() / 1000) + tokenData.tokens.expiresInSeconds,\n tableauUserId: tokenData.user.id,\n }\n : {}),\n });\n\n const jwe = await new CompactEncrypt(new TextEncoder().encode(payload))\n .setProtectedHeader({ alg: 'RSA-OAEP-256', enc: 'A256GCM' })\n .encrypt(publicKey);\n\n return jwe;\n}\n\nasync function createClientCredentialsAccessToken(\n clientCredentials: ClientCredentials,\n publicKey: KeyObject,\n): Promise<string> {\n const config = getConfig();\n const payload = JSON.stringify({\n sub: clientCredentials.clientId,\n clientId: clientCredentials.clientId,\n tableauServer: clientCredentials.server,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor((Date.now() + config.oauth.accessTokenTimeoutMs) / 1000),\n aud: AUDIENCE,\n iss: config.oauth.issuer,\n });\n\n const jwe = await new CompactEncrypt(new TextEncoder().encode(payload))\n .setProtectedHeader({ alg: 'RSA-OAEP-256', enc: 'A256GCM' })\n .encrypt(publicKey);\n\n return jwe;\n}\n\nasync function exchangeRefreshToken(\n server: string,\n refreshToken: string,\n clientId: string,\n): Promise<Result<TableauAccessToken, string>> {\n try {\n const result = await getTokenResult(server, {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: clientId,\n site_namespace: '',\n });\n\n return Ok(result);\n } catch {\n return Err('Failed to exchange refresh token');\n }\n}\n\nfunction verifyClientCredentials({\n required,\n clientId,\n clientSecret,\n clientIdSecretPairs,\n authorizationHeader,\n}: {\n required: boolean;\n clientId: string | undefined;\n clientSecret: string | undefined;\n clientIdSecretPairs: Record<string, string> | null;\n authorizationHeader: string | undefined;\n}): Result<{ clientId: string }, string> {\n if (!clientId && !clientSecret) {\n if (required) {\n if (!authorizationHeader) {\n return Err('Authorization header is required');\n }\n\n const [type, credentials] = authorizationHeader.split(' ');\n if (type !== 'Basic') {\n return Err('Invalid authorization type');\n }\n\n [clientId, clientSecret] = Buffer.from(credentials, 'base64').toString().split(':');\n if (!clientId || !clientSecret) {\n return Err('Invalid client credentials');\n }\n }\n }\n\n if (!required) {\n return Ok({ clientId: '' });\n }\n\n if (!clientId) {\n return Err('Client ID is required');\n }\n\n if (!clientSecret) {\n return Err('Client secret is required');\n }\n\n const expectedClientSecret = clientIdSecretPairs?.[clientId];\n if (!expectedClientSecret || clientSecret.length !== expectedClientSecret.length) {\n return Err('Invalid client credentials');\n }\n\n const textEncoder = new TextEncoder();\n const clientSecretBuffer = textEncoder.encode(clientSecret);\n const expectedClientSecretBuffer = textEncoder.encode(expectedClientSecret);\n\n if (\n clientSecretBuffer.byteLength !== expectedClientSecretBuffer.byteLength ||\n !timingSafeEqual(clientSecretBuffer, expectedClientSecretBuffer)\n ) {\n return Err('Invalid client credentials');\n }\n\n return Ok({ clientId });\n}\n"],
|
|
5
|
-
"mappings": "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CACP,eAAgBA,EAAE,OAAO,CAAE,WAAYA,EAAE,OAAO,CAAE,CAAC,EACnD,MAAOA,EAAE,OAAO,OAAO,CACzB,CAAC,CACH,CACF,CAAC,EAEYa,GAAwBb,EAAE,MACrCA,EAAE,OAAO,CACP,oBAAqBI,GAA8B,SAAS,EAC5D,8BAA+BA,GAA8B,SAAS,EACtE,kCAAmCJ,EAAE,OAAO,CAAE,iBAAkBA,EAAE,OAAO,CAAE,CAAC,EAAE,SAAS,EACvF,wBAAyBA,EAAE,OAAO,CAAE,iBAAkBA,EAAE,OAAO,CAAE,CAAC,EAAE,SAAS,EAC7E,oBAAqBA,EAAE,OAAO,EAC9B,yBAA0BA,EAAE,OAAO,EACnC,KAAMA,EAAE,OAAO,CACjB,CAAC,CACH,EAEac,GAA8Bd,EAAE,OAAO,CAClD,SAAUC,GACV,cAAeI,GACf,kBAAmBC,GACnB,QAASN,EAAE,MAAMS,EAAiB,EAClC,cAAeT,EAAE,OAAO,OAAO,EAC/B,uBAAwBU,GACxB,iBAAkBC,GAClB,YAAaC,GACb,iBAAkBC,EACpB,CAAC,EAEYE,GAAgCf,EAAE,OAAO,CACpD,GAAIA,EAAE,OAAO,EACb,UAAWA,EAAE,OAAO,CACtB,CAAC,EAEYgB,GAAqBhB,EAAE,KAAK,CACvC,uBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,gBACF,CAAC,EAGYiB,GAAmBjB,EAAE,KAAK,CACrC,qBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,cACF,CAAC,EAGYkB,GAAyBlB,EAAE,KAAK,CAC3C,4BACA,qBACA,oBACF,CAAC,EAGYmB,GAA2BnB,EAAE,OAAO,CAC/C,eAAgBA,EAAE,OAAO,CACvB,QAASA,EAAE,OAAO,EAClB,QAASA,EAAE,OAAO,CAChB,cAAekB,GACf,UAAWlB,EAAE,OAAO,EACpB,SAAUgB,GACV,OAAQC,EACV,CAAC,EACD,MAAOjB,EAAE,OAAO,CACd,SAAUA,EAAE,OAAO,CACjB,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,UAAWA,EAAE,OAAO,EAAE,SAAS,EAC/B,cAAeA,EAAE,OAAO,EAAE,SAAS,CACrC,CAAC,EACD,OAAQA,EAAE,OAAO,CACf,WAAYA,EAAE,OAAO,CACnB,WAAYA,EAAE,OAAO,CACnB,GAAIA,EAAE,OAAO,CACf,CAAC,EACD,oBAAqBI,GACrB,iBAAkBJ,EAAE,QAAQ,CAC9B,CAAC,EACD,qBAAsBO,GACtB,kBAAmBD,GACnB,uBAAwBI,GACxB,iBAAkBC,GAClB,MAAOH,GAAiB,SAAS,CACnC,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,EAEYY,GAA4BpB,EAAE,OAAO,CAChD,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,MACVA,EAAE,OAAO,CACP,OAAQA,EAAE,OAAO,CACf,KAAMA,EAAE,OAAO,EACf,QAASA,EAAE,OAAO,EAClB,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,OAAQA,EAAE,OAAO,EAAE,SAAS,EAC5B,IAAKA,EAAE,IAAI,EAAE,SAAS,EACtB,MAAOA,EAAE,IAAI,EAAE,SAAS,EACxB,iBAAkBA,EAAE,OAAO,EAAE,SAAS,EACtC,SAAUA,EAAE,OAAO,EACnB,MAAOA,EAAE,OAAO,CAClB,CAAC,EACD,aAAcA,EAAE,OAAO,CACzB,CAAC,CACH,EACA,UAAWA,EAAE,MACXA,EAAE,OAAO,CACP,OAAQA,EAAE,OAAO,CACf,GAAIA,EAAE,OAAO,EACb,OAAQA,EAAE,OAAO,EAAE,SAAS,EAC5B,IAAKA,EAAE,IAAI,EAAE,SAAS,EACtB,cAAeA,EAAE,OAAO,EACxB,UAAWA,EAAE,OAAO,EAAE,SAAS,EAC/B,yBAA0BA,EAAE,OAAO,EAAE,SAAS,CAChD,CAAC,CACH,CAAC,CACH,CACF,CAAC,EAEYqB,GAA4BrB,EAAE,OAAO,CAChD,gBAAiBA,EAAE,OAAO,CACxB,OAAQA,EAAE,OAAO,CACf,eAAgBA,EAAE,MAAMoB,EAAyB,EACjD,WAAYpB,EAAE,QAAQ,EACtB,iBAAkBA,EAAE,OAAO,CAC7B,CAAC,CACH,CAAC,CACH,CAAC,EAIYsB,GAA6B,CAAC,MAAO,cAAe,QAAS,QAAQ,EAGrEC,GAAgC,CAC3C,wBACA,uBACA,yBACF,EDtVA,IAAMC,GAA4CC,GAAa,CAC7D,OAAQ,MACR,KAAM,qBACN,MAAO,gCACP,YAAa,kFACb,WAAY,CACV,CACE,KAAM,OACN,KAAM,QACN,OAAQC,EAAE,SAASA,EAAE,KAAKC,EAA6B,CAAC,EACxD,YAAa;AAAA;AAAA;AAAA,2FAIf,EACA,CACE,KAAM,YACN,KAAM,QACN,OAAQD,EAAE,SAASA,EAAE,OAAO,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,EACrD,YAAa,sDACf,EACA,CACE,KAAM,aACN,KAAM,QACN,OAAQA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC7B,YAAa,yEACf,CACF,EACA,SAAUA,EAAE,OAAO,CACjB,YAAaA,EAAE,MAAME,EAA2B,EAChD,gBAAiBF,EAAE,OAAO,EAAE,SAAS,EACrC,OAAQA,EAAE,OAAO,OAAO,EACxB,gBAAiBA,EAAE,OAAO,OAAO,CACnC,CAAC,CACH,CAAC,EAEKG,GAAgEJ,GAAa,CACjF,OAAQ,OACR,KAAM,gCACN,MAAO,oDACP,YACE,6FACF,WAAY,CACV,CACE,KAAM,iBACN,KAAM,OACN,OAAQC,EAAE,OAAO,CAAE,eAAgBA,EAAE,MAAMA,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAE,CAAC,EAC1E,YAAa,8CACf,EACA,CACE,KAAM,OACN,KAAM,QACN,OAAQA,EAAE,SAASA,EAAE,KAAKC,EAA6B,CAAC,EACxD,YAAa;AAAA;AAAA;AAAA,2FAIf,CACF,EACA,SAAUD,EAAE,OAAO,CACjB,YAAaA,EAAE,MAAME,EAA2B,CAClD,CAAC,CACH,CAAC,EAEKE,GAAqDL,GAAa,CACtE,OAAQ,MACR,KAAM,sDACN,MAAO,yCACP,YAAa,oFACb,WAAY,CACV,CACE,KAAM,0BACN,KAAM,OACN,OAAQC,EAAE,OAAO,EAAE,SAAS,CAC9B,CACF,EACA,SAAUA,EAAE,OAAO,CACjB,QAASA,EAAE,MAAMK,EAAiB,EAClC,gBAAiBL,EAAE,OAAO,CAC5B,CAAC,CACH,CAAC,EAEKM,GAA4CP,GAAa,CAC7D,OAAQ,OACR,KAAM,4BACN,MAAO,gCACP,YAAa,4DACb,WAAY,CACV,CACE,KAAM,aACN,KAAM,OACN,OAAQC,EAAE,OAAO,CAAE,WAAYA,EAAE,MAAMA,EAAE,OAAO,EAAE,SAAS,CAAC,CAAE,CAAC,CACjE,CACF,EACA,SAAUA,EAAE,OAAO,CACjB,QAASA,EAAE,MAAMK,EAAiB,CACpC,CAAC,CACH,CAAC,EAEKE,GAAyDR,GAAa,CAC1E,OAAQ,MACR,KAAM,uBACN,MAAO,6CACP,YAAa,8DACb,WAAY,CACV,CACE,KAAM,UACN,KAAM,QACN,OAAQC,EAAE,OAAO,EAAE,SAAS,CAC9B,CACF,EACA,SAAUA,EAAE,OAAO,CACjB,cAAeA,EAAE,MAAMQ,EAA6B,CACtD,CAAC,CACH,CAAC,EAEKC,GAAoDV,GAAa,CACrE,OAAQ,OACR,KAAM,+BACN,MAAO,wCACP,YAAa,4EACb,WAAY,CACV,CACE,KAAM,iBACN,KAAM,OACN,OAAQW,EACV,EACA,CACE,KAAM,cACN,KAAM,OACN,OAAQV,EAAE,KAAKW,EAA0B,CAC3C,CACF,EACA,SAAUC,EACZ,CAAC,EAEKC,GAAWC,GAAQ,CACvBL,GACAX,GACAK,GACAC,GACAG,GACAD,EACF,CAAC,EACYS,GAAY,CAAC,GAAGF,EAAQ,EzDnIrC,IAAqBG,GAArB,cAA0CC,CAAuC,CAC/E,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAS,EAAGF,CAAK,CAC7C,CAYA,8BAAgC,MAC9BG,EACAC,EACAC,IAOO,MAAMC,GAA0B,SAAY,CACjD,IAAMC,EAAW,MAAM,KAAK,WAAW,8BAA8B,CACnE,QAAS,CAAE,KAAAJ,EAAM,WAAYC,EAAW,UAAWC,CAAS,EAC5D,GAAG,KAAK,UACV,CAAC,EACD,MAAO,CACL,WAAY,CACV,gBAAiBE,EAAS,gBAC1B,OAAQA,EAAS,OACjB,gBAAiBA,EAAS,eAC5B,EACA,YAAaA,EAAS,aAAe,CAAC,CACxC,CACF,CAAC,EAWH,kDAAoD,MAClDC,EACAL,IAEO,MAAMG,GAA0B,UACpB,MAAM,KAAK,WAAW,kDACrC,CAAE,eAAgBE,CAAoB,EACtC,CAAE,QAAS,CAAE,KAAAL,CAAK,EAAG,GAAG,KAAK,UAAW,CAC1C,GACgB,aAAe,CAAC,CACjC,EAWH,uCAAyC,MACvCM,GAEO,MAAMH,GAA0B,UACpB,MAAM,KAAK,WAAW,uCAAuC,CAC5E,OAAQ,CAAE,wBAAAG,CAAwB,EAClC,GAAG,KAAK,UACV,CAAC,GACe,SAAW,CAAC,CAC7B,EAWH,8BAAgC,MAC9BC,GAEO,MAAMJ,GAA0B,UACpB,MAAM,KAAK,WAAW,8BACrC,CAAE,WAAYI,CAAU,EACxB,CAAE,GAAG,KAAK,UAAW,CACvB,GACgB,SAAW,CAAC,CAC7B,EAUH,2CAA6C,SAGpC,MAAMJ,GAA0B,UACpB,MAAM,KAAK,WAAW,2CAA2C,CAChF,QAAS,CAAE,QAAS,KAAK,MAAO,EAChC,GAAG,KAAK,UACV,CAAC,GACe,eAAiB,CAAC,CACnC,EAWH,sCAAwC,MACtCK,EACAC,IAEO,MAAMN,GAA0B,SACpB,MAAM,KAAK,WAAW,sCACrC,CAAE,eAAgBK,EAAc,cAAe,EAC/C,CAAE,OAAQ,CAAE,YAAaC,CAAW,EAAG,GAAG,KAAK,UAAW,CAC5D,GACmB,CAAC,CACrB,CAEL,EAIA,eAAeN,GAA6BO,EAAqD,CAC/F,GAAI,CACF,OAAO,IAAIC,GAAG,MAAMD,EAAS,CAAC,CAChC,OAASE,EAAO,CACd,GAAIC,GAAaD,CAAK,EAAG,CACvB,GAAIA,EAAM,UAAU,SAAW,IAC7B,OAAO,IAAIE,GAAI,gBAAgB,EAGjC,GACEF,EAAM,UAAU,SAAW,KAC3BA,EAAM,SAAS,QAAQ,qBAAuB,cAC9CA,EAAM,SAAS,QAAQ,kBAAoB,SAG3C,OAAO,IAAIE,GAAI,gBAAgB,CAEnC,CAEA,MAAMF,CACR,CACF,C2DhMA,OAAS,oBAAAG,GAAkB,UAAAC,OAAc,eACzC,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBCDhC,OAAS,WAAAC,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,OAAS,MCDlB,OAAS,KAAAC,OAAS,MAEX,IAAMC,GAAaD,GAAE,OAAO,CACjC,eAAgBA,GAAE,OAAO,CACvB,MAAOA,GAAE,OAAO,EAChB,MAAOA,GAAE,OAAO,CAClB,CAAC,EACD,eAAgBA,GAAE,OAAO,CAC3B,CAAC,ECRD,OAAS,KAAAE,OAAS,MAEX,IAAMC,GAAaD,GAAE,OAAO,CACjC,GAAIA,GAAE,OAAO,EACb,KAAMA,GAAE,OAAO,CACjB,CAAC,ECLD,OAAS,KAAAE,OAAS,MAEX,IAAMC,GAAaD,GAAE,OAAO,CACjC,GAAIA,GAAE,OAAO,EACb,KAAMA,GAAE,OAAO,CACjB,CAAC,EHED,IAAME,GAAgBC,GAAE,OAAO,CAC7B,KAAMC,GACN,KAAMC,EACR,CAAC,EAEKC,GAAwBC,GAAa,CACzC,OAAQ,MACR,KAAM,cACN,MAAO,gBACP,YAAa,mFACb,SAAUJ,GAAE,OAAO,CACjB,WAAAK,EACF,CAAC,CACH,CAAC,EAEKC,GAAkCF,GAAa,CACnD,OAAQ,MACR,KAAM,oBACN,MAAO,0BACP,YAAa,4DACb,SAAUJ,GAAE,OAAO,CAAE,QAASD,EAAc,CAAC,EAC7C,OAAQ,CACN,CACE,OAAQ,IACR,OAAQC,GAAE,OAAO,CACf,MAAOA,GAAE,OAAO,CACd,KAAMA,GAAE,OAAO,EACf,QAASA,GAAE,OAAO,EAClB,OAAQA,GAAE,OAAO,CACnB,CAAC,CACH,CAAC,CACH,CACF,CACF,CAAC,EAGKO,GAAYC,GAAQ,CAACL,GAAuBG,EAA+B,CAAC,EACrEG,GAAa,CAAC,GAAGF,EAAS,ED1BvC,IAAqBG,GAArB,cAA2CC,CAAwC,CACjF,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAU,EAAGF,CAAK,CAC9C,CAOA,cAAgB,UACN,MAAM,KAAK,WAAW,cAAc,GAAG,WAUjD,wBAA0B,SAErB,CACH,GAAI,CACF,IAAMG,EAAW,MAAM,KAAK,WAAW,wBAAwB,CAC7D,GAAG,KAAK,UACV,CAAC,EACD,OAAOC,GAAGD,EAAS,OAAO,CAC5B,OAASE,EAAO,CACd,OAAIC,GAAiB,KAAK,WAAW,IAAK,0BAA2BD,CAAK,EACjEE,GAAI,CAAE,KAAM,eAAgB,QAASF,EAAM,SAAS,KAAK,KAAM,CAAC,EAGrEG,GAAaH,CAAK,GAAKA,EAAM,SACxBE,GAAI,CAAE,KAAM,UAAW,QAASF,EAAM,SAAS,IAAK,CAAC,EAGvDE,GAAI,CAAE,KAAM,UAAW,QAASE,EAAoBJ,CAAK,CAAE,CAAC,CACrE,CACF,CACF,EK3DA,OAAS,UAAAK,OAAc,eCAvB,OAAS,WAAAC,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,MAAS,MCDlB,OAAS,KAAAC,MAAS,MAEX,IAAMC,GAAaD,EAAE,OAAO,CACjC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,OAAO,EACf,UAAWA,EAAE,OAAO,EACpB,UAAWA,EAAE,OAAO,EACpB,SAAUA,EACP,OAAO,CACN,GAAIA,EAAE,OAAO,CACf,CAAC,EACA,SAAS,EACZ,MAAOA,EACJ,OAAO,CACN,GAAIA,EAAE,OAAO,CACf,CAAC,EACA,SAAS,EACZ,QAASA,EACN,OAAO,CACN,GAAIA,EAAE,OAAO,CACf,CAAC,EACA,SAAS,EACZ,KAAMA,EAAE,OAAO,CAAE,IAAKA,EAAE,MAAMA,EAAE,OAAO,CAAE,MAAOA,EAAE,OAAO,CAAE,CAAC,CAAC,EAAE,SAAS,CAAE,CAAC,EAC3E,MAAOA,EACJ,OAAO,CACN,eAAgBA,EAAE,OAAO,OAAO,CAClC,CAAC,EACA,SAAS,CACd,CAAC,EDrBD,IAAME,GAAkBC,GAAa,CACnC,OAAQ,MACR,KAAM,+BACN,MAAO,UACP,YAAa,uCACb,SAAUC,EAAE,OAAO,CAAE,KAAMC,EAAW,CAAC,CACzC,CAAC,EAEKC,GAAwBH,GAAa,CACzC,OAAQ,MACR,KAAM,oCACN,MAAO,gBACP,YAAa,mFACb,SAAUC,EAAE,OAAO,CACrB,CAAC,EAEKG,GAAyBJ,GAAa,CAC1C,OAAQ,MACR,KAAM,qCACN,MAAO,iBACP,YAAa,0CACb,WAAY,CACV,CACE,KAAM,WACN,KAAM,QACN,OAAQC,EAAE,OAAO,EAAE,SAAS,EAC5B,YACE,8HACJ,EACA,CACE,KAAM,YACN,KAAM,QACN,OAAQA,EAAE,OAAO,EAAE,SAAS,EAC5B,YACE,8HACJ,EACA,CACE,KAAM,aACN,KAAM,QACN,OAAQA,EAAE,QAAQ,MAAM,EAAE,SAAS,EACnC,YACE,gNACJ,CACF,EACA,SAAUA,EAAE,OAAO,CACrB,CAAC,EAEKI,GAAgCL,GAAa,CACjD,OAAQ,MACR,KAAM,6CACN,MAAO,wBACP,YACE,2FACF,WAAY,CACV,CACE,KAAM,yBACN,KAAM,QACN,OAAQC,EAAE,QAAQ,EAAE,SAAS,EAC7B,YAAa,wDACf,CACF,EACA,SAAUA,EAAE,OAAO,CAAE,MAAOA,EAAE,OAAO,CAAE,KAAMA,EAAE,MAAMC,EAAU,CAAE,CAAC,CAAE,CAAC,CACvE,CAAC,EAEKI,GAA4BN,GAAa,CAC7C,OAAQ,MACR,KAAM,uBACN,MAAO,oBACP,YACE,uFACF,WAAY,CACV,GAAGO,GACH,CACE,KAAM,yBACN,KAAM,QACN,OAAQN,EAAE,QAAQ,EAAE,SAAS,EAC7B,YAAa,wDACf,EACA,CACE,KAAM,SACN,KAAM,QACN,OAAQA,EAAE,OAAO,EAAE,SAAS,EAC5B,YACE,sLACJ,CACF,EACA,SAAUA,EAAE,OAAO,CACjB,WAAYO,GACZ,MAAOP,EAAE,OAAO,CAAE,KAAMA,EAAE,MAAMC,EAAU,EAAE,SAAS,CAAE,CAAC,CAC1D,CAAC,CACH,CAAC,EAEKO,GAAWC,GAAQ,CACvBX,GACAI,GACAC,GACAC,GACAC,EACF,CAAC,EAEYK,GAAY,CAAC,GAAGF,EAAQ,ED5FrC,IAAqBG,GAArB,cAA0CC,CAAuC,CAC/E,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAS,EAAGF,CAAK,CAC7C,CAWA,QAAU,MAAO,CAAE,OAAAG,EAAQ,OAAAC,CAAO,KACxB,MAAM,KAAK,WAAW,QAAQ,CAAE,OAAQ,CAAE,OAAAA,EAAQ,OAAAD,CAAO,EAAG,GAAG,KAAK,UAAW,CAAC,GAAG,KAY7F,cAAgB,MAAO,CACrB,OAAAA,EACA,OAAAC,CACF,IAIS,MAAM,KAAK,WAAW,cAAc,CACzC,OAAQ,CAAE,OAAAA,EAAQ,OAAAD,CAAO,EACzB,GAAG,KAAK,UACV,CAAC,EAeH,eAAiB,MAAO,CACtB,OAAAA,EACA,OAAAC,EACA,MAAAC,EACA,OAAAC,EACA,WAAAC,CACF,IAOS,MAAM,KAAK,WAAW,eAAe,CAC1C,OAAQ,CAAE,OAAAH,EAAQ,OAAAD,CAAO,EACzB,QAAS,CAAE,SAAUE,EAAO,UAAWC,EAAQ,WAAAC,CAAW,EAC1D,GAAG,KAAK,WACR,aAAc,aAChB,CAAC,EAaH,sBAAwB,MAAO,CAC7B,WAAAC,EACA,OAAAJ,EACA,uBAAAK,CACF,KAMI,MAAM,KAAK,WAAW,sBAAsB,CAC1C,OAAQ,CAAE,OAAAL,EAAQ,WAAAI,CAAW,EAC7B,QAAS,CAAE,uBAAAC,CAAuB,EAClC,GAAG,KAAK,UACV,CAAC,GACD,MAAM,KAeV,kBAAoB,MAAO,CACzB,OAAAL,EACA,uBAAAK,EACA,OAAAC,EACA,SAAAC,EACA,WAAAC,CACF,IAM0D,CACxD,IAAMC,EAAW,MAAM,KAAK,WAAW,kBAAkB,CACvD,OAAQ,CAAE,OAAAT,CAAO,EACjB,QAAS,CAAE,uBAAAK,EAAwB,OAAAC,EAAQ,SAAAC,EAAU,WAAAC,CAAW,EAChE,GAAG,KAAK,UACV,CAAC,EACD,MAAO,CACL,WAAYC,EAAS,WACrB,MAAOA,EAAS,MAAM,MAAQ,CAAC,CACjC,CACF,CACF,EGvJA,OAAS,oBAAAC,GAAkB,UAAAC,GAAQ,eAAAC,OAAmB,eACtD,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBCDhC,OAAS,WAAAC,OAA0C,eACnD,OAAS,KAAAC,MAAS,MAElB,IAAMC,GAAaD,EAAE,OAAO,CAC1B,eAAgBA,EAAE,OAAO,EAAE,SAAS,EACpC,mBAAoBA,EAAE,OAAO,EAC7B,mBAAoBA,EAAE,OAAO,CAC/B,CAAC,EAEYE,GAAaF,EAAE,OAAO,CACjC,eAAgBA,EAAE,OAAO,EAAE,SAAS,EACpC,YAAaA,EAAE,MAAMC,EAAU,EAAE,SAAS,CAC5C,CAAC,EAEKE,GAAeH,EAAE,KAAK,CAAC,UAAW,QAAQ,CAAC,EAE3CI,GAAeJ,EAClB,OAAO,CACN,aAAcG,GACd,MAAOH,EAAE,QAAQ,EAAE,QAAQ,EAAK,CAClC,CAAC,EACA,QAAQ,EACR,YAAY,EAEFK,GAAsBL,EAChC,OAAO,CACN,WAAYE,GACZ,QAASE,GAAa,SAAS,CACjC,CAAC,EACA,YAAY,EAEFE,GAAWN,EAAE,KAAK,CAC7B,MACA,MACA,SACA,QACA,SACA,MACA,MACA,QACA,MACA,UACA,OACA,UACA,QACA,OACA,MACA,aACA,gBACA,cACA,aACA,YACA,MACA,OACA,aACF,CAAC,EAEKO,GAAWP,EAAE,KAAK,CACtB,UACA,OACA,SACA,WACA,UACA,OACA,UACA,SACF,CAAC,EAEKQ,GAAaR,EAAE,KAAK,CAAC,UAAW,QAAS,OAAQ,QAAS,SAAU,WAAY,OAAO,CAAC,EAExFS,GAAgBT,EACnB,OAAO,CACN,UAAWA,EAAE,OAAO,EACpB,aAAcA,EAAE,OAAO,EACvB,SAAUO,GACV,mBAAoBD,GACpB,YAAaN,EAAE,KAAK,CAAC,SAAU,MAAO,QAAS,cAAe,mBAAmB,CAAC,EAClF,QAASA,EAAE,OAAO,EAClB,eAAgBA,EAAE,OAAO,CAC3B,CAAC,EACA,QAAQ,EACR,YAAY,EAETU,GAAiBV,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,EAAGA,EAAE,QAAQ,EAAGA,EAAE,KAAK,CAAC,CAAC,EAExEW,GAAgBX,EAAE,OAAO,CAC7B,iBAAkBA,EAAE,OAAO,EAC3B,SAAUO,GAAS,QAAQ,CAAC,WAAY,UAAW,SAAS,CAAC,EAC7D,cAAeP,EAAE,OAAO,EAAE,SAAS,EACnC,MAAOU,EACT,CAAC,EAEKE,GAAYZ,EAAE,mBAAmB,gBAAiB,CACtDW,GAAc,OAAO,CAAE,cAAeX,EAAE,QAAQ,WAAW,CAAE,CAAC,EAAE,OAAO,EACvEW,GAAc,OAAO,CACnB,cAAeX,EAAE,QAAQ,MAAM,EAC/B,QAASA,EAAE,MAAMU,EAAc,CACjC,CAAC,EAAE,OAAO,EACVC,GAAc,OAAO,CACnB,cAAeX,EAAE,QAAQ,mBAAmB,EAC5C,MAAOA,EAAE,OAAO,EAAE,SAAS,EAC3B,QAASA,EAAE,OAAO,EAAE,QAAQ,EAC5B,QAASA,EAAE,OAAO,EAAE,QAAQ,EAC5B,YAAaA,EAAE,OAAO,EAAE,QAAQ,EAChC,WAAYQ,GAAW,QAAQ,CACjC,CAAC,EAAE,OAAO,EACVG,GAAc,OAAO,CACnB,cAAeX,EAAE,QAAQ,oBAAoB,EAC7C,MAAOA,EAAE,OAAO,EAAE,SAAS,EAC3B,IAAKA,EAAE,OAAO,EAAE,QAAQ,EACxB,IAAKA,EAAE,OAAO,EAAE,QAAQ,EACxB,KAAMA,EAAE,OAAO,EAAE,QAAQ,CAC3B,CAAC,EAAE,OAAO,CACZ,CAAC,EAEYa,GAAiBb,EAC3B,OAAO,CACN,KAAMA,EAAE,MAAMS,EAAa,EAC3B,UAAWT,EAAE,OAAO,CAClB,WAAYA,EAAE,MAAMY,EAAS,CAC/B,CAAC,CACH,CAAC,EACA,QAAQ,EACR,YAAY,EAKFE,GAAed,EACzB,OAAO,CACN,UAAWA,EAAE,OAAO,EACpB,QAASA,EAAE,OAAO,EAClB,SAAUA,EAAE,OAAO,EAAE,SAAS,CAAE,OAAQ,EAAK,CAAC,EAC9C,MAAOA,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAC1C,iBAAkBA,EAAE,OAAO,CAC7B,CAAC,EACA,QAAQ,EACR,YAAY,EAITe,GAAgBf,EAAE,KAAK,CAAC,MAAO,MAAM,CAAC,EAEtCgB,GAAYhB,EAAE,OAAO,CACzB,aAAcA,EAAE,OAAO,EACvB,WAAYA,EAAE,OAAO,EAAE,SAAS,EAChC,iBAAkBA,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAC5C,cAAee,GAAc,SAAS,EACtC,aAAcf,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAC1C,CAAC,EAEYiB,GAAQjB,EAAE,MAAM,CAC3BgB,GAAU,OAAO,EACjBA,GAAU,OAAO,CAAE,SAAUV,EAAS,CAAC,EAAE,OAAO,EAChDU,GAAU,OAAO,CAAE,YAAahB,EAAE,OAAO,CAAE,CAAC,EAAE,OAAO,CACvD,CAAC,EAEYkB,GAAclB,EAAE,MAAM,CACjCA,EAAE,OAAO,CAAE,aAAcA,EAAE,OAAO,CAAE,CAAC,EAAE,OAAO,EAC9CA,EAAE,OAAO,CAAE,aAAcA,EAAE,OAAO,EAAG,SAAUM,EAAS,CAAC,EAAE,OAAO,EAClEN,EAAE,OAAO,CAAE,YAAaA,EAAE,OAAO,CAAE,CAAC,EAAE,OAAO,CAC/C,CAAC,EAEKmB,GAAanB,EAAE,OAAO,CAC1B,MAAOkB,GACP,QAASlB,EAAE,QAAQ,EAAE,SAAS,CAChC,CAAC,EAEKoB,GAAmBpB,EAAE,OAAO,CAChC,MAAOA,EAAE,OAAO,CAAE,aAAcA,EAAE,OAAO,CAAE,CAAC,EAAE,OAAO,EACrD,QAASA,EAAE,QAAQ,EAAE,SAAS,CAChC,CAAC,EAEYqB,GAAYD,GAAiB,OAAO,CAC/C,WAAYpB,EAAE,QAAQ,KAAK,EAC3B,OAAQA,EAAE,MAAM,CAACA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAGA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAGA,EAAE,MAAMA,EAAE,QAAQ,CAAC,CAAC,CAAC,EAChF,QAASA,EAAE,QAAQ,EAAE,SAAS,CAChC,CAAC,EAEKsB,GAAyBF,GAAiB,OAAO,CACrD,WAAYpB,EAAE,QAAQ,MAAM,EAC5B,WAAYQ,GACZ,WAAYR,EAAE,OAAO,EAAE,SAAS,EAChC,aAAcA,EAAE,QAAQ,EAAE,SAAS,CACrC,CAAC,EAEKuB,GAAqBvB,EAAE,mBAAmB,gBAAiB,CAC/DsB,GAAuB,OAAO,CAAE,cAAetB,EAAE,QAAQ,SAAS,CAAE,CAAC,EAAE,OAAO,EAC9EsB,GAAuB,OAAO,CAAE,cAAetB,EAAE,QAAQ,MAAM,CAAE,CAAC,EAAE,OAAO,EAC3EsB,GAAuB,OAAO,CAAE,cAAetB,EAAE,QAAQ,MAAM,CAAE,CAAC,EAAE,OAAO,EAC3EsB,GAAuB,OAAO,CAAE,cAAetB,EAAE,QAAQ,QAAQ,CAAE,CAAC,EAAE,OAAO,EAC7EsB,GAAuB,OAAO,CAC5B,cAAetB,EAAE,QAAQ,OAAO,EAChC,OAAQA,EAAE,OAAO,EAAE,IAAI,CACzB,CAAC,EAAE,OAAO,EACVsB,GAAuB,OAAO,CAC5B,cAAetB,EAAE,QAAQ,OAAO,EAChC,OAAQA,EAAE,OAAO,EAAE,IAAI,CACzB,CAAC,EAAE,OAAO,CACZ,CAAC,EAEKwB,GAAkBJ,GAAiB,OAAO,CAC9C,WAAYpB,EAAE,QAAQ,OAAO,EAC7B,WAAYA,EAAE,OAAO,EAAE,SAAS,EAChC,SAAUA,EAAE,OAAO,EAAE,SAAS,EAC9B,SAAUA,EAAE,OAAO,EAAE,SAAS,EAC9B,QAASA,EAAE,QAAQ,EAAE,SAAS,CAChC,CAAC,EAEYyB,GAAczB,EAAE,MAAM,CACjCwB,GAAgB,OAAO,CAAE,WAAYxB,EAAE,OAAO,CAAE,CAAC,EAAE,OAAO,EAC1DwB,GAAgB,OAAO,CAAE,SAAUxB,EAAE,OAAO,CAAE,CAAC,EAAE,OAAO,EACxDwB,GAAgB,OAAO,CAAE,SAAUxB,EAAE,OAAO,CAAE,CAAC,EAAE,OAAO,CAC1D,CAAC,EAEK0B,GAAkCP,GAAW,OAAO,CACxD,WAAYnB,EAAE,QAAQ,wBAAwB,CAChD,CAAC,EAEK2B,GAA8B3B,EAAE,mBAAmB,yBAA0B,CACjF0B,GAAgC,OAAO,CACrC,uBAAwB1B,EAAE,QAAQ,OAAO,EACzC,IAAKA,EAAE,OAAO,EACd,IAAKA,EAAE,OAAO,EACd,aAAcA,EAAE,QAAQ,EAAE,SAAS,CACrC,CAAC,EAAE,OAAO,EACV0B,GAAgC,OAAO,CACrC,uBAAwB1B,EAAE,QAAQ,KAAK,EACvC,IAAKA,EAAE,OAAO,EACd,aAAcA,EAAE,QAAQ,EAAE,SAAS,CACrC,CAAC,EAAE,OAAO,EACV0B,GAAgC,OAAO,CACrC,uBAAwB1B,EAAE,QAAQ,KAAK,EACvC,IAAKA,EAAE,OAAO,EACd,aAAcA,EAAE,QAAQ,EAAE,SAAS,CACrC,CAAC,EAAE,OAAO,EACV0B,GAAgC,OAAO,CACrC,uBAAwB1B,EAAE,QAAQ,WAAW,CAC/C,CAAC,EAAE,OAAO,EACV0B,GAAgC,OAAO,CACrC,uBAAwB1B,EAAE,QAAQ,eAAe,CACnD,CAAC,EAAE,OAAO,CACZ,CAAC,EAEK4B,GAA6BT,GAAW,OAAO,CACnD,WAAYnB,EAAE,QAAQ,mBAAmB,CAC3C,CAAC,EAEK6B,GAAyB7B,EAAE,mBAAmB,yBAA0B,CAC5E4B,GAA2B,OAAO,CAChC,uBAAwB5B,EAAE,QAAQ,OAAO,EACzC,QAASA,EAAE,OAAO,EAClB,QAASA,EAAE,OAAO,EAClB,aAAcA,EAAE,QAAQ,EAAE,SAAS,CACrC,CAAC,EAAE,OAAO,EACV4B,GAA2B,OAAO,CAChC,uBAAwB5B,EAAE,QAAQ,KAAK,EACvC,QAASA,EAAE,OAAO,EAClB,aAAcA,EAAE,QAAQ,EAAE,SAAS,CACrC,CAAC,EAAE,OAAO,EACV4B,GAA2B,OAAO,CAChC,uBAAwB5B,EAAE,QAAQ,KAAK,EACvC,QAASA,EAAE,OAAO,EAClB,aAAcA,EAAE,QAAQ,EAAE,SAAS,CACrC,CAAC,EAAE,OAAO,EACV4B,GAA2B,OAAO,CAChC,uBAAwB5B,EAAE,QAAQ,WAAW,CAC/C,CAAC,EAAE,OAAO,EACV4B,GAA2B,OAAO,CAChC,uBAAwB5B,EAAE,QAAQ,eAAe,CACnD,CAAC,EAAE,OAAO,CACZ,CAAC,EAEY8B,GAAaX,GAAW,OAAO,CAC1C,WAAYnB,EAAE,QAAQ,KAAK,EAC3B,QAASA,EAAE,OAAO,EAAE,IAAI,EACxB,eAAgBkB,GAChB,UAAWlB,EAAE,KAAK,CAAC,MAAO,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,KAAK,CAC/D,CAAC,EAEY+B,GAAS/B,EAAE,MAAM,CAC5BqB,GAAU,OAAO,EACjBS,GAAW,OAAO,EAClB,GAAGL,GAAY,QACf,GAAGE,GAA4B,QAC/B,GAAGE,GAAuB,QAC1B,GAAGN,GAAmB,OACxB,CAAC,EAEYS,GAAQhC,EAAE,aAAa,CAClC,OAAQA,EAAE,MAAMiB,EAAK,EACrB,QAASjB,EAAE,MAAM+B,EAAM,EAAE,SAAS,CACpC,CAAC,EAEKE,GAAyB7B,GAAa,IAC1CJ,EACG,OAAO,CACN,aAAcA,EAAE,QAAQ,CAC1B,CAAC,EACA,QAAQ,EACR,YAAY,CACjB,EAEakC,GAAelC,EACzB,OAAO,CACN,WAAYE,GACZ,MAAO8B,GACP,QAASC,GAAuB,SAAS,CAC3C,CAAC,EACA,YAAY,EAEFE,GAAcnC,EACxB,OAAO,CACN,KAAMA,EAAE,MAAMA,EAAE,QAAQ,CAAC,CAC3B,CAAC,EACA,QAAQ,EACR,YAAY,EAIToC,GAAsBrC,GAAQ,CAClC,CACE,OAAQ,OACR,KAAM,oBACN,MAAO,kBACP,YAAa,iEACb,cAAe,OACf,WAAY,CACV,CACE,KAAM,OACN,KAAM,OACN,OAAQmC,EACV,CACF,EACA,SAAUC,GACV,OAAQ,CACN,CACE,OAAQ,UACR,OAAQrB,EACV,EACA,CACE,OAAQ,IACR,OAAQd,EAAE,IAAI,CAChB,CACF,CACF,EACA,CACE,OAAQ,OACR,KAAM,iBACN,MAAO,eACP,YACE,4JACF,cAAe,OACf,WAAY,CACV,CACE,KAAM,OACN,KAAM,OACN,OAAQK,EACV,CACF,EACA,SAAUQ,GACV,OAAQ,CACN,CACE,OAAQ,IACR,OAAQb,EAAE,IAAI,CAChB,CACF,CACF,EACA,CACE,OAAQ,MACR,KAAM,kBACN,MAAO,gBACP,YAAa,wEACb,cAAe,OACf,SAAUA,EAAE,OAAO,CACrB,CACF,CAAC,EAEYqC,GAAuB,CAClC,GAAGD,EACL,EDrWA,IAAqBE,GAArB,cAAqDC,CAEnD,CACA,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAoB,EAAGF,CAAK,CACxD,CAUA,gBAAkB,MAChBG,GACkF,CAClF,GAAI,CACF,OAAOC,GAAG,MAAM,KAAK,WAAW,gBAAgBD,EAAc,CAAE,GAAG,KAAK,UAAW,CAAC,CAAC,CACvF,OAASE,EAAO,CACd,GAAIC,GAAiB,KAAK,WAAW,IAAK,kBAAmBD,CAAK,EAChE,OAAIA,EAAM,SAAS,SAAW,IACrBE,GAAI,kBAAkB,EAGxBA,GAAIF,EAAM,SAAS,IAAI,EAGhC,GAAIA,aAAiBG,GACnB,OAAOD,GAAIF,CAAK,EAGlB,MAAMA,CACR,CACF,EAUA,aAAe,MACbI,GAC0D,CAC1D,GAAI,CACF,OAAOL,GAAG,MAAM,KAAK,WAAW,aAAaK,EAAqB,CAAE,GAAG,KAAK,UAAW,CAAC,CAAC,CAC3F,OAASJ,EAAO,CACd,GACEC,GAAiB,KAAK,WAAW,IAAK,eAAgBD,CAAK,GAC3DA,EAAM,SAAS,SAAW,IAE1B,OAAOE,GAAI,kBAAkB,EAG/B,MAAMF,CACR,CACF,CACF,EEpFA,OAAS,UAAAK,OAAc,eCAvB,OAAS,WAAAC,GAAS,gBAAAC,OAA+C,eACjE,OAAS,KAAAC,OAAS,MCDlB,OAAS,KAAAC,OAAS,MAKX,IAAMC,GAAiBC,GAAE,OAAO,CACrC,GAAIA,GAAE,OAAO,EACb,KAAMA,GAAE,OAAO,EACf,YAAaA,GAAE,OAAO,EAAE,SAAS,EACjC,WAAYA,GAAE,OAAO,EAAE,SAAS,EAChC,WAAYA,GAAE,OAAO,EACrB,QAASC,GAAc,SAAS,EAChC,SAAUD,GAAE,OAAO,QAAQ,EAC3B,cAAeA,GAAE,OAAO,EAAE,SAAS,EACnC,KAAMA,GAAE,OAAO,CAAE,IAAKA,GAAE,MAAMA,GAAE,OAAO,CAAE,MAAOA,GAAE,OAAO,CAAE,CAAC,CAAC,EAAE,SAAS,CAAE,CAAC,EAC3E,MAAOA,GAAE,SACPA,GAAE,OAAO,CACP,KAAMA,GAAE,MAAME,EAAU,CAC1B,CAAC,CACH,CACF,CAAC,EDbD,IAAMC,GAAsBC,GAAa,CACvC,OAAQ,MACR,KAAM,uCACN,MAAO,cACP,YACE,gGACF,SAAUC,GAAE,OAAO,CAAE,SAAUC,EAAe,CAAC,CACjD,CAAC,EAEKC,GAAgCH,GAAa,CACjD,OAAQ,MACR,KAAM,2BACN,MAAO,wBACP,YAAa,mCACb,WAAY,CACV,GAAGI,GACH,CACE,KAAM,SACN,KAAM,OACN,OAAQH,GAAE,OAAO,CACnB,EACA,CACE,KAAM,SACN,KAAM,QACN,OAAQA,GAAE,OAAO,EAAE,SAAS,EAC5B,YACE,0LACJ,CACF,EACA,SAAUA,GAAE,OAAO,CACjB,WAAYI,GACZ,UAAWJ,GAAE,OAAO,CAClB,SAAUA,GAAE,SAASA,GAAE,MAAMC,EAAc,CAAC,CAC9C,CAAC,CACH,CAAC,CACH,CAAC,EAEKI,GAAeC,GAAQ,CAACJ,GAA+BJ,EAAmB,CAAC,EAEpES,GAAgB,CAAC,GAAGF,EAAY,ED/B7C,IAAqBG,GAArB,cAA8CC,CAA2C,CACvF,YAAYC,EAAiBC,EAAoB,CAC/C,MAAM,IAAIC,GAAOF,EAASG,EAAa,EAAGF,CAAK,CACjD,CAWA,YAAc,MAAO,CACnB,WAAAG,EACA,OAAAC,CACF,KAKI,MAAM,KAAK,WAAW,YAAY,CAChC,OAAQ,CAAE,OAAAA,EAAQ,WAAAD,CAAW,EAC7B,GAAG,KAAK,UACV,CAAC,GACD,SAcJ,sBAAwB,MAAO,CAC7B,OAAAC,EACA,OAAAC,EACA,SAAAC,EACA,WAAAC,CACF,IAKkE,CAChE,IAAMC,EAAW,MAAM,KAAK,WAAW,sBAAsB,CAC3D,OAAQ,CAAE,OAAAJ,CAAO,EACjB,QAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,WAAAC,CAAW,EACxC,GAAG,KAAK,UACV,CAAC,EACD,MAAO,CACL,WAAYC,EAAS,WACrB,UAAWA,EAAS,UAAU,UAAY,CAAC,CAC7C,CACF,CACF,EGhDO,IAAMC,GAAN,MAAMC,CAAQ,CACX,OACS,MACA,SACA,uBAET,uBACA,oCACA,2BACA,oBACA,iBACA,cACA,eACA,yBACA,cACA,kBACR,OAAe,SAAW,OAElB,oBACA,qBAER,YACEC,EACAC,EAIA,CACA,KAAK,MAAQD,EACb,KAAK,SAAW,GAAG,KAAK,KAAK,QAAQD,EAAQ,QAAQ,GACrD,KAAK,uBAAyB,GAAG,KAAK,KAAK,SAC3C,KAAK,oBAAsBE,GAAS,mBACpC,KAAK,qBAAuBA,GAAS,mBACvC,CAEA,IAAY,OAAqB,CAC/B,GAAI,CAAC,KAAK,OACR,MAAM,IAAI,MAAM,+DAA+D,EAGjF,OAAO,KAAK,MACd,CAEA,IAAI,QAAiB,CACnB,OAAO,KAAK,MAAM,KAAK,EACzB,CAEA,IAAY,uBAA+C,CACzD,OAAK,KAAK,yBACR,KAAK,uBAAyB,IAAIC,GAAsB,KAAK,QAAQ,EACrE,KAAK,iBAAiB,KAAK,SAAU,KAAK,uBAAuB,YAAY,GAExE,KAAK,sBACd,CAEA,IAAY,oCAAyE,CACnF,OAAK,KAAK,sCACR,KAAK,oCAAsC,IAAIC,GAC7C,KAAK,SACL,KAAK,KACP,EACA,KAAK,iBAAiB,KAAK,SAAU,KAAK,oCAAoC,YAAY,GAErF,KAAK,mCACd,CAEA,IAAI,2BAAuD,CACzD,OAAK,KAAK,6BACR,KAAK,2BAA6B,IAAIC,GACpC,KAAK,uBACL,KAAK,KACP,EACA,KAAK,iBACH,KAAK,uBACL,KAAK,2BAA2B,YAClC,GAGK,KAAK,0BACd,CAEA,IAAI,oBAAyC,CAC3C,OAAK,KAAK,sBACR,KAAK,oBAAsB,IAAIC,GAAmB,KAAK,SAAU,KAAK,KAAK,EAC3E,KAAK,iBAAiB,KAAK,SAAU,KAAK,oBAAoB,YAAY,GAGrE,KAAK,mBACd,CAEA,IAAI,iBAAmC,CACrC,GAAI,CAAC,KAAK,iBAAkB,CAC1B,IAAMC,EAAU,GAAG,KAAK,KAAK,gBAC7B,KAAK,iBAAmB,IAAIC,GAAgBD,EAAS,KAAK,KAAK,EAC/D,KAAK,iBAAiBA,EAAS,KAAK,iBAAiB,YAAY,CACnE,CAEA,OAAO,KAAK,gBACd,CAEA,IAAI,cAA6B,CAC/B,OAAK,KAAK,gBACR,KAAK,cAAgB,IAAIE,GAAa,KAAK,uBAAwB,KAAK,KAAK,EAC7E,KAAK,iBAAiB,KAAK,uBAAwB,KAAK,cAAc,YAAY,GAG7E,KAAK,aACd,CAEA,IAAI,eAA+B,CACjC,OAAK,KAAK,iBACR,KAAK,eAAiB,IAAIC,GAAc,KAAK,SAAU,KAAK,KAAK,EACjE,KAAK,iBAAiB,KAAK,SAAU,KAAK,eAAe,YAAY,GAGhE,KAAK,cACd,CAEA,IAAI,yBAAmD,CACrD,GAAI,CAAC,KAAK,yBAA0B,CAClC,IAAMH,EAAU,GAAG,KAAK,KAAK,6BAC7B,KAAK,yBAA2B,IAAII,GAAwBJ,EAAS,KAAK,KAAK,EAC/E,KAAK,iBAAiBA,EAAS,KAAK,yBAAyB,YAAY,CAC3E,CAEA,OAAO,KAAK,wBACd,CAEA,IAAI,cAA6B,CAC/B,OAAK,KAAK,gBACR,KAAK,cAAgB,IAAIK,GAAa,KAAK,SAAU,KAAK,KAAK,EAC/D,KAAK,iBAAiB,KAAK,SAAU,KAAK,cAAc,YAAY,GAG/D,KAAK,aACd,CAEA,IAAI,kBAAqC,CACvC,OAAK,KAAK,oBACR,KAAK,kBAAoB,IAAIC,GAAiB,KAAK,SAAU,KAAK,KAAK,EACvE,KAAK,iBAAiB,KAAK,SAAU,KAAK,kBAAkB,YAAY,GAGnE,KAAK,iBACd,CAEA,OAAS,MAAOC,GAA0C,CACxD,KAAK,OAAS,MAAM,KAAK,sBAAsB,OAAOA,CAAU,CAClE,EAEA,QAAU,SAA2B,CACnC,MAAM,KAAK,mCAAmC,QAAQ,EACtD,KAAK,OAAS,MAChB,EAEA,eAAiB,CAACC,EAAqBC,IAAyB,CAC9D,IAAMC,EAAQF,EAAY,MAAM,GAAG,EACnC,GAAIE,EAAM,OAAS,EACjB,MAAM,IAAI,MAAM,8DAA8D,EAGhF,IAAMC,EAASD,EAAM,CAAC,EACtB,KAAK,OAAS,CACZ,KAAM,CACJ,GAAIC,CACN,EACA,KAAM,CACJ,GAAIF,CACN,EACA,MAAOD,CACT,CACF,EAEQ,iBAAmB,CAACR,EAAiBY,IAAyC,CACpFA,EAAa,QAAQ,IAClBC,IACC,KAAK,sBAAsB,CAAC,EAAE,CAC5B,QAAAb,EACA,GAAGc,GAA4BD,CAAM,CACvC,CAAC,EACMA,GAERE,IACC,KAAK,sBAAsB,CAAC,IAAIA,EAAOf,CAAO,EACvC,QAAQ,OAAOe,CAAK,EAE/B,EAEAH,EAAa,SAAS,IACnBI,IACC,KAAK,uBAAuB,CAAC,EAAE,CAC7B,QAAAhB,EACA,GAAGiB,GAA6BD,CAAQ,CAC1C,CAAC,EACMA,GAERD,IACC,KAAK,uBAAuB,CAAC,IAAIA,EAAOf,CAAO,EACxC,QAAQ,OAAOe,CAAK,EAE/B,CACF,CACF,ECvMA,IAAMG,GAA6B,MACjCC,EACAC,EACAC,EACAC,EACAC,IACqB,CACrB,IAAMC,EAAgBL,EAAO,QAAUI,GAAU,OACjDE,GAAUD,EAAe,wCAAwC,EAEjE,IAAME,EAAU,IAAIC,GAAQH,EAAe,CACzC,mBAAoB,CAClBI,GAAsBP,EAAQD,CAAS,EACvCS,GAA2BR,EAAQD,CAAS,CAC9C,EACA,oBAAqB,CACnBU,GAAuBT,EAAQD,CAAS,EACxCW,GAA4BV,EAAQD,CAAS,CAC/C,CACF,CAAC,EAED,GAAID,EAAO,OAAS,MAClB,MAAMO,EAAQ,OAAO,CACnB,KAAM,MACN,QAASP,EAAO,QAChB,SAAUA,EAAO,SACjB,SAAUA,EAAO,QACnB,CAAC,UACQA,EAAO,OAAS,eACzB,MAAMO,EAAQ,OAAO,CACnB,KAAM,eACN,SAAUP,EAAO,SACjB,SAAUa,GAAeb,EAAQI,CAAQ,EACzC,SAAUJ,EAAO,qBACjB,SAAUA,EAAO,qBACjB,YAAaA,EAAO,wBACpB,OAAQG,EACR,kBAAmBW,GAAwBd,EAAQI,CAAQ,CAC7D,CAAC,MACI,CACL,GAAI,CAACA,GAAU,aAAe,CAACA,GAAU,OACvC,MAAM,IAAI,MAAM,kDAAkD,EAGpEG,EAAQ,eAAeH,EAAS,YAAaA,EAAS,MAAM,CAC9D,CAEA,OAAOG,CACT,EAEaQ,EAAa,MAAU,CAClC,OAAAf,EACA,UAAAC,EACA,OAAAC,EACA,SAAAc,EACA,UAAAb,EACA,SAAAC,CACF,IAOkB,CAChB,IAAMG,EAAU,MAAMR,GACpBC,EACAC,EACAC,EACA,IAAI,IAAIC,CAAS,EACjBC,CACF,EACA,GAAI,CACF,OAAO,MAAMY,EAAST,CAAO,CAC/B,QAAE,CACIP,EAAO,OAAS,SAIlB,MAAMO,EAAQ,QAAQ,CAE1B,CACF,EAEaE,GACX,CAACP,EAAgBD,IAChBgB,IACCA,EAAQ,QAAQ,YAAY,EAAIC,GAAahB,CAAM,EACnDiB,GAAWjB,EAAQe,EAAShB,CAAS,EAC9BgB,GAGEP,GACX,CAACR,EAAgBD,IACjB,CAACmB,EAAOC,IAAY,CAClB,GAAI,CAACC,GAAaF,CAAK,GAAK,CAACA,EAAM,QAAS,CAC1CG,GAAI,MAAMrB,EAAQ,WAAWD,CAAS,uBAAuBuB,EAAoBJ,CAAK,CAAC,GAAI,CACzF,OAAQ,WACR,UAAAnB,CACF,CAAC,EACD,MACF,CAEA,GAAM,CAAE,QAAAgB,CAAQ,EAAIG,EACpBD,GACEjB,EACA,CACE,QAAAmB,EACA,GAAGI,GAA4BR,CAAO,CACxC,EACAhB,CACF,CACF,EAEWU,GACX,CAACT,EAAgBD,IAChByB,IACCC,GAAYzB,EAAQwB,EAAUzB,CAAS,EAChCyB,GAGEd,GACX,CAACV,EAAgBD,IACjB,CAACmB,EAAOC,IAAY,CAClB,GAAI,CAACC,GAAaF,CAAK,GAAK,CAACA,EAAM,SAAU,CAC3CG,GAAI,MACFrB,EACA,yBAAyBD,CAAS,uBAAuBuB,EAAoBJ,CAAK,CAAC,GACnF,CAAE,OAAQ,WAAY,UAAAnB,CAAU,CAClC,EACA,MACF,CAGA,GAAM,CAAE,SAAAyB,CAAS,EAAIN,EACrBO,GACEzB,EACA,CACE,QAAAmB,EACA,GAAGO,GAA6BF,CAAQ,CAC1C,EACAzB,CACF,CACF,EAEF,SAASkB,GAAWjB,EAAgBe,EAAmChB,EAA4B,CAEjG,IAAM4B,EADSC,EAAU,EACI,kBAAoBb,EAAUc,GAAYd,CAAO,EACxEe,EAAM,IAAI,IAAIH,EAAc,KAAO,GAAIA,EAAc,OAAO,EAC9DZ,EAAQ,QAAU,OAAO,KAAKA,EAAQ,MAAM,EAAE,OAAS,IACzDe,EAAI,OAAS,IAAI,gBAAgBf,EAAQ,MAAM,EAAE,SAAS,GAG5D,IAAMgB,EAAa,CACjB,KAAM,UACN,UAAAhC,EACA,OAAQ4B,EAAc,OACtB,IAAKG,EAAI,SAAS,EAClB,GAAIE,GAA4B,OAAO,GAAK,CAC1C,QAASL,EAAc,QACvB,KAAMA,EAAc,KACpB,OAAQA,EAAc,MACxB,CACF,EAEAN,GAAI,KAAKrB,EAAQ+B,EAAY,CAAE,OAAQ,WAAY,UAAAhC,CAAU,CAAC,CAChE,CAEA,SAAS0B,GACPzB,EACAwB,EACAzB,EACM,CAEN,IAAMkC,EADSL,EAAU,EACK,kBAAoBJ,EAAWU,GAAaV,CAAQ,EAC5EM,EAAM,IAAI,IAAIG,EAAe,KAAO,GAAIA,EAAe,OAAO,EAChET,EAAS,SAAS,QAAU,OAAO,KAAKA,EAAS,QAAQ,MAAM,EAAE,OAAS,IAC5EM,EAAI,OAAS,IAAI,gBAAgBN,EAAS,QAAQ,MAAM,EAAE,SAAS,GAErE,IAAMO,EAAa,CACjB,KAAM,WACN,UAAAhC,EACA,IAAK+B,EAAI,SAAS,EAClB,OAAQG,EAAe,OACvB,GAAID,GAA4B,OAAO,GAAK,CAC1C,QAASC,EAAe,QACxB,KAAMA,EAAe,IACvB,CACF,EAEAZ,GAAI,KAAKrB,EAAQ+B,EAAY,CAAE,OAAQ,WAAY,UAAAhC,CAAU,CAAC,CAChE,CAEA,SAASiB,GAAahB,EAAwB,CAC5C,IAAMmC,EAAiB,CAACC,EAAS,EACjC,GAAIpC,EAAO,WAAY,CACrB,GAAM,CAAE,KAAAqC,EAAM,QAAAC,CAAQ,EAAItC,EAAO,WAC7BqC,GACFF,EAAe,KAAKG,EAAU,IAAID,CAAI,IAAIC,CAAO,IAAM,IAAID,CAAI,GAAG,CAEtE,CACA,OAAOF,EAAe,KAAK,GAAG,CAChC,CAEA,SAASxB,GAAeb,EAAgBI,EAA+C,CACrF,OAAOJ,EAAO,YAAY,WAAW,mBAAoBI,GAAU,UAAY,EAAE,CACnF,CAEA,SAASU,GACPd,EACAI,EACyB,CACzB,IAAMqC,EAAOzC,EAAO,qBAAqB,WAAW,mBAAoBI,GAAU,UAAY,EAAE,EAChG,OAAO,KAAK,MAAMqC,GAAQ,IAAI,CAChC,CCrPA,OAAS,KAAAC,MAAS,MCAlB,OAAS,KAAAC,OAAS,MAEX,IAAMC,EAAkBC,GAC7BF,GACG,OAAO,CAAE,QAAS,GAAGE,CAAQ,cAAe,CAAC,EAC7C,SAAS,CAAE,QAAS,GAAGA,CAAQ,oBAAqB,CAAC,EDDnD,IAAMC,GAAqBC,EAC/B,OAAO,CACN,UAAWC,EAAe,WAAW,EACrC,aAAcA,EAAe,cAAc,EAC3C,cAAeA,EAAe,eAAe,EAC7C,eAAgBA,EAAe,gBAAgB,EAC/C,sBAAuBA,EAAe,uBAAuB,EAC7D,MAAOD,EAAE,OAAO,EAAE,SAAS,CAC7B,CAAC,EACA,UAAWE,IAAU,CACpB,SAAUA,EAAK,UACf,YAAaA,EAAK,aAClB,aAAcA,EAAK,cACnB,cAAeA,EAAK,eACpB,oBAAqBA,EAAK,sBAC1B,MAAOA,EAAK,KACd,EAAE,EAESC,GAAiBH,EAC3B,mBACC,aACA,CACEA,EAAE,OAAO,CACP,WAAYA,EAAE,QAAQ,oBAAoB,EAC1C,KAAMC,EAAe,MAAM,EAC3B,aAAcA,EAAe,cAAc,EAC3C,cAAeA,EAAe,eAAe,CAC/C,CAAC,EACDD,EAAE,OAAO,CACP,WAAYA,EAAE,QAAQ,eAAe,EACrC,cAAeC,EAAe,eAAe,CAC/C,CAAC,EACDD,EAAE,OAAO,CACP,WAAYA,EAAE,QAAQ,oBAAoB,CAC5C,CAAC,CACH,EACA,CACE,SAAU,CAACI,EAAOC,KAAS,CACzB,QACED,EAAM,OAAS,8BACX,sBAAsBA,EAAM,QAAQ,IAAKE,GAAQ,IAAI,OAAOA,CAAG,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,UAAUD,EAAI,KAAK,UAAU,KAC7GA,EAAI,YACZ,EACF,CACF,EACC,IACCL,EAAE,OAAO,CAEP,UAAWA,EAAE,OAAO,EAAE,SAAS,EAC/B,cAAeA,EAAE,OAAO,EAAE,SAAS,CACrC,CAAC,CACH,EACC,UAAWE,GAAS,CACnB,GAAM,CAAE,UAAAK,EAAW,cAAAC,CAAc,EAAIN,EAC/BO,EAAqB,CACzB,SAAUF,EACV,aAAcC,CAChB,EAEA,OAAIN,EAAK,aAAe,qBACf,CACL,UAAWA,EAAK,WAChB,KAAMA,EAAK,KACX,YAAaA,EAAK,aAClB,aAAcA,EAAK,cACnB,GAAGO,CACL,EAGEP,EAAK,aAAe,gBACf,CACL,UAAWA,EAAK,WAChB,aAAcA,EAAK,cACnB,GAAGO,CACL,EAGK,CACL,UAAWP,EAAK,WAChB,GAAGO,CACL,CACF,CAAC,EAEUC,GAAiBV,EAAE,OAAO,CACrC,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,MAAOA,EAAE,OAAO,EAAE,SAAS,EAC3B,MAAOA,EAAE,OAAO,EAAE,SAAS,CAC7B,CAAC,EAEYW,GAA+BX,EAAE,OAAO,CACnD,IAAKC,EAAe,KAAK,EACzB,IAAKA,EAAe,KAAK,EACzB,IAAKD,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAClC,IAAKC,EAAe,KAAK,EACzB,SAAUA,EAAe,UAAU,EACnC,cAAeA,EAAe,eAAe,EAE7C,cAAeD,EAAE,OAAO,EAAE,SAAS,CACrC,CAAC,EAEYY,GAAuBD,GAA6B,OAAO,CACtE,mBAAoBV,EAAe,oBAAoB,EACvD,oBAAqBA,EAAe,qBAAqB,EACzD,iBAAkBD,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAE/C,cAAeC,EAAe,eAAe,CAC/C,CAAC,EAKYY,GAAwBb,EAClC,OAAO,CACN,SAAUA,EAAE,OAAO,EACnB,OAAQA,EAAE,OAAO,EACjB,OAAQA,EAAE,OAAO,EACjB,YAAaA,EAAE,OAAO,EACtB,aAAcA,EAAE,OAAO,CACzB,CAAC,EACA,QAAQ,EEvHJ,IAAMc,EAAsBC,GAAgE,CACjG,GAAI,CAACA,EACH,OAGF,IAAMC,EAAkBC,GAAsB,UAAUF,EAAS,KAAK,EACtE,GAAKC,EAAgB,QAIrB,OAAOA,EAAgB,IACzB,ECZA,OAAS,eAAAE,OAAmB,eAG5B,OAAS,aAAAC,GAAW,kBAAAC,OAAsB,uBCNnC,IAAMC,GAAN,KAAkB,CACN,UAEjB,YAAYC,EAAmB,CAC7B,KAAK,UAAYA,CACnB,CAEA,KAAS,CACP,OAAO,KAAK,UAAU,CACxB,CACF,EDyFO,IAAMC,EAAN,KAA6D,CAClE,OACA,KACA,YACA,aACA,YACA,cACA,SAEA,YAAY,CACV,OAAAC,EACA,KAAAC,EACA,YAAAC,EACA,aAAAC,EACA,YAAAC,EACA,cAAAC,EACA,SAAAC,CACF,EAAqB,CACnB,KAAK,OAASN,EACd,KAAK,KAAOC,EACZ,KAAK,YAAcC,aAAuBK,GAAWL,EAAY,IAAI,EAAIA,EACzE,KAAK,aAAeC,aAAwBI,GAAWJ,EAAa,IAAI,EAAIA,EAC5E,KAAK,YAAcC,aAAuBG,GAAWH,EAAY,IAAI,EAAIA,EACzE,KAAK,cAAgBC,aAAyBE,GAAWF,EAAc,IAAI,EAAIA,EAC/E,KAAK,SAAWC,aAAoBC,GAAWD,EAAS,IAAI,EAAIA,CAClE,CAEA,cAAc,CACZ,UAAAE,EACA,KAAAC,EACA,SAAAC,CACF,EAIS,CACPC,GAAI,MACF,KAAK,OACLC,GAAkB,CAChB,UAAAJ,EACA,SAAU,KAAK,KACf,KAAAC,EACA,SAAAC,CACF,CAAC,CACH,CACF,CAkBA,MAAM,cAAoB,CACxB,UAAAF,EACA,KAAAC,EACA,SAAAI,EACA,SAAAP,EACA,iBAAAQ,EACA,aAAAC,EACA,uBAAAC,CACF,EAA6D,CAC3D,IAAMN,EAAWG,GAAU,MACvBI,GAAsB,UAAUJ,EAAS,KAAK,EAAE,MAAM,SACtD,OAIJ,GAFA,KAAK,cAAc,CAAE,UAAAL,EAAW,KAAAC,EAAM,SAAAC,CAAS,CAAC,EAE5CD,EACF,GAAI,CACF,KAAK,gBAAgBA,CAAI,CAC3B,OAASS,EAAO,CACd,OAAOC,GAAeX,EAAWU,CAAK,CACxC,CAGF,GAAI,CACF,IAAME,EAAS,MAAMd,EAAS,EAE9B,GAAIc,EAAO,KAAK,EAAG,CACjB,IAAMC,EAAoB,MAAML,EAAuBI,EAAO,KAAK,EAEnE,OAAIC,EAAkB,OAAS,UACtB,CACL,QAASA,EAAkB,OAAS,QACpC,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAMA,EAAkB,OAAQ,CAAC,CAC7D,EAGEP,EACKA,EAAiBO,EAAkB,MAAM,EAG3C,CACL,QAAS,GACT,QAAS,CACP,CACE,KAAM,OACN,KAAM,KAAK,UAAUA,EAAkB,MAAM,CAC/C,CACF,CACF,CACF,CAEA,OAAID,EAAO,iBAAiBE,GACnBH,GAAeX,EAAWY,EAAO,KAAK,EAG3CL,EACK,CACL,QAAS,GACT,QAAS,CACP,CACE,KAAM,OACN,KAAMA,EAAaK,EAAO,KAAK,CACjC,CACF,CACF,EAEOD,GAAeX,EAAWY,EAAO,KAAK,CAEjD,OAASF,EAAO,CACd,OAAOC,GAAeX,EAAWU,CAAK,CACxC,CACF,CACF,EAEA,SAASC,GAAeX,EAAsBU,EAAgC,CAC5E,GAAIA,aAAiBI,IAAeC,GAAeL,EAAM,KAAK,EAAG,CAO/D,IAAMM,EAAkBC,GAAUP,EAAM,KAAK,EAC7C,MAAO,CACL,QAAS,GACT,QAAS,CACP,CACE,KAAM,OACN,KAAM,KAAK,UAAU,CACnB,KAAMA,EAAM,KACZ,QAASM,EAAgB,SAAS,CACpC,CAAC,CACH,CACF,CACF,CACF,CAEA,MAAO,CACL,QAAS,GACT,QAAS,CACP,CACE,KAAM,OACN,KAAM,cAAchB,CAAS,YAAYkB,EAAoBR,CAAK,CAAC,EACrE,CACF,CACF,CACF,CElQO,SAASS,GAAmBC,EAA0B,CAC3D,IAAMC,EAAc,IAAI,IACxB,OAAOD,EACJ,QAASE,GACJD,EAAY,IAAIC,EAAS,MAAM,EAC1B,CAAC,GAEVD,EAAY,IAAIC,EAAS,MAAM,EACxBA,EAAS,QAAUA,EAAS,cAAgB,IAAIA,EAAS,aAAa,GAAK,IACnF,EACA,KAAK,GAAG,CACb,CAEO,SAASC,GAAkBC,EAAqC,CACrE,IAAMC,EAAmC,CAAC,EAC1C,GAAID,EAAO,aACT,GAAIA,EAAO,aAAa,SAAW,EACjCC,EAAkB,KAAK,WAAWD,EAAO,aAAa,CAAC,CAAC,EAAE,MACrD,CACL,IAAME,EAAY,IAAI,IACtB,QAAWC,KAAQH,EAAO,aACxBE,EAAU,IAAIC,CAAI,EAEpBF,EAAkB,KAAK,YAAY,MAAM,KAAKC,CAAS,EAAE,KAAK,GAAG,CAAC,GAAG,CACvE,CAEF,GAAIF,EAAO,SACT,GAAIA,EAAO,SAAS,SAAW,EAC7BC,EAAkB,KAAK,cAAcD,EAAO,SAAS,CAAC,CAAC,EAAE,MACpD,CACL,IAAMI,EAAU,IAAI,IACpB,QAAWC,KAAML,EAAO,SACtBI,EAAQ,IAAIC,CAAE,EAEhBJ,EAAkB,KAAK,eAAe,MAAM,KAAKG,CAAO,EAAE,KAAK,GAAG,CAAC,GAAG,CACxE,CAEF,GAAIJ,EAAO,aACT,GAAI,MAAM,QAAQA,EAAO,YAAY,EACnC,GAAIA,EAAO,aAAa,SAAW,EACjCC,EAAkB,KAAK,mBAAmBD,EAAO,aAAa,CAAC,CAAC,EAAE,MAC7D,CACL,IAAMM,EAAoB,IAAI,IAC9B,QAAWC,KAAgBP,EAAO,aAChCM,EAAkB,IAAIC,CAAY,EAEpCN,EAAkB,KAAK,oBAAoB,MAAM,KAAKK,CAAiB,EAAE,KAAK,GAAG,CAAC,GAAG,CACvF,SACSN,EAAO,aAAa,WAAaA,EAAO,aAAa,QAAS,CACvE,IAAIQ,EAAYR,EAAO,aAAa,UAChCS,EAAUT,EAAO,aAAa,QAE9BQ,EAAYC,IACdD,EAAYR,EAAO,aAAa,QAChCS,EAAUT,EAAO,aAAa,WAEhCC,EAAkB,KAAK,oBAAoBO,CAAS,EAAE,EACtDP,EAAkB,KAAK,oBAAoBQ,CAAO,EAAE,CACtD,MAAWT,EAAO,aAAa,UAC7BC,EAAkB,KAAK,oBAAoBD,EAAO,aAAa,SAAS,EAAE,EACjEA,EAAO,aAAa,SAC7BC,EAAkB,KAAK,oBAAoBD,EAAO,aAAa,OAAO,EAAE,EAI5E,OAAOC,EAAkB,KAAK,GAAG,CACnC,CAEO,SAASS,GACdC,EACqC,CACrC,IAAIC,EAAqD,CAAC,EAC1D,GAAID,EAAS,MACX,QAAWE,KAAQF,EAAS,MAC1BC,EAAc,KAAKE,GAA4BD,EAAK,OAAO,CAAC,EAKhE,IAAME,EAAyB,IAAI,IACjCH,EACG,OAAQC,GAASA,EAAK,OAAS,mBAAmB,EAClD,IAAKA,GAASA,EAAK,cAAc,EACjC,OAAQG,GAA6C,OAAOA,GAAmB,QAAQ,CAC5F,EAEAJ,EAAgBA,EAAc,OAAQC,GAChCA,EAAK,OAAS,aACT,OAAOA,EAAK,MAAS,UAAY,CAACE,EAAuB,IAAIF,EAAK,IAAI,EAGxE,EACR,EAGD,QAAWA,KAAQD,EACbC,EAAK,OAAS,sBAChBA,EAAK,KAAO,aACZA,EAAK,KAAOA,EAAK,eACjB,OAAOA,EAAK,gBAIhB,OAAOD,CACT,CAsCA,SAASE,GACPG,EAC6C,CAC7C,IAAMC,EAA+C,CAAC,EACtD,OAAID,EAAQ,eACVC,EAAe,aAAeD,EAAQ,cAEpCA,EAAQ,YACVC,EAAe,UAAYD,EAAQ,WAEjCA,EAAQ,UACVC,EAAe,QAAUD,EAAQ,SAE/BA,EAAQ,sBACVC,EAAe,oBAAsBD,EAAQ,qBAE3CA,EAAQ,OACVC,EAAe,KAAOD,EAAQ,MAE5BA,EAAQ,UACVC,EAAe,QAAUD,EAAQ,SAE/BA,EAAQ,QACVC,EAAe,MAAQD,EAAQ,OAE7BA,EAAQ,YACVC,EAAe,UAAYD,EAAQ,WAEjCA,EAAQ,gBACNA,EAAQ,OAAS,OACnBC,EAAe,mBAAqBD,EAAQ,cAE5CC,EAAe,cAAgBD,EAAQ,eAGvCA,EAAQ,OACVC,EAAe,KAAOD,EAAQ,MAE5BA,EAAQ,eACVC,EAAe,aAAeD,EAAQ,cAEpCA,EAAQ,UAAU,SACpBC,EAAe,SAAWD,EAAQ,UAEhCA,EAAQ,WAAa,OACvBC,EAAe,eAAiBD,EAAQ,WAEtCA,EAAQ,gBAAkB,OAC5BC,EAAe,eAAiBD,EAAQ,gBAEtCA,EAAQ,MAAM,SAChBC,EAAe,KAAOD,EAAQ,MAE5BA,EAAQ,YACVC,EAAe,UAAYD,EAAQ,WAEjCA,EAAQ,cACVC,EAAe,YAAcD,EAAQ,aAEnCA,EAAQ,oBAAsB,OAChCC,EAAe,mBAAqBD,EAAQ,oBAE1CA,EAAQ,yBAA2B,OACrCC,EAAe,wBAA0BD,EAAQ,yBAE/CA,EAAQ,eAAiB,OAC3BC,EAAe,cAAgBD,EAAQ,eAErCA,EAAQ,uBAAyB,OACnCC,EAAe,sBAAwBD,EAAQ,uBAE7CA,EAAQ,iBACVC,EAAe,eAAiBD,EAAQ,gBAEtCA,EAAQ,aAAe,OACzBC,EAAe,YAAcD,EAAQ,aAEnCA,EAAQ,aAAe,OACzBC,EAAe,YAAcD,EAAQ,aAEnCA,EAAQ,qBACVC,EAAe,mBAAqBD,EAAQ,oBAE1CA,EAAQ,mBACVC,EAAe,iBAAmBD,EAAQ,kBAExCA,EAAQ,yBAA2B,OACrCC,EAAe,wBAA0BD,EAAQ,yBAE/CA,EAAQ,wBAA0B,OACpCC,EAAe,uBAAyBD,EAAQ,wBAE9CA,EAAQ,6BAA+B,OACzCC,EAAe,4BAA8BD,EAAQ,6BAEnDA,EAAQ,iBACVC,EAAe,eAAiBD,EAAQ,gBAEtCA,EAAQ,6BAA+B,OACzCC,EAAe,4BAA8BD,EAAQ,6BAEhDC,CACT,CAEO,SAASC,GAAuB,CACrC,MAAAC,EACA,eAAAC,CACF,EAG2D,CACzD,GAAID,EAAM,SAAW,EACnB,MAAO,CACL,KAAM,QACN,QACE,6FACJ,EAGF,GAAM,CAAE,WAAAE,EAAY,cAAAC,EAAe,YAAAC,CAAY,EAAIH,EA2CnD,OAzCIC,IACFF,EAAQA,EAAM,OAAQP,GAChB,UAAOA,EAAK,WAAc,UAAYS,EAAW,IAAIT,EAAK,UAAU,SAAS,CAAC,EAQnF,GAGCU,IACFH,EAAQA,EAAM,OAAQP,GAElB,EAAAA,EAAK,OAAS,cACd,OAAOA,EAAK,MAAS,UACrB,CAACU,EAAc,IAAIV,EAAK,IAAI,EAM/B,GAGCW,IACFJ,EAAQA,EAAM,OAAQP,GAElB,EAAAA,EAAK,OAAS,YACd,OAAOA,EAAK,MAAS,UACrB,CAACW,EAAY,IAAIX,EAAK,IAAI,EAM7B,GAGCO,EAAM,SAAW,EACZ,CACL,KAAM,QACN,QAAS,CACP,yFACA,0FACF,EAAE,KAAK,GAAG,CACZ,EAGK,CACL,KAAM,UACN,OAAQA,CACV,CACF,CnGnTA,IAAMK,GAAe,CACnB,MAAOC,GAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAC7C,MAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAG,EAAE,SAAS,EAC/D,QAASC,GAAc,SAAS,EAChC,OAAQC,GAA0B,SAAS,CAC7C,EAEaC,GAAwBC,GAA8C,CACjF,IAAMC,EAAoB,IAAIC,EAAK,CACjC,OAAAF,EACA,KAAM,iBACN,YAAa,inEAyBb,aAAAL,GACA,YAAa,CACX,MAAO,iBACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,MAAAQ,EAAO,MAAAC,EAAO,QAAAC,EAAS,OAAAC,CAAO,EAChC,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACnBC,EAAgBN,EAAUO,GAAmBP,CAAO,EAAI,OACxDQ,EAAeP,EAASQ,GAAkBR,CAAM,EAAI,OAC1D,OAAO,MAAML,EAAkB,cAAmD,CAChF,UAAAM,EACA,SAAAC,EACA,KAAM,CAAC,EACP,SAAU,SACD,IAAIO,GACT,MAAMC,EAAW,CACf,OAAAP,EACA,UAAAF,EACA,OAAAP,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAUiB,EAAmBT,CAAQ,EACrC,SAAU,MAAOU,GAAY,CAC3B,IAAMC,EAAW,MAAMD,EAAQ,0BAA0B,cAAc,CACrE,MAAAf,EACA,KAAM,EACN,MAAOM,EAAO,eACV,KAAK,IAAIA,EAAO,eAAgBL,GAAS,GAAG,EAC3CA,GAAS,IACd,QAASO,EACT,OAAQE,CACV,CAAC,EACD,OAAOO,GAA4BD,CAAQ,CAC7C,CACF,CAAC,CACH,EAEF,uBAAyBE,GACvBC,GAAuB,CAAE,MAAAD,EAAO,eAAgBZ,EAAO,cAAe,CAAC,CAC3E,CAAC,CACH,CACF,CAAC,EAED,OAAOR,CACT,EoGvGA,OAAS,OAAAsB,GAAK,MAAAC,OAAU,gBACxB,OAAS,KAAAC,OAAS,MCFX,SAASC,IAA2C,CACzD,MAAO,CACL,6DACA,0KACF,EAAE,KAAK,GAAG,CACZ,CCaA,IAAMC,GAAN,MAAMC,CAAsB,CAClB,mBACA,sBACA,oBAES,qBACA,mBACA,eAEjB,OAAO,QAAgC,CACrC,OAAO,IAAIA,CACb,CAEA,OAAO,iBAAiBC,EAAuD,CAC7E,OAAO,IAAID,EAAsBC,CAAc,CACjD,CAGQ,YAAYA,EAAiC,CAEnD,KAAK,mBAAqBA,GAAgB,WAC1C,KAAK,sBAAwBA,GAAgB,cAC7C,KAAK,oBAAsBA,GAAgB,YAE3C,KAAK,qBAAuB,IAAI,IAChC,KAAK,mBAAqB,IAAI,IAC9B,KAAK,eAAiB,IAAI,GAC5B,CAEA,IAAY,mBAAwC,CAClD,OAAI,KAAK,qBAAuB,SAC9B,KAAK,mBAAqBC,EAAU,EAAE,eAAe,YAGhD,KAAK,kBACd,CAEA,IAAY,sBAA2C,CACrD,OAAI,KAAK,wBAA0B,SACjC,KAAK,sBAAwBA,EAAU,EAAE,eAAe,eAGnD,KAAK,qBACd,CAEA,IAAY,oBAAyC,CACnD,OAAI,KAAK,sBAAwB,SAC/B,KAAK,oBAAsBA,EAAU,EAAE,eAAe,aAGjD,KAAK,mBACd,CAEA,MAAM,oBAAoB,CACxB,eAAAC,EACA,YAAAC,CACF,EAG2B,CACzB,IAAMC,EAAS,MAAM,KAAK,qBAAqB,CAC7C,eAAAF,EACA,YAAAC,CACF,CAAC,EAED,OAAK,KAAK,mBAER,KAAK,qBAAqB,IAAID,EAAgBE,CAAM,EAG/CA,CACT,CAEA,MAAM,kBAAkB,CACtB,WAAAC,EACA,YAAAF,CACF,EAGqC,CACnC,IAAMC,EAAS,MAAM,KAAK,mBAAmB,CAC3C,WAAAC,EACA,YAAAF,CACF,CAAC,EAED,OAAK,KAAK,mBAER,KAAK,mBAAmB,IAAIE,EAAYD,CAAM,EAGzCA,CACT,CAEA,MAAM,cAAc,CAClB,OAAAE,EACA,YAAAH,CACF,EAG2B,CACzB,IAAMC,EAAS,MAAM,KAAK,eAAe,CACvC,OAAAE,EACA,YAAAH,CACF,CAAC,EAED,OAAK,KAAK,mBAER,KAAK,eAAe,IAAIG,EAAQF,CAAM,EAGjCA,CACT,CAEA,MAAc,qBAAqB,CACjC,eAAAF,EACA,YAAa,CAAE,OAAAK,EAAQ,UAAAC,EAAW,OAAAC,CAAO,CAC3C,EAG2B,CACzB,IAAMC,EAAe,KAAK,qBAAqB,IAAIR,CAAc,EACjE,GAAIQ,EACF,OAAOA,EAGT,GAAI,KAAK,sBAAwB,CAAC,KAAK,qBAAqB,IAAIR,CAAc,EAC5E,MAAO,CACL,QAAS,GACT,QAAS,CACP,8FACA,qCAAqCA,CAAc,kBACrD,EAAE,KAAK,GAAG,CACZ,EAGF,GAAI,KAAK,kBACP,GAAI,CACF,IAAMS,EAAsB,MAAMC,EAAW,CAC3C,OAAAL,EACA,UAAAC,EACA,OAAAC,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAU,MAAOI,IACI,MAAMA,EAAQ,mBAAmB,gBAAgB,CAClE,OAAQA,EAAQ,OAChB,aAAcX,CAChB,CAAC,GAEiB,QAAQ,EAE9B,CAAC,EAED,GAAI,CAAC,KAAK,kBAAkB,IAAIS,CAAmB,EACjD,MAAO,CACL,QAAS,GACT,QAAS,CACP,8FACA,4BAA4BT,CAAc,sEAC5C,EAAE,KAAK,GAAG,CACZ,CAEJ,OAASY,EAAO,CACd,MAAO,CACL,QAAS,GACT,QAAS,CACP,8FACA,gEAAgEZ,CAAc,6BAC9Ea,EAAoBD,CAAK,CAC3B,EAAE,KAAK,GAAG,CACZ,CACF,CAGF,MAAO,CAAE,QAAS,EAAK,CACzB,CAEA,MAAc,mBAAmB,CAC/B,WAAAT,EACA,YAAa,CAAE,OAAAE,EAAQ,UAAAC,EAAW,OAAAC,CAAO,CAC3C,EAGqC,CACnC,IAAMC,EAAe,KAAK,mBAAmB,IAAIL,CAAU,EAC3D,GAAIK,EACF,OAAOA,EAGT,GAAI,KAAK,oBAAsB,CAAC,KAAK,mBAAmB,IAAIL,CAAU,EACpE,MAAO,CACL,QAAS,GACT,QAAS,CACP,2FACA,mCAAmCA,CAAU,kBAC/C,EAAE,KAAK,GAAG,CACZ,EAGF,IAAIW,EACJ,GAAI,KAAK,kBACP,GAAI,CAgBF,GAfAA,EAAW,MAAMJ,EAAW,CAC1B,OAAAL,EACA,UAAAC,EACA,OAAAC,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAU,MAAOI,GACE,MAAMA,EAAQ,iBAAiB,YAAY,CAC1D,OAAQA,EAAQ,OAChB,WAAAR,CACF,CAAC,CAIL,CAAC,EAEG,CAAC,KAAK,kBAAkB,IAAIW,EAAS,SAAS,IAAM,EAAE,EACxD,MAAO,CACL,QAAS,GACT,QAAS,CACP,2FACA,0BAA0BX,CAAU,sEACtC,EAAE,KAAK,GAAG,CACZ,CAEJ,OAASS,EAAO,CACd,MAAO,CACL,QAAS,GACT,QAAS,CACP,2FACA,8DAA8DT,CAAU,6BACxEU,EAAoBD,CAAK,CAC3B,EAAE,KAAK,GAAG,CACZ,CACF,CAGF,MAAO,CAAE,QAAS,GAAM,QAASE,CAAS,CAC5C,CAEA,MAAc,eAAe,CAC3B,OAAAV,EACA,YAAa,CAAE,OAAAC,EAAQ,UAAAC,EAAW,OAAAC,CAAO,CAC3C,EAG2B,CACzB,IAAMC,EAAe,KAAK,eAAe,IAAIJ,CAAM,EACnD,GAAII,EACF,OAAOA,EAGT,IAAIO,EAAiB,GACjBC,EAAgB,GAEpB,GAAI,KAAK,mBACP,GAAI,CACF,IAAMC,EAAO,MAAMP,EAAW,CAC5B,OAAAL,EACA,UAAAC,EACA,OAAAC,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAU,MAAOI,GACR,MAAMA,EAAQ,aAAa,QAAQ,CACxC,OAAQA,EAAQ,OAChB,OAAAP,CACF,CAAC,CAEL,CAAC,EAKD,GAHAW,EAAiBE,EAAK,UAAU,IAAM,GACtCD,EAAgBC,EAAK,SAAS,IAAM,GAEhC,CAAC,KAAK,mBAAmB,IAAIF,CAAc,EAC7C,MAAO,CACL,QAAS,GACT,QAAS,CACP,2FACA,sBAAsBX,CAAM,uEAC9B,EAAE,KAAK,GAAG,CACZ,CAEJ,OAASQ,EAAO,CACd,MAAO,CACL,QAAS,GACT,QAAS,CACP,2FACA,kFAAkFR,CAAM,8BACxFS,EAAoBD,CAAK,CAC3B,EAAE,KAAK,GAAG,CACZ,CACF,CAGF,GAAI,KAAK,kBACP,GAAI,CAkBF,GAjBAI,EACEA,GACC,MAAMN,EAAW,CAChB,OAAAL,EACA,UAAAC,EACA,OAAAC,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAU,MAAOI,IACF,MAAMA,EAAQ,aAAa,QAAQ,CAC9C,OAAQA,EAAQ,OAChB,OAAAP,CACF,CAAC,GAEW,SAAS,IAAM,EAE/B,CAAC,EAEC,CAAC,KAAK,kBAAkB,IAAIY,CAAa,EAC3C,MAAO,CACL,QAAS,GACT,QAAS,CACP,uFACA,sBAAsBZ,CAAM,sEAC9B,EAAE,KAAK,GAAG,CACZ,CAEJ,OAASQ,EAAO,CACd,MAAO,CACL,QAAS,GACT,QAAS,CACP,uFACA,kFAAkFR,CAAM,6BACxFS,EAAoBD,CAAK,CAC3B,EAAE,KAAK,GAAG,CACZ,CACF,CAGF,MAAO,CAAE,QAAS,EAAK,CACzB,CACF,EAEIM,GAAwBtB,GAAsB,OAAO,EACnDuB,GAAqB,CACzB,4BAA6BvB,GAAsB,iBACnD,oCAAqC,IAAM,CACzCsB,GAAwBtB,GAAsB,OAAO,CACvD,CACF,EC1WO,SAASwB,GAAuB,CAAE,eAAAC,CAAe,EAAqC,CAC3F,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,4CAA4C,CAEhE,CCJA,OAAS,KAAAC,MAAS,MAKX,IAAMC,GAAcD,EACxB,OAAO,CACN,KAAMA,EAAE,OAAO,EACf,YAAaA,EAAE,OAAO,EACtB,SAAUA,EAAE,OAAO,EAAE,SAAS,EAC9B,mBAAoBA,EAAE,OAAO,EAAE,SAAS,EACxC,YAAaA,EAAE,OAAO,EAAE,SAAS,EACjC,qBAAsBA,EACnB,MAAMA,EAAE,OAAO,CAAE,UAAWA,EAAE,OAAO,EAAG,MAAOA,EAAE,OAAO,EAAE,SAAS,CAAE,CAAC,EAAE,SAAS,CAAC,EAClF,SAAS,EACZ,aAAcA,EAAE,OAAO,EAAE,SAAS,EAClC,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,cAAeA,EAAE,OAAO,EAAE,SAAS,EACnC,aAAcA,EAAE,OAAO,EAAE,SAAS,EAClC,YAAaA,EAAE,OAAO,EAAE,SAAS,EACjC,iBAAkBA,EAAE,OAAO,EAAE,SAAS,EACtC,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,gBAAiBA,EAAE,QAAQ,EAAE,SAAS,EACtC,iBAAkBA,EAAE,QAAQ,EAAE,SAAS,EACvC,QAASA,EAAE,OAAO,EAAE,SAAS,CAC/B,CAAC,EACA,QAAQ,EAEEE,GAAkBF,EAC5B,OAAO,CACN,KAAMA,EAAE,OAAO,EACf,cAAeA,EAAE,OAAO,EACxB,SAAUA,EAAE,OAAO,EAAE,SAAS,EAC9B,MAAOA,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,EAAGA,EAAE,QAAQ,EAAGA,EAAE,KAAK,CAAC,CAAC,EAC9D,QAASA,EAAE,MAAMA,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,EAAGA,EAAE,QAAQ,EAAGA,EAAE,KAAK,CAAC,CAAC,CAAC,EACzE,IAAKA,EAAE,OAAO,EAAE,SAAS,EACzB,IAAKA,EAAE,OAAO,EAAE,SAAS,EACzB,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,YAAaA,EAAE,OAAO,EAAE,SAAS,EACjC,WAAYA,EAAE,OAAO,EAAE,SAAS,CAClC,CAAC,EACA,QAAQ,EAEEG,GAAqBH,EAAE,OAAO,CACzC,OAAQA,EAAE,MAAMC,EAAW,EAC3B,WAAYD,EAAE,MAAME,EAAe,CACrC,CAAC,EAMM,SAASE,GAA2BC,EAAoD,CAC7F,IAAMC,EAAmC,CACvC,OAAQ,CAAC,EACT,WAAY,CAAC,CACf,EAEA,GAAI,CAACD,EAAmB,KACtB,OAAOC,EAKT,QAAWC,KAASF,EAAmB,KAAM,CAC3C,IAAMG,EAAgB,CACpB,KAAMD,EAAM,aACZ,SAAUA,EAAM,SAChB,YAAaA,EAAM,WACrB,EAEIA,EAAM,qBACRC,EAAO,mBAAqBD,EAAM,oBAGhCA,EAAM,UACRC,EAAO,QAAUD,EAAM,SAGzBD,EAAmB,OAAO,KAAKE,CAAM,CACvC,CAGA,GAAIH,EAAmB,WAAW,WAChC,QAAWI,KAAaJ,EAAmB,UAAU,WAAY,CAC/D,IAAMG,EAAoB,CACxB,KAAMC,EAAU,iBAChB,cAAeA,EAAU,cACzB,SAAUA,EAAU,SACpB,MAAOA,EAAU,KACnB,EAEIA,EAAU,gBAAkB,QAAUA,EAAU,QAClDD,EAAO,QAAUC,EAAU,QAClBA,EAAU,gBAAkB,qBACrCD,EAAO,QAAUC,EAAU,QAC3BD,EAAO,QAAUC,EAAU,QAC3BD,EAAO,YAAcC,EAAU,YAC/BD,EAAO,WAAaC,EAAU,YACrBA,EAAU,gBAAkB,uBACrCD,EAAO,IAAMC,EAAU,IACvBD,EAAO,IAAMC,EAAU,IACvBD,EAAO,KAAOC,EAAU,MAG1BH,EAAmB,WAAW,KAAKE,CAAM,CAC3C,CAGF,OAAOF,CACT,CAEO,SAASI,GACdL,EACAM,EACc,CAId,IAAMC,EAA+B,CACnC,OAAQ,CAAC,EACT,WAAY,CAAC,CACf,EAEA,GAAI,CAACP,EAAmB,KAAM,CAC5B,GAAIM,EAAiB,KAAK,qBAAqB,CAAC,GAAG,OAAO,OAExD,QAAWJ,KAASI,EAAiB,KAAK,qBAAqB,CAAC,EAAE,OAAQ,CACxE,IAAMH,EAAgB,CAAE,KAAMD,EAAM,IAAK,EACrCA,EAAM,WACRC,EAAO,SAAWD,EAAM,UAEtBA,EAAM,cACRC,EAAO,mBAAqBD,EAAM,aAEpCM,GAAsCN,EAAOC,CAAM,EACnDI,EAAe,OAAO,KAAKJ,CAAM,CACnC,CAGF,OAAOI,CACT,CAGA,QAAWL,KAASF,EAAmB,KAAM,CAE3C,IAAMG,EAAgB,CACpB,KAAMD,EAAM,aACZ,SAAUA,EAAM,SAChB,YAAaA,EAAM,WACrB,EAEIA,EAAM,qBACRC,EAAO,mBAAqBD,EAAM,oBAGhCA,EAAM,UACRC,EAAO,QAAUD,EAAM,SAGzBK,EAAe,OAAO,KAAKJ,CAAM,CACnC,CAGA,GAAIH,EAAmB,WAAW,WAChC,QAAWI,KAAaJ,EAAmB,UAAU,WAAY,CAC/D,IAAMG,EAAoB,CACxB,KAAMC,EAAU,iBAChB,cAAeA,EAAU,cACzB,SAAUA,EAAU,SACpB,MAAOA,EAAU,KACnB,EAEIA,EAAU,gBAAkB,QAAUA,EAAU,QAClDD,EAAO,QAAUC,EAAU,QAClBA,EAAU,gBAAkB,qBACrCD,EAAO,QAAUC,EAAU,QAC3BD,EAAO,QAAUC,EAAU,QAC3BD,EAAO,YAAcC,EAAU,YAC/BD,EAAO,WAAaC,EAAU,YACrBA,EAAU,gBAAkB,uBACrCD,EAAO,IAAMC,EAAU,IACvBD,EAAO,IAAMC,EAAU,IACvBD,EAAO,KAAOC,EAAU,MAG1BG,EAAe,WAAW,KAAKJ,CAAM,CACvC,CAGF,GAAI,CAACG,EAAiB,KAAK,qBAAqB,CAAC,GAAG,OAAO,OACzD,OAAOC,EAIT,QAAWL,KAASK,EAAe,OAAQ,CACzC,IAAME,EAAoBH,EAAiB,KAAK,qBAAqB,CAAC,EAAE,OAAO,KAC5EI,GAAMA,EAAE,OAASR,EAAM,IAC1B,EACIO,GACFD,GAAsCC,EAAmBP,CAAK,CAElE,CAEA,OAAOK,CACT,CAEA,SAASC,GAAsCG,EAAoBC,EAA0B,CACvFD,EAAY,cACdC,EAAY,YAAcD,EAAY,aAEpCA,EAAY,sBAAsB,SACpCC,EAAY,qBAAuBD,EAAY,sBAE7CA,EAAY,eACdC,EAAY,aAAeD,EAAY,cAErCA,EAAY,OACdC,EAAY,KAAOD,EAAY,MAE7BA,EAAY,gBACdC,EAAY,cAAgBD,EAAY,eAEtCA,EAAY,UACdC,EAAY,QAAUD,EAAY,QAE9BA,EAAY,iBAAmB,OACjCC,EAAY,gBAAkBD,EAAY,iBAGxCA,EAAY,kBAAoB,OAClCC,EAAY,iBAAmBD,EAAY,mBAI3CA,EAAY,SAAW,OACzBC,EAAY,QAAUD,EAAY,QAEtC,CJ7NO,IAAME,GAAmBC,GAAmC;AAAA;AAAA,4CAEvBA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA6DpDC,GAAe,CACnB,eAAgBC,GAAE,OAAO,EAAE,SAAS,CACtC,EAWaC,GAAgCC,GAA8C,CACzF,IAAMC,EAA4B,IAAIC,EAAK,CACzC,OAAAF,EACA,KAAM,0BACN,YAAa;AAAA;AAAA;AAAA;AAAA,MAKb,aAAAH,GACA,YAAa,CACX,MAAO,0BACP,aAAc,GACd,cAAe,EACjB,EACA,cAAeM,GACf,SAAU,MAAO,CAAE,eAAAP,CAAe,EAAG,CAAE,UAAAQ,EAAW,SAAAC,CAAS,IAA+B,CACxF,IAAMC,EAASC,EAAU,EACnBC,EAAQb,GAAgBC,CAAc,EAE5C,OAAO,MAAMK,EAA0B,cAGrC,CACA,UAAAG,EACA,SAAAC,EACA,KAAM,CAAE,eAAAT,CAAe,EACvB,SAAU,SAAY,CACpB,IAAMa,EAA4B,MAAMC,GAAsB,oBAAoB,CAChF,eAAAd,EACA,YAAa,CAAE,OAAAU,EAAQ,UAAAF,EAAW,OAAAJ,CAAO,CAC3C,CAAC,EAED,OAAKS,EAA0B,QAOxB,MAAME,EAAW,CACtB,OAAAL,EACA,UAAAF,EACA,OAAAJ,EACA,UAAW,CAAC,uBAAwB,+BAA+B,EACnE,SAAUY,EAAmBP,CAAQ,EACrC,SAAU,MAAOQ,GAAY,CAE3B,IAAMC,EAAqB,MAAMD,EAAQ,wBAAwB,aAAa,CAC5E,WAAY,CACV,eAAAjB,CACF,CACF,CAAC,EAED,GAAIkB,EAAmB,MAAM,EAC3B,OAAOC,GAAI,CAAE,KAAM,kBAAmB,CAAC,EAGzC,GAAIT,EAAO,2BAET,OAAOU,GAAGC,GAA2BH,EAAmB,KAAK,CAAC,EAGhE,IAAII,EAEJ,GAAI,CAGFA,EAAmB,MAAML,EAAQ,gBAAgB,QAAQL,CAAK,CAChE,MAAQ,CACN,OAAOQ,GAAGC,GAA2BH,EAAmB,KAAK,CAAC,CAChE,CAGA,OAAOE,GAAGG,GAAcL,EAAmB,MAAOI,CAAgB,CAAC,CACrE,CACF,CAAC,EA1CQ,IAAIH,GAAI,CACb,KAAM,yBACN,QAASN,EAA0B,OACrC,CAAC,CAwCL,EACA,uBAAyBW,IAChB,CACL,KAAM,UACN,OAAQA,CACV,GAEF,aAAeC,GAAsC,CACnD,OAAQA,EAAM,KAAM,CAClB,IAAK,mBACH,OAAOC,GAAiC,EAC1C,IAAK,yBACH,OAAOD,EAAM,OACjB,CACF,CACF,CAAC,CACH,CACF,CAAC,EAED,OAAOpB,CACT,EK/LA,OAAS,MAAAsB,OAAU,gBACnB,OAAS,KAAAC,OAAS,MCFlB,OAAS,MAAAC,OAAU,gBACnB,OAAS,KAAAC,OAAS,MAKlB,IAAMC,GAAmBD,GACtB,OAAO,CACN,SAAUA,GAAE,OAAO,OAAO,EAAE,GAAG,CAAC,EAChC,WAAYA,GAAE,OAAO,OAAO,EAAE,GAAG,CAAC,EAClC,MAAOA,GAAE,OAAO,OAAO,EAAE,GAAG,CAAC,CAC/B,CAAC,EACA,QAAQ,EASX,eAAsBE,GAAY,CAAE,WAAAC,EAAY,UAAAC,CAAU,EAAuC,CAC/F,GAAM,CAAE,SAAAC,EAAU,MAAAC,CAAM,EAAIL,GAAiB,MAAME,CAAU,EACvD,CAAE,WAAAI,EAAY,KAAAC,CAAK,EAAI,MAAMJ,EAAUD,CAAU,EACjDM,EAAS,CAAC,GAAGD,CAAI,EAEnB,CAAE,eAAAE,EAAgB,WAAAC,CAAW,EAAIJ,EACrC,KAAOG,EAAiBD,EAAO,SAAW,CAACH,GAASA,EAAQG,EAAO,SAAS,CAC1E,GAAM,CAAE,WAAYG,EAAgB,KAAMC,CAAS,EAAI,MAAMT,EAAU,CACrE,SAAAC,EACA,WAAYM,EAAa,EACzB,MAAAL,CACF,CAAC,EAED,GAAIO,EAAS,SAAW,EACtB,MAAM,IAAI,MACR,qDAAqDF,CAAU,sBAAsBD,CAAc,oBAAoBD,EAAO,MAAM,EACtI,GAGD,CAAE,eAAAC,EAAgB,WAAAC,CAAW,EAAIC,GAClCH,EAAO,KAAK,GAAGI,CAAQ,CACzB,CAEA,OAAIP,GAASA,EAAQG,EAAO,SAC1BA,EAAO,OAASH,GAGXG,CACT,CAEA,IAAMK,GAA4Bd,GAC/B,OAAO,CACN,MAAOA,GAAE,OAAO,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EACxC,SAAUA,GAAE,OAAO,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,CAC7C,CAAC,EACA,SAAS,EAYZ,eAAsBe,GAAiB,CACrC,OAAAC,EACA,UAAAZ,CACF,EAAyD,CACvD,IAAMa,EAAkBH,GAA0B,MAAME,CAAM,EACxDV,EAAQW,GAAiB,MAC3BZ,EAAWY,GAAiB,SAE1BR,EAAS,MAAML,EAAU,OAAWC,CAAQ,EAClD,GAAII,EAAO,MAAM,EACf,OAAOA,EAET,GAAM,CAAE,WAAAF,EAAY,KAAAC,CAAK,EAAIC,EAAO,MAC9BS,EAAc,CAAC,GAAGV,CAAI,EACtBW,EAAkBZ,EAAW,gBAE/Ba,EAAkBb,EAAW,gBAUjC,IAPI,CAACF,GAAYc,IACfd,EAAW,KAAK,IACdc,EAAkBD,EAAY,OAC9BZ,EAAQA,EAAQY,EAAY,OAAS,OAAO,gBAC9C,GAGKE,IAAoB,CAACd,GAASA,EAAQY,EAAY,SAAS,CAChE,IAAMT,EAAS,MAAML,EAAUgB,EAAiBf,CAAQ,EACxD,GAAII,EAAO,MAAM,EACf,OAAOA,EAET,GAAM,CAAE,WAAYG,EAAgB,KAAMC,CAAS,EAAIJ,EAAO,MAE9D,GAAII,EAAS,SAAW,EACtB,MAAM,IAAI,MAAM,0CAA0CK,EAAY,MAAM,EAAE,GAG/E,CAAE,gBAAAE,CAAgB,EAAIR,GACvBM,EAAY,KAAK,GAAGL,CAAQ,CAC9B,CAEA,OAAIP,GAASA,EAAQY,EAAY,SAC/BA,EAAY,OAASZ,GAGhB,IAAIP,GAAGmB,CAAW,CAC3B,CClHO,IAAMG,GAA2B,wkCCAxC,OAAS,KAAAC,OAAS,MCAlB,OAAOC,OAAO,MAEP,IAAMC,GAAuBD,GAAE,KAAK,CAAC,KAAM,KAAM,KAAM,MAAO,KAAM,KAAK,CAAC,EAG1E,SAASE,GAAkBC,EAAwB,CAGxD,MAAO,yCAAyC,KAAKA,CAAK,CAC5D,CAEA,IAAMC,GAAiB,CAAC,YAAa,WAAW,EAUzC,SAASC,GAOd,CACA,aAAAC,EACA,wBAAAC,EACA,kBAAAC,CACF,EAIW,CACT,SAASC,EAAkBC,EAAqBC,EAAmC,CAEjF,OADgBJ,EAAwBG,CAAK,EAC9B,SAASC,CAAQ,CAClC,CAEA,IAAMC,EAAcN,EACjB,MAAM,GAAG,EACT,IAAKO,GAAMA,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EAEXC,EAAmD,CAAC,EAE1D,QAAWC,KAAQH,EAAa,CAC9B,GAAM,CAACI,EAAUC,EAAa,GAAGC,CAAU,EAAIH,EAAK,MAAM,GAAG,EAC7D,GAAI,CAACC,GAAY,CAACC,GAAeC,EAAW,SAAW,EACrD,MAAM,IAAI,MAAM,sCAAsCH,CAAI,GAAG,EAG/D,IAAMZ,EAAQe,EAAW,KAAK,GAAG,EAE3BR,EAAQF,EAAkB,MAAMQ,CAAQ,EACxCL,EAAWV,GAAqB,MAAMgB,CAAW,EAEvD,GAAI,CAACR,EAAkBC,EAAOC,CAAQ,EACpC,MAAM,IAAI,MACR,aAAaA,CAAQ,+BAA+BD,CAAK,yBAAyBH,EAAwBG,CAAK,EAAE,KAAK,IAAI,CAAC,EAC7H,EAIF,GAAIN,GAAe,SAASM,CAAK,GAAK,CAACR,GAAkBC,CAAK,EAC5D,MAAM,IAAI,MACR,oBAAoBO,CAAK,0EAC3B,EAGFI,EAAcJ,CAAK,EAAI,CAAE,MAAAA,EAAO,SAAAC,EAAU,MAAAR,CAAM,CAClD,CAGA,OAAO,OAAO,OAAOW,CAAa,EAC/B,IAAKD,GAAM,GAAGA,EAAE,KAAK,IAAIA,EAAE,QAAQ,IAAIA,EAAE,KAAK,EAAE,EAChD,KAAK,GAAG,CACb,CDrEA,IAAMM,GAAoBC,GAAE,KAAK,CAC/B,qBACA,wBACA,eACA,iBACA,aACA,YACA,eACA,mBACA,cACA,iBACA,WACA,sBACA,cACA,cACA,gBACA,gBACA,iBACA,cACA,OACA,cACA,aACA,YACA,cACA,aACA,aACA,OACA,YACA,OACA,OACA,WACF,CAAC,EAIKC,GAAiE,CACrE,mBAAoB,CAAC,KAAM,IAAI,EAC/B,sBAAuB,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EACtD,aAAc,CAAC,KAAM,IAAI,EACzB,eAAgB,CAAC,KAAM,IAAI,EAC3B,WAAY,CAAC,KAAM,IAAI,EACvB,UAAW,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC1C,aAAc,CAAC,KAAM,IAAI,EACzB,iBAAkB,CAAC,KAAM,IAAI,EAC7B,YAAa,CAAC,KAAM,IAAI,EACxB,eAAgB,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC/C,SAAU,CAAC,IAAI,EACf,oBAAqB,CAAC,IAAI,EAC1B,YAAa,CAAC,IAAI,EAClB,YAAa,CAAC,IAAI,EAClB,cAAe,CAAC,IAAI,EACpB,cAAe,CAAC,IAAI,EACpB,eAAgB,CAAC,IAAI,EACrB,YAAa,CAAC,IAAI,EAClB,KAAM,CAAC,KAAM,IAAI,EACjB,YAAa,CAAC,KAAM,IAAI,EACxB,WAAY,CAAC,IAAI,EACjB,UAAW,CAAC,KAAM,IAAI,EACtB,YAAa,CAAC,KAAM,IAAI,EACxB,WAAY,CAAC,KAAM,IAAI,EACvB,WAAY,CAAC,IAAI,EACjB,KAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EACrC,UAAW,CAAC,KAAM,IAAI,EACtB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,IAAI,EACX,UAAW,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,CAC5C,EAEMC,GAA0BF,GAAE,OAAO,CACvC,MAAOD,GACP,SAAUI,GACV,MAAOH,GAAE,OAAO,CAClB,CAAC,EAIM,SAASI,GAAwCC,EAA8B,CACpF,OAAOC,GAA4D,CACjE,aAAAD,EACA,wBAAAJ,GACA,kBAAmBF,EACrB,CAAC,CACH,CH/EA,IAAMQ,GAAe,CACnB,OAAQC,GAAE,OAAO,EAAE,SAAS,EAC5B,SAAUA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EACpC,MAAOA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,CACnC,EAEaC,GAA0BC,GAA8C,CACnF,IAAMC,EAAsB,IAAIC,EAAK,CACnC,OAAAF,EACA,KAAM,mBACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqCbG,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaxB,aAAAN,GACA,YAAa,CACX,MAAO,mBACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,OAAAO,EAAQ,SAAAC,EAAU,MAAAC,CAAM,EAC1B,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACnBC,EAAkBP,EAASQ,GAAwCR,CAAM,EAAI,OACnF,OAAO,MAAMH,EAAoB,cAAc,CAC7C,UAAAM,EACA,SAAAC,EACA,KAAM,CAAE,OAAAJ,EAAQ,SAAAC,EAAU,MAAAC,CAAM,EAChC,SAAU,SAAY,CACpB,IAAMO,EAAc,MAAMC,EAAW,CACnC,OAAAL,EACA,UAAAF,EACA,OAAAP,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAUe,EAAmBP,CAAQ,EACrC,SAAU,MAAOQ,GACK,MAAMC,GAAS,CACjC,WAAY,CACV,SAAAZ,EACA,MAAOI,EAAO,eACV,KAAK,IAAIA,EAAO,eAAgBH,GAAS,OAAO,gBAAgB,EAChEA,CACN,EACA,UAAW,MAAOY,GAAe,CAC/B,GAAM,CAAE,WAAAC,EAAY,YAAaC,CAAK,EACpC,MAAMJ,EAAQ,mBAAmB,gBAAgB,CAC/C,OAAQA,EAAQ,OAChB,OAAQL,GAAmB,GAC3B,SAAUO,EAAW,SACrB,WAAYA,EAAW,UACzB,CAAC,EAEH,MAAO,CAAE,WAAAC,EAAY,KAAAC,CAAK,CAC5B,CACF,CAAC,CAIL,CAAC,EAED,OAAO,IAAIC,GAAGR,CAAW,CAC3B,EACA,uBAAyBA,GACvBS,GAAqB,CAAE,YAAAT,EAAa,eAAgBJ,EAAO,cAAe,CAAC,CAC/E,CAAC,CACH,CACF,CAAC,EAED,OAAOR,CACT,EAEO,SAASqB,GAAqB,CACnC,YAAAT,EACA,eAAAU,CACF,EAGyC,CACvC,GAAIV,EAAY,SAAW,EACzB,MAAO,CACL,KAAM,QACN,QACE,0FACJ,EAGF,GAAM,CAAE,WAAAW,EAAY,cAAAC,CAAc,EAAIF,EAStC,OARIC,IACFX,EAAcA,EAAY,OAAQa,GAAeF,EAAW,IAAIE,EAAW,QAAQ,EAAE,CAAC,GAGpFD,IACFZ,EAAcA,EAAY,OAAQa,GAAeD,EAAc,IAAIC,EAAW,EAAE,CAAC,GAG/Eb,EAAY,SAAW,EAClB,CACL,KAAM,QACN,QAAS,CACP,8FACA,wFACF,EAAE,KAAK,GAAG,CACZ,EAGK,CACL,KAAM,UACN,OAAQA,CACV,CACF,CK1KA,OAAS,OAAAc,OAAW,gBACpB,OAAOC,OAAO,MCAP,SAASC,GAAsBC,EAAoC,CACxE,OAAQA,EAAQ,CACd,IAAK,iBACH,MAAO,CACL,4CACA,uHACA,4IACF,EAAE,KAAK,GAAG,EACZ,IAAK,iBACH,MAAO,CACL,gDACA,iHACF,EAAE,KAAK,GAAG,CACd,CACF,CDCA,IAAMC,GAAe,CACnB,cAAeC,GACf,WAAYC,GAAE,SAASA,GAAE,KAAKC,EAA0B,CAAC,CAC3D,EAYaC,GACXC,GAC8B,CAC9B,IAAMC,EAA4C,IAAIC,EAAK,CACzD,OAAAF,EACA,KAAM,6CACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4Gb,aAAAL,GACA,YAAa,CACX,MAAO,6CACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,cAAAQ,EAAe,WAAAC,CAAW,EAC5B,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACzB,OAAO,MAAMP,EAA0C,cAGrD,CACA,UAAAI,EACA,SAAAC,EACA,KAAM,CAAE,cAAAH,EAAe,WAAAC,CAAW,EAClC,SAAU,SAAY,CACpB,GAAM,CAAE,cAAAK,CAAc,EAAIF,EAAO,eACjC,GAAIE,EAAe,CACjB,IAAMC,EACJP,EAAc,eAAe,MAAM,OAAO,WAAW,WAAW,GAElE,GAAI,CAACM,EAAc,IAAIC,CAAc,EACnC,OAAO,IAAIC,GAAI,CACb,KAAM,yBACN,QAAS,CACP,iGACA,oGACA,kCAAkCD,CAAc,oDAClD,EAAE,KAAK,GAAG,CACZ,CAAC,CAEL,CAEA,IAAME,EAAS,MAAMC,EAAW,CAC9B,OAAAN,EACA,UAAAF,EACA,OAAAL,EACA,UAAW,CAAC,uBAAuB,EACnC,SAAUc,EAAmBR,CAAQ,EACrC,SAAU,MAAOS,GACf,MAAMA,EAAQ,aAAa,sCACzBZ,EACAC,GAAc,KAChB,CACJ,CAAC,EAED,OAAIQ,EAAO,MAAM,EACR,IAAID,GAAI,CACb,KAAM,mBACN,OAAQC,EAAO,KACjB,CAAC,EAGIA,CACT,EACA,uBAAyBI,IAChB,CACL,KAAM,UACN,OAAQA,CACV,GAEF,aAAeC,GAAU,CACvB,OAAQA,EAAM,KAAM,CAClB,IAAK,mBACH,OAAOC,GAAsBD,EAAM,MAAM,EAC3C,IAAK,yBACH,OAAOA,EAAM,OACjB,CACF,CACF,CAAC,CACH,CACF,CAAC,EAED,OAAOhB,CACT,EE9NA,OAAS,MAAAkB,OAAU,gBACnB,OAAS,KAAAC,OAAS,MCEX,SAASC,GAA0B,CACxC,eAAAC,EACA,YAAAC,CACF,EAGoD,CAClD,GAAIA,EAAY,SAAW,EACzB,MAAO,CACL,KAAM,QACN,QACE,uGACJ,EAGF,GAAM,CAAE,cAAAC,CAAc,EAAIF,EAQ1B,OANIE,IACFD,EAAcA,EAAY,OAAQE,GAChCD,EAAc,IAAIC,EAAW,cAAc,WAAW,EAAE,CAC1D,GAGEF,EAAY,SAAW,EAClB,CACL,KAAM,QACN,QAAS,CACP,0GACA,oGACF,EAAE,KAAK,GAAG,CACZ,EAGK,CACL,KAAM,UACN,OAAQA,CACV,CACF,CDxBA,IAAMG,GAAe,CACnB,KAAMC,GAAE,SAASA,GAAE,KAAKC,EAA6B,CAAC,EACtD,MAAOD,GAAE,OAAO,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EACxC,SAAUA,GAAE,OAAO,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,CAC7C,EAEaE,GAAwCC,GAA8C,CACjG,IAAMC,EAAoC,IAAIC,EAAK,CACjD,OAAAF,EACA,KAAM,oCACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0Bb,aAAAJ,GACA,YAAa,CACX,MAAO,oCACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,KAAAO,EAAM,MAAAC,EAAO,SAAAC,CAAS,EACxB,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACzB,OAAO,MAAMR,EAAkC,cAAc,CAC3D,UAAAK,EACA,SAAAC,EACA,KAAM,CAAE,KAAAJ,EAAM,MAAAC,EAAO,SAAAC,CAAS,EAC9B,SAAU,SACD,MAAMK,EAAW,CACtB,OAAAF,EACA,UAAAF,EACA,OAAAN,EACA,UAAW,CAAC,0CAA0C,EACtD,SAAUW,EAAmBJ,CAAQ,EACrC,SAAU,MAAOK,GACK,MAAMC,GAAc,CACtC,OAAQ,CACN,MAAOL,EAAO,eACV,KAAK,IAAIA,EAAO,eAAgBJ,GAAS,OAAO,gBAAgB,EAChEA,EACJ,SAAAC,CACF,EACA,UAAW,MAAOS,EAAWT,IAAa,CACxC,IAAMU,EAAY,MAAMH,EAAQ,aAAa,8BAC3CT,EACAW,EACAT,CACF,EAEA,OAAIU,EAAU,KAAK,EACV,IAAIC,GAAG,CACZ,WAAYD,EAAU,MAAM,WAC5B,KAAMA,EAAU,MAAM,WACxB,CAAC,EAGIA,CACT,CACF,CAAC,CAGL,CAAC,EAEH,uBAAyBE,GACvBC,GAA0B,CAAE,YAAAD,EAAa,eAAgBT,EAAO,cAAe,CAAC,EAClF,aAAcW,EAChB,CAAC,CACH,CACF,CAAC,EAED,OAAOlB,CACT,EE/GA,OAAS,KAAAmB,OAAS,MAWlB,IAAMC,GAAe,CACnB,oBAAqBC,GAAE,MAAMA,GAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,EACzD,KAAMA,GAAE,SAASA,GAAE,KAAKC,EAA6B,CAAC,CACxD,EAEaC,GACXC,GAC8B,CAC9B,IAAMC,EAAkD,IAAIC,EAAK,CAC/D,OAAAF,EACA,KAAM,oDACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8Bb,aAAAJ,GACA,YAAa,CACX,MAAO,2DACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,KAAAO,EAAM,oBAAAC,CAAoB,EAC5B,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACzB,OAAO,MAAMP,EAAgD,cAAc,CACzE,UAAAI,EACA,SAAAC,EACA,KAAM,CAAE,oBAAAF,EAAqB,KAAAD,CAAK,EAClC,SAAU,SACD,MAAMM,EAAW,CACtB,OAAAF,EACA,UAAAF,EACA,OAAAL,EACA,UAAW,CAAC,0CAA0C,EACtD,SAAUU,EAAmBJ,CAAQ,EACrC,SAAU,MAAOK,GACR,MAAMA,EAAQ,aAAa,kDAChCP,EACAD,CACF,CAEJ,CAAC,EAEH,uBAAyBS,GACvBC,GAA0B,CAAE,YAAAD,EAAa,eAAgBL,EAAO,cAAe,CAAC,EAClF,aAAcO,EAChB,CAAC,CACH,CACF,CAAC,EAED,OAAOb,CACT,EC1FA,OAAS,KAAAc,OAAS,MCGX,SAASC,GAAsB,CACpC,QAAAC,EACA,eAAAC,CACF,EAG0C,CACxC,GAAID,EAAQ,SAAW,EACrB,MAAO,CACL,KAAM,QACN,QACE,4FACJ,EAGF,GAAM,CAAE,cAAAE,CAAc,EAAID,EAM1B,OAJIC,IACFF,EAAUA,EAAQ,OAAQG,GAAWD,EAAc,IAAIC,EAAO,eAAe,CAAC,GAG5EH,EAAQ,SAAW,EACd,CACL,KAAM,QACN,QAAS,CACP,+FACA,yFACF,EAAE,KAAK,GAAG,CACZ,EAGK,CACL,KAAM,UACN,OAAQA,CACV,CACF,CD1BA,IAAMI,GAAe,CACnB,wBAAyBC,GAAE,OAAO,EAAE,OAAO,EAAE,CAC/C,EAEaC,GACXC,GAC8B,CAC9B,IAAMC,EAA6C,IAAIC,EAAK,CAC1D,OAAAF,EACA,KAAM,+CACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASb,aAAAH,GACA,YAAa,CACX,MAAO,+CACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,wBAAAM,CAAwB,EAC1B,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACzB,OAAO,MAAMN,EAA2C,cAGtD,CACA,UAAAG,EACA,SAAAC,EACA,KAAM,CAAE,wBAAAF,CAAwB,EAChC,SAAU,SACD,MAAMK,EAAW,CACtB,OAAAF,EACA,UAAAF,EACA,OAAAJ,EACA,UAAW,CAAC,0CAA0C,EACtD,SAAUS,EAAmBJ,CAAQ,EACrC,SAAU,MAAOK,GACR,MAAMA,EAAQ,aAAa,uCAChCP,CACF,CAEJ,CAAC,EAEH,uBAAyBQ,GACvBC,GAAsB,CAAE,QAAAD,EAAS,eAAgBL,EAAO,cAAe,CAAC,EAC1E,aAAcO,EAChB,CAAC,CACH,CACF,CAAC,EAED,OAAOZ,CACT,EEvEA,OAAS,KAAAa,OAAS,MAUlB,IAAMC,GAAe,CACnB,UAAWC,GAAE,MAAMA,GAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAC1C,EAEaC,GAAwCC,GAA8C,CACjG,IAAMC,EAAoC,IAAIC,EAAK,CACjD,OAAAF,EACA,KAAM,qCACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeb,aAAAH,GACA,YAAa,CACX,MAAO,qCACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MAAO,CAAE,UAAAM,CAAU,EAAG,CAAE,UAAAC,EAAW,SAAAC,CAAS,IAA+B,CACnF,IAAMC,EAASC,EAAU,EACzB,OAAO,MAAMN,EAAkC,cAAc,CAC3D,UAAAG,EACA,SAAAC,EACA,KAAM,CAAE,UAAAF,CAAU,EAClB,SAAU,SACD,MAAMK,EAAW,CACtB,OAAAF,EACA,UAAAF,EACA,OAAAJ,EACA,UAAW,CAAC,8BAA8B,EAC1C,SAAUS,EAAmBJ,CAAQ,EACrC,SAAU,MAAOK,GACR,MAAMA,EAAQ,aAAa,8BAA8BP,CAAS,CAE7E,CAAC,EAEH,uBAAyBQ,GACvBC,GAAsB,CAAE,QAAAD,EAAS,eAAgBL,EAAO,cAAe,CAAC,EAC1E,aAAcO,EAChB,CAAC,CACH,CACF,CAAC,EAED,OAAOZ,CACT,ECtDA,IAAMa,GAAe,CAAC,EAETC,GAAuCC,GAA8C,CAChG,IAAMC,EAAmC,IAAIC,EAAK,CAChD,OAAAF,EACA,KAAM,kCACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYb,aAAAF,GACA,YAAa,CACX,MAAO,mDACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MAAOK,EAAG,CAAE,UAAAC,EAAW,SAAAC,CAAS,IAA+B,CACvE,IAAMC,EAASC,EAAU,EACzB,OAAO,MAAMN,EAAiC,cAAc,CAC1D,UAAAG,EACA,SAAAC,EACA,KAAM,CAAC,EACP,SAAU,SACD,MAAMG,EAAW,CACtB,OAAAF,EACA,UAAAF,EACA,OAAAJ,EACA,UAAW,CAAC,mCAAmC,EAC/C,SAAUS,EAAmBJ,CAAQ,EACrC,SAAU,MAAOK,GACR,MAAMA,EAAQ,aAAa,2CAA2C,CAEjF,CAAC,EAEH,uBAAwB,MAAOC,GACtB,MAAMC,GAAkC,CAC7C,cAAAD,EACA,eAAgBL,EAAO,eACvB,YAAa,CAAE,OAAAA,EAAQ,UAAAF,EAAW,OAAAJ,CAAO,CAC3C,CAAC,EAEH,aAAca,EAChB,CAAC,CACH,CACF,CAAC,EAED,OAAOZ,CACT,EAEA,eAAsBW,GAAkC,CACtD,cAAAD,EACA,eAAAG,EACA,YAAAC,CACF,EAI+D,CAC7D,GAAIJ,EAAc,SAAW,EAC3B,MAAO,CACL,KAAM,QACN,QACE,yGACJ,EAGF,GAAM,CAAE,cAAAK,CAAc,EAAIF,EAE1B,GAAI,CAACE,EAEH,MAAO,CACL,KAAM,UACN,OAAQL,CACV,EAGF,GAAM,CAAE,OAAAL,EAAQ,UAAAF,EAAW,OAAAJ,CAAO,EAAIe,EACtC,GAAI,CACF,IAAME,EAAgB,MAAMT,EAAW,CACrC,OAAAF,EACA,UAAAF,EACA,OAAAJ,EACA,UAAW,CAAC,8BAA8B,EAC1C,SAAU,MAAOU,GACR,MAAMA,EAAQ,aAAa,8BAChCC,EAAc,IAAKO,GAAiBA,EAAa,SAAS,CAC5D,CAEJ,CAAC,EAED,GAAID,EAAc,MAAM,EACtB,MAAO,CACL,KAAM,QACN,QAAS,CACP,4GACA,wJACAE,EAAoBF,EAAc,KAAK,CACzC,EAAE,KAAK,GAAG,CACZ,EAGF,IAAMG,EAAmB,IAAI,IAC3BH,EAAc,MACX,OAAQI,GAAWL,EAAc,IAAIK,EAAO,eAAe,CAAC,EAC5D,IAAKA,GAAWA,EAAO,EAAE,CAC9B,EAMA,OAJAV,EAAgBA,EAAc,OAAQO,GACpCE,EAAiB,IAAIF,EAAa,SAAS,CAC7C,EAEIP,EAAc,SAAW,EACpB,CACL,KAAM,QACN,QAAS,CACP,4GACA,sGACF,EAAE,KAAK,GAAG,CACZ,EAGK,CACL,KAAM,UACN,OAAQA,CACV,CACF,OAASW,EAAO,CACd,MAAO,CACL,KAAM,QACN,QAAS,CACP,4GACA,wJACAH,EAAoBG,CAAK,CAC3B,EAAE,KAAK,GAAG,CACZ,CACF,CACF,CC1JA,OAAS,eAAAC,OAAmB,eAC5B,OAAS,OAAAC,OAAW,gBACpB,OAAS,KAAAC,OAAS,MCHlB,OAAS,KAAAC,OAAS,MAIlB,IAAMC,GAASC,GAAE,OACfA,GAAE,OAAO,EAAE,SAAS,EACpBA,GAAE,MACAA,GACG,OAAO,CAAE,KAAMA,GAAE,OAAO,EAAE,SAAS,EAAG,EAAGA,GAAE,OAAO,EAAE,SAAS,EAAG,EAAGA,GAAE,OAAO,EAAE,SAAS,CAAE,CAAC,EAC1F,UAAU,CAAC,CAAE,KAAAC,EAAM,EAAAC,EAAG,EAAAC,CAAE,KAAO,CAC9B,eAAgBF,EAChB,mBAAoBC,EACpB,mBAAoBC,CACtB,EAAE,CACN,CACF,EAQIC,GACAC,GAAc,GAELC,GAA4BC,GAA0D,CACjG,GAAI,CAACF,GAAa,CAChBA,GAAc,GAEd,GAAM,CAAE,sBAAAG,CAAsB,EAAIC,EAAU,EAC5C,GAAI,CAACD,EACH,OAGF,IAAIE,EACJ,GAAI,CACFA,EAAM,KAAK,MAAMF,CAAqB,CACxC,OAASG,EAAG,CACV,MAAM,IAAI,MACR,uEAAuEH,CAAqB,GAC5F,CAAE,MAAOG,CAAE,CACb,CACF,CAEA,IAAMC,EAASb,GAAO,MAAMW,CAAG,EAC/BN,GAAgB,IAAI,IAAI,OAAO,QAAQQ,CAAM,CAAC,CAChD,CAEA,OAAOR,IAAe,IAAIG,CAAc,CAC1C,ECrCO,SAASM,GAA2BC,EAAyC,CAClF,IAAMC,EAAkC,CACtC,GAAGD,CACL,EAEA,OAAQA,EAAM,UAAW,CACvB,IAAK,SACHC,EAAY,UAAY,cACxBA,EAAY,QACV,oFACF,MACF,IAAK,SACHA,EAAY,UAAY,kCACxBA,EAAY,QACV,8HACF,MACF,IAAK,SACHA,EAAY,UAAY,sBACxBA,EAAY,QAAU,kEACtB,MACF,IAAK,SACHA,EAAY,UAAY,oBACxBA,EAAY,QAAU,6DACtB,MACF,IAAK,SACHA,EAAY,UAAY,qBACxBA,EAAY,QACV,iFACF,MACF,IAAK,SACHA,EAAY,UAAY,cACxBA,EAAY,QAAU,uCACtB,MACF,IAAK,SACHA,EAAY,UAAY,oCACxBA,EAAY,QAAU,oDACtB,MACF,IAAK,SACHA,EAAY,UAAY,mBACxBA,EAAY,QAAU,2BACtB,MACF,IAAK,SACHA,EAAY,UAAY,+BACxBA,EAAY,QACV,kOACF,MACF,IAAK,SACHA,EAAY,UAAY,gBACxBA,EAAY,QAAU,qCACtB,MACF,IAAK,SACHA,EAAY,UAAY,yBACxBA,EAAY,QAAU,sCACtB,MACF,IAAK,SACHA,EAAY,UAAY,kBACxBA,EAAY,QAAU,yBACtB,MACF,IAAK,SACHA,EAAY,UAAY,uBACxBA,EAAY,QAAU,wBACtB,MACF,IAAK,SACHA,EAAY,UAAY,oBACxBA,EAAY,QACV,sLACF,MACF,IAAK,SACHA,EAAY,UAAY,wBACxBA,EAAY,QAAU,sCACtB,MACF,IAAK,SACHA,EAAY,UAAY,2BACxBA,EAAY,QAAU,iEACtB,MACF,IAAK,SACHA,EAAY,UAAY,oBACxBA,EAAY,QACV,+EACF,MACF,IAAK,SACHA,EAAY,UAAY,kCACxBA,EAAY,QAAU,6BACtB,MACF,IAAK,SACHA,EAAY,UAAY,kBACxBA,EAAY,QAAU,4CACtB,MACF,IAAK,SACHA,EAAY,UAAY,kBACxBA,EAAY,QAAU,6CACtB,MACF,IAAK,SACHA,EAAY,UAAY,sBACxBA,EAAY,QAAU,uCACtB,MACF,IAAK,SACHA,EAAY,UAAY,kBACxBA,EAAY,QAAU,2CACtB,KACJ,CAEA,OAAOA,CACT,CC/GO,SAASC,GAAeC,EAAsB,CAGjD,GAAIA,EAAO,SAAW,EACpB,MAAM,IAAI,MACR,0FACF,EAMF,GAAIA,EAAO,KAAKC,EAAoB,EAClC,MAAM,IAAI,MAAM,mEAAmE,EAIvF,CAEE,IAAMC,EAAiBF,EAAO,OAAsC,CAACG,EAAKC,KACpEA,EAAM,eAAiB,SAItBD,EAAIC,EAAM,YAAY,IACzBD,EAAIC,EAAM,YAAY,EAAI,CAAC,GAG7BD,EAAIC,EAAM,YAAY,EAAE,KAAKA,EAAM,YAAY,GACxCD,GACN,CAAC,CAAC,EAECE,EAA0B,OAAO,QAAQH,CAAc,EAAE,OAC7D,CAAC,CAACI,EAAGN,CAAM,IAAMA,EAAO,OAAS,CACnC,EAEA,GAAIK,EAAwB,OAAS,EAAG,CACtC,IAAME,EAA6BF,EAAwB,OACzD,CAACF,EAAK,CAACK,EAAUR,CAAM,KACrBG,EAAI,KACF,GAAGH,EAAO,IAAKI,GAAU,IAAIA,CAAK,GAAG,EAAE,KAAK,IAAI,CAAC,4BAA4BI,CAAQ,EACvF,EACOL,GAET,CAAC,CACH,EAEA,MAAM,IAAI,MACR,wHAAwHI,EAA2B,KAAK,IAAI,CAAC,GAC/J,CACF,CACF,CAEA,CAEE,IAAME,EAAuCT,EAC1C,OAAOU,EAAyB,EAChC,IAAKN,GAAUA,EAAM,YAAY,EAEpC,GAAIK,EAAqC,OAAS,EAChD,MAAM,IAAI,MACR,qJAAqJA,EAAqC,KAAK,IAAI,CAAC,GACtM,CAEJ,CAEA,CAEE,IAAME,EAAoCX,EACvC,OAAOY,EAA0B,EACjC,IAAKR,GAAUA,EAAM,YAAY,EAEpC,GAAIO,EAAkC,OAAS,EAC7C,MAAM,IAAI,MACR,qKAAqKA,EAAkC,KAAK,IAAI,CAAC,GACnN,CAEJ,CACF,CAEA,SAASV,GAAqBG,EAAuB,CACnD,MAAO,CAACA,EAAM,YAChB,CAEO,SAASM,GAA0BN,EAAqC,CAC7E,MAAO,CAAC,EAAE,aAAcA,GAASA,EAAM,UAAY,gBAAiBA,GAASA,EAAM,YACrF,CAEO,SAASS,GAA8BT,EAAqC,CACjF,MAAO,CAAC,EACN,iBAAkBA,GAClBA,EAAM,cACN,gBAAiBA,GACjBA,EAAM,YAEV,CAEA,SAASQ,GAA2BR,EAAuB,CACzD,OAAOA,EAAM,mBAAqB,QAAaA,EAAM,iBAAmB,CAC1E,CCxGA,OAAS,OAAAU,GAAK,MAAAC,OAAkB,gBAKzB,SAASC,GAAgBC,EAAiC,CAC/D,GAAKA,EAIL,IAAIA,EAAQ,KAAMC,GAAW,EAAE,UAAWA,EAAO,EAC/C,MAAM,IAAI,MACR,wIACF,EAGF,CAEE,IAAMC,EAAcF,EAAQ,OAA+B,CAACG,EAAKF,KACzD,iBAAkBA,EAAO,QAI1BE,EAAIF,EAAO,MAAM,YAAY,IAChCE,EAAIF,EAAO,MAAM,YAAY,EAAI,GAGnCE,EAAIF,EAAO,MAAM,YAAY,KACtBE,GACN,CAAC,CAAC,EAECC,EAA4B,OAAO,QAAQF,CAAW,EAAE,OAAO,CAAC,CAACG,EAAGC,CAAK,IAAMA,EAAQ,CAAC,EAE9F,GAAIF,EAA0B,OAAS,EACrC,MAAM,IAAI,MACR,yEAAyEA,EAA0B,IAAI,CAAC,CAACG,CAAK,IAAMA,CAAK,EAAE,KAAK,IAAI,CAAC,GACvI,CAEJ,CAEA,CAEE,IAAMC,EAA2BR,EAAQ,OAAsB,CAACG,EAAKF,IAAW,CAC9E,GAAI,EAAE,UAAWA,GACf,OAAOE,EAGT,IAAMM,EAASC,GAAoBT,EAAO,KAAK,EAC/C,OAAIQ,EAAO,MAAM,GACfN,EAAI,KAAKM,EAAO,KAAK,EAGhBN,CACT,EAAG,CAAC,CAAC,EAEL,GAAIK,EAAyB,OAAS,EACpC,MAAM,IAAI,MACR,gGAAgGA,EAAyB,KAAK,IAAI,CAAC,GACrI,CAEJ,CAYE,GAR8CR,EAAQ,OAAQC,GAE1D,CAAC,MAAO,QAAS,MAAM,EAAE,SAASA,EAAO,UAAU,IACjD,aAAcA,EAAO,OAASA,EAAO,MAAM,UAC1C,gBAAiBA,EAAO,OAASA,EAAO,MAAM,YAEpD,EAEyC,OAAS,EACjD,MAAM,IAAI,MACR,iHACF,EAYA,GAJkCD,EAAQ,OAAQC,GACzCA,EAAO,aAAe,OAASA,EAAO,OAAO,SAAW,CAChE,EAE6B,OAAS,EACrC,MAAM,IAAI,MAAM,oEAAoE,EAwBtF,GAfgDD,EAAQ,OAAQC,GAAW,CACzE,GAAIA,EAAO,aAAe,oBACxB,MAAO,GAGT,OAAQA,EAAO,uBAAwB,CACrC,IAAK,QACH,OAAO,MAAM,KAAK,MAAMA,EAAO,OAAO,CAAC,GAAK,MAAM,KAAK,MAAMA,EAAO,OAAO,CAAC,EAC9E,IAAK,MACH,OAAO,MAAM,KAAK,MAAMA,EAAO,OAAO,CAAC,EACzC,IAAK,MACH,OAAO,MAAM,KAAK,MAAMA,EAAO,OAAO,CAAC,CAC3C,CACF,CAAC,EAE2C,OAAS,EACnD,MAAM,IAAI,MACR,oIACF,EAeF,GAN4CD,EAAQ,OAAQC,GAExDA,EAAO,aAAe,QAAUA,EAAO,YAAc,MAAM,KAAK,MAAMA,EAAO,UAAU,CAAC,CAE3F,EAEuC,OAAS,EAC/C,MAAM,IAAI,MACR,8IACF,EAOJ,CAEE,IAAMU,EAA+BX,EAAQ,OAAsB,CAACG,EAAKF,IAAW,CAClF,GAAIA,EAAO,aAAe,MACxB,OAAOE,EAGT,IAAMM,EAASC,GAAoBT,EAAO,cAAc,EACxD,OAAIQ,EAAO,MAAM,GACfN,EAAI,KAAKM,EAAO,KAAK,EAGhBN,CACT,EAAG,CAAC,CAAC,EAEL,GAAIQ,EAA6B,OAAS,EACxC,MAAM,IAAI,MACR,sGAAsGA,EAA6B,KAAK,IAAI,CAAC,EAC/I,CAEJ,CAKA,CAEE,IAAMC,EAAgCZ,EAAQ,OAAsB,CAACG,EAAKF,KACpEA,EAAO,aAAe,SAItB,CAACA,EAAO,YAAc,CAACA,EAAO,UAAY,CAACA,EAAO,UACpDE,EAAI,KACF,+BAA+BF,EAAO,MAAM,YAAY,4FAC1D,EAGKE,GACN,CAAC,CAAC,EAEL,GAAIS,EAA8B,OAAS,EACzC,MAAM,IAAI,MACR,sGAAsGA,EAA8B,KAAK,IAAI,CAAC,GAChJ,CAEJ,EAEJ,CAEA,SAASF,GAAoBH,EAA0C,CAGnE,GAAIM,GAAqBN,CAAK,EAC5B,OAAO,IAAIO,GAAI,uDAAuD,EAMxE,GAAIC,GAA8BR,CAAK,EAAG,CACxC,IAAMS,EAAe,iBAAkBT,EAAQ,IAAIA,EAAM,YAAY,KAAO,GAC5E,OAAO,IAAIO,GACT,aAAaE,CAAY,2DAA2D,QAClF,KACA,GACF,CACF,CACF,CAKA,GAAIC,GAA0BV,CAAK,EAAG,CACpC,IAAMS,EAAe,iBAAkBT,EAAQ,IAAIA,EAAM,YAAY,KAAO,GAC5E,OAAO,IAAIO,GACT,aAAaE,CAAY,uDAAuD,QAC9E,KACA,GACF,CACF,CACF,CAGF,OAAOE,GAAG,KACZ,CAEA,SAASL,GAAqBN,EAA6B,CACzD,MAAO,iBAAkBA,GAAS,CAACA,EAAM,YAC3C,CC3NO,SAASY,GAAc,CAC5B,eAAAC,EACA,MAAAC,CACF,EAGS,CACPC,GAAuB,CAAE,eAAAF,CAAe,CAAC,EAEzC,GAAM,CAAE,OAAAG,EAAQ,QAAAC,CAAQ,EAAIH,EAK5B,GAJAI,GAAeF,CAAM,EACrBG,GAAgBF,CAAO,EAGnB,CADWG,GAAM,UAAUN,CAAK,EACxB,QACV,MAAM,IAAI,MAAM,+CAA+C,CAEnE,CC3BO,IAAMO,GAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;sECA9C,OAAOC,OAAiB,mBACxB,OAAS,OAAAC,GAA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",
|
|
6
|
-
"names": ["StdioServerTransport", "dotenv", "existsSync", "join", "fileURLToPath", "toolNames", "toolGroupNames", "toolGroups", "isToolName", "value", "name", "isToolGroupName", "transports", "isTransport", "transport", "t", "invariant", "condition", "message", "__dirname", "fileURLToPath", "TEN_MINUTES_IN_MS", "ONE_HOUR_IN_MS", "THIRTY_DAYS_IN_MS", "ONE_YEAR_IN_MS", "authTypes", "isAuthType", "auth", "type", "Config", "cleansedVars", "removeClaudeMcpBundleUserConfigTemplates", "server", "siteName", "transport", "sslKey", "sslCert", "httpPortEnvVarName", "corsOriginConfig", "trustProxyConfig", "patName", "patValue", "jwtSubClaim", "clientId", "secretId", "secretValue", "jwtAdditionalPayload", "datasourceCredentials", "defaultLogLevel", "disableLogMasking", "includeTools", "excludeTools", "maxResultLimit", "disableQueryDatasourceFilterValidation", "disableMetadataApiRequests", "disableSessionManagement", "enableServerLogging", "serverLogDirectory", "includeProjectIds", "includeDatasourceIds", "includeWorkbookIds", "tableauServerVersionCheckIntervalInHours", "disableOauth", "oauthIssuer", "oauthJwePrivateKey", "oauthJwePrivateKeyPath", "oauthJwePrivateKeyPassphrase", "redirectUri", "oauthClientIdSecretPairs", "authzCodeTimeoutMs", "accessTokenTimeoutMs", "refreshTokenTimeoutMs", "parseNumber", "getCorsOriginConfig", "getTrustProxyConfig", "join", "createSetFromCommaSeparatedString", "disableOauthOverride", "acc", "curr", "secret", "isTransport", "invariant", "validateServer", "existsSync", "maxResultLimitNumber", "s", "v", "isToolName", "isToolGroupName", "toolGroups", "_", "error", "errorMessage", "origin", "value", "id", "envVars", "key", "defaultValue", "minValue", "maxValue", "number", "getConfig", "loggingLevels", "currentLogLevel", "serverLogger", "isLoggingLevel", "level", "l", "setLogLevel", "server", "silent", "log", "setServerLogger", "logger", "getSendLoggingMessageFn", "shouldLogWhenLevelIsAtLeast", "writeToStderr", "message", "getToolLogMessage", "requestId", "toolName", "args", "username", "appendFile", "existsSync", "mkdirSync", "join", "getExceptionMessage", "error", "ServerLogger", "logDirectory", "existsSync", "mkdirSync", "obj", "timestamp", "filename", "logFilePath", "join", "mutexKey", "newMutex", "appendFile", "error", "writeToStderr", "getExceptionMessage", "McpServer", "SetLevelRequestSchema", "package_default", "Ok", "z", "Err", "Ok", "maskRequest", "config", "result", "clone", "maskedData", "shouldLogWhenLevelIsAtLeast", "connection", "maskResponse", "response", "obj", "Ok", "error", "Err", "message", "getExceptionMessage", "writeToStderr", "getRequestInterceptorConfig", "config", "getResponseInterceptorConfig", "response", "Zodios", "randomUUID", "SignJWT", "getJwt", "username", "connectedApp", "scopes", "additionalPayload", "header", "payload", "makeApi", "makeEndpoint", "z", "z", "credentialsSchema", "signInRequestSchema", "z", "signInEndpoint", "makeEndpoint", "credentialsSchema", "signOutEndpoint", "authenticationApi", "makeApi", "authenticationApis", "Methods", "apiClient", "AuthenticatedMethods", "Methods", "apiClient", "creds", "AuthenticationMethods", "Methods", "baseUrl", "Zodios", "authenticationApis", "authConfig", "getJwt", "AuthenticatedAuthenticationMethods", "AuthenticatedMethods", "creds", "Zodios", "makeApi", "makeEndpoint", "z", "z", "orderingMethods", "orderBySchema", "contentTypes", "modifiedTimeSchema", "searchContentFilterBase", "searchContentFilterSchema", "searchContentItemSchema", "searchContentResponseSchema", "searchContentEndpoint", "makeEndpoint", "z", "searchContentResponseSchema", "contentExplorationApi", "makeApi", "contentExplorationApis", "ContentExplorationMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "contentExplorationApis", "queries", "key", "value", "Zodios", "makeApi", "makeEndpoint", "z", "z", "z", "projectSchema", "dataSourceSchema", "z", "projectSchema", "z", "paginationSchema", "pulsePaginationSchema", "z", "paginationParameters", "listDatasourcesEndpoint", "makeEndpoint", "paginationParameters", "z", "paginationSchema", "dataSourceSchema", "queryDatasourceEndpoint", "datasourcesApi", "makeApi", "datasourcesApis", "DatasourcesMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "datasourcesApis", "siteId", "filter", "pageSize", "pageNumber", "response", "datasourceId", "Zodios", "makeApi", "makeEndpoint", "z", "graphqlResponse", "graphqlEndpoint", "metadataApi", "metadataApis", "MetadataMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "metadataApis", "query", "Zodios", "Err", "Ok", "bind", "fn", "thisArg", "toString", "getPrototypeOf", "iterator", "toStringTag", "kindOf", "cache", "thing", "str", "kindOfTest", "type", "typeOfTest", "isArray", "isUndefined", "isBuffer", "val", "isFunction", "isArrayBuffer", "isArrayBufferView", "result", "isString", "isNumber", "isObject", "isBoolean", "isPlainObject", "prototype", "isEmptyObject", "isDate", "isFile", "isBlob", "isFileList", "isStream", "isFormData", "kind", "isURLSearchParams", "isReadableStream", "isRequest", "isResponse", "isHeaders", "trim", "forEach", "obj", "fn", "allOwnKeys", "i", "l", "keys", "len", "key", "findKey", "_key", "_global", "isContextDefined", "context", "merge", "caseless", "skipUndefined", "assignValue", "targetKey", "extend", "a", "b", "thisArg", "bind", "stripBOM", "content", "inherits", "constructor", "superConstructor", "props", "descriptors", "toFlatObject", "sourceObj", "destObj", "filter", "propFilter", "prop", "merged", "endsWith", "searchString", "position", "lastIndex", "toArray", "arr", "isTypedArray", "TypedArray", "forEachEntry", "_iterator", "pair", "matchAll", "regExp", "matches", "isHTMLForm", "toCamelCase", "m", "p1", "p2", "hasOwnProperty", "isRegExp", "reduceDescriptors", "reducer", "reducedDescriptors", "descriptor", "name", "ret", "freezeMethods", "value", "toObjectSet", "arrayOrString", "delimiter", "define", "noop", "toFiniteNumber", "defaultValue", "isSpecCompliantForm", "toJSONObject", "stack", "visit", "source", "target", "reducedValue", "isAsyncFn", "isThenable", "_setImmediate", "setImmediateSupported", "postMessageSupported", "token", "callbacks", "data", "cb", "asap", "isIterable", "utils_default", "AxiosError", "message", "code", "config", "request", "response", "utils_default", "prototype", "descriptors", "error", "customProps", "axiosError", "obj", "prop", "msg", "errCode", "AxiosError_default", "FormData", "FormData_default", "isVisitable", "thing", "utils_default", "removeBrackets", "key", "renderKey", "path", "dots", "token", "i", "isFlatArray", "arr", "predicates", "prop", "toFormData", "obj", "formData", "options", "FormData_default", "option", "source", "metaTokens", "visitor", "defaultVisitor", "indexes", "useBlob", "convertValue", "value", "AxiosError_default", "el", "index", "stack", "exposedHelpers", "build", "toFormData_default", "encode", "str", "charMap", "match", "AxiosURLSearchParams", "params", "options", "toFormData_default", "prototype", "name", "value", "encoder", "_encode", "pair", "AxiosURLSearchParams_default", "encode", "val", "buildURL", "url", "params", "options", "_encode", "utils_default", "serializeFn", "serializedParams", "AxiosURLSearchParams_default", "hashmarkIndex", "InterceptorManager", "fulfilled", "rejected", "options", "id", "fn", "utils_default", "h", "InterceptorManager_default", "transitional_default", "crypto", "url", "URLSearchParams_default", "ALPHA", "DIGIT", "ALPHABET", "generateString", "size", "alphabet", "str", "length", "randomValues", "crypto", "i", "node_default", "URLSearchParams_default", "FormData_default", "utils_exports", "__export", "hasBrowserEnv", "hasStandardBrowserEnv", "hasStandardBrowserWebWorkerEnv", "_navigator", "origin", "platform_default", "utils_exports", "node_default", "toURLEncodedForm", "data", "options", "toFormData_default", "platform_default", "value", "key", "path", "helpers", "utils_default", "parsePropPath", "name", "utils_default", "match", "arrayToObject", "arr", "obj", "keys", "i", "len", "key", "formDataToJSON", "formData", "buildPath", "path", "value", "target", "index", "isNumericKey", "isLast", "formDataToJSON_default", "stringifySafely", "rawValue", "parser", "encoder", "utils_default", "e", "defaults", "transitional_default", "data", "headers", "contentType", "hasJSONContentType", "isObjectPayload", "formDataToJSON_default", "isFileList", "toURLEncodedForm", "_FormData", "toFormData_default", "transitional", "forcedJSONParsing", "JSONRequested", "strictJSONParsing", "AxiosError_default", "platform_default", "status", "method", "defaults_default", "ignoreDuplicateOf", "utils_default", "parseHeaders_default", "rawHeaders", "parsed", "key", "val", "line", "$internals", "normalizeHeader", "header", "normalizeValue", "value", "utils_default", "parseTokens", "str", "tokens", "tokensRE", "match", "isValidHeaderName", "matchHeaderValue", "context", "filter", "isHeaderNameFilter", "formatHeader", "w", "char", "buildAccessors", "obj", "accessorName", "methodName", "arg1", "arg2", "arg3", "AxiosHeaders", "headers", "valueOrRewrite", "rewrite", "self", "setHeader", "_value", "_header", "_rewrite", "lHeader", "key", "setHeaders", "parseHeaders_default", "dest", "entry", "parser", "matcher", "deleted", "deleteHeader", "keys", "i", "format", "normalized", "targets", "asStrings", "thing", "first", "computed", "target", "accessors", "prototype", "defineAccessor", "mapped", "headerValue", "AxiosHeaders_default", "transformData", "fns", "response", "config", "defaults_default", "context", "headers", "AxiosHeaders_default", "data", "utils_default", "fn", "isCancel", "value", "CanceledError", "message", "config", "request", "AxiosError_default", "utils_default", "CanceledError_default", "settle", "resolve", "reject", "response", "validateStatus", "AxiosError_default", "isAbsoluteURL", "url", "combineURLs", "baseURL", "relativeURL", "buildFullPath", "baseURL", "requestedURL", "allowAbsoluteUrls", "isRelativeUrl", "isAbsoluteURL", "combineURLs", "proxyFromEnv", "http", "https", "util", "followRedirects", "zlib", "VERSION", "parseProtocol", "url", "match", "DATA_URL_PATTERN", "fromDataURI", "uri", "asBlob", "options", "_Blob", "platform_default", "protocol", "parseProtocol", "match", "AxiosError_default", "mime", "isBase64", "body", "buffer", "stream", "stream", "kInternals", "AxiosTransformStream", "stream", "options", "utils_default", "prop", "source", "internals", "event", "size", "chunk", "encoding", "callback", "maxRate", "readableHighWaterMark", "timeWindow", "divider", "bytesThreshold", "minChunkSize", "pushChunk", "_chunk", "_callback", "bytes", "transformChunk", "chunkSize", "chunkRemainder", "maxChunkSize", "bytesLeft", "passed", "now", "transformNextChunk", "err", "AxiosTransformStream_default", "EventEmitter", "util", "Readable", "asyncIterator", "readBlob", "blob", "readBlob_default", "BOUNDARY_ALPHABET", "platform_default", "textEncoder", "util", "CRLF", "CRLF_BYTES", "CRLF_BYTES_COUNT", "FormDataPart", "name", "value", "escapeName", "isStringValue", "utils_default", "headers", "readBlob_default", "match", "formDataToStream", "form", "headersHandler", "options", "tag", "size", "boundary", "boundaryBytes", "footerBytes", "contentLength", "parts", "part", "computedHeaders", "Readable", "formDataToStream_default", "stream", "ZlibHeaderTransformStream", "chunk", "encoding", "callback", "header", "ZlibHeaderTransformStream_default", "callbackify", "fn", "reducer", "utils_default", "args", "cb", "value", "err", "callbackify_default", "speedometer", "samplesCount", "min", "bytes", "timestamps", "head", "tail", "firstSampleTS", "chunkLength", "now", "startedAt", "i", "bytesCount", "passed", "speedometer_default", "throttle", "fn", "freq", "timestamp", "threshold", "lastArgs", "timer", "invoke", "args", "now", "passed", "throttle_default", "progressEventReducer", "listener", "isDownloadStream", "freq", "bytesNotified", "_speedometer", "speedometer_default", "throttle_default", "e", "loaded", "total", "progressBytes", "rate", "inRange", "data", "progressEventDecorator", "throttled", "lengthComputable", "asyncDecorator", "fn", "args", "utils_default", "estimateDataURLDecodedBytes", "url", "comma", "meta", "body", "effectiveLen", "len", "i", "a", "b", "pad", "idx", "tailIsPct3D", "j", "bytes", "zlibOptions", "zlib", "brotliOptions", "isBrotliSupported", "utils_default", "httpFollow", "httpsFollow", "followRedirects", "isHttps", "supportedProtocols", "platform_default", "protocol", "flushOnFinish", "stream", "throttled", "flush", "dispatchBeforeRedirect", "options", "responseDetails", "setProxy", "configProxy", "location", "proxy", "proxyUrl", "proxyFromEnv", "base64", "proxyHost", "redirectOptions", "isHttpAdapterSupported", "wrapAsync", "asyncExecutor", "resolve", "reject", "onDone", "isDone", "done", "value", "isRejected", "_resolve", "_reject", "reason", "onDoneHandler", "resolveFamily", "address", "family", "buildAddressEntry", "http_default", "config", "data", "lookup", "responseType", "responseEncoding", "method", "rejected", "req", "_lookup", "callbackify_default", "hostname", "opt", "cb", "err", "arg0", "arg1", "addresses", "addr", "emitter", "EventEmitter", "onFinished", "abort", "CanceledError_default", "fullPath", "buildFullPath", "parsed", "dataUrl", "estimateDataURLDecodedBytes", "AxiosError_default", "convertedData", "settle", "fromDataURI", "AxiosHeaders_default", "headers", "VERSION", "onUploadProgress", "onDownloadProgress", "maxRate", "maxUploadRate", "maxDownloadRate", "userBoundary", "formDataToStream_default", "formHeaders", "knownLength", "util", "readBlob_default", "contentLength", "AxiosTransformStream_default", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "auth", "username", "password", "urlUsername", "urlPassword", "path", "buildURL", "customErr", "transport", "isHttpsRequest", "https", "http", "res", "streams", "responseLength", "transformStream", "responseStream", "lastRequest", "ZlibHeaderTransformStream_default", "offListeners", "response", "responseBuffer", "totalResponseBytes", "chunk", "responseData", "socket", "timeout", "timeoutErrorMessage", "transitional", "transitional_default", "ended", "errored", "isURLSameOrigin_default", "platform_default", "origin", "isMSIE", "url", "cookies_default", "platform_default", "name", "value", "expires", "path", "domain", "secure", "cookie", "utils_default", "match", "headersToObject", "thing", "AxiosHeaders_default", "mergeConfig", "config1", "config2", "config", "getMergedValue", "target", "source", "prop", "caseless", "utils_default", "mergeDeepProperties", "a", "b", "valueFromConfig2", "defaultToConfig2", "mergeDirectKeys", "mergeMap", "merge", "configValue", "resolveConfig_default", "config", "newConfig", "mergeConfig", "data", "withXSRFToken", "xsrfHeaderName", "xsrfCookieName", "headers", "auth", "AxiosHeaders_default", "buildURL", "buildFullPath", "utils_default", "platform_default", "formHeaders", "allowedHeaders", "key", "val", "isURLSameOrigin_default", "xsrfValue", "cookies_default", "isXHRAdapterSupported", "xhr_default", "config", "resolve", "reject", "_config", "resolveConfig_default", "requestData", "requestHeaders", "AxiosHeaders_default", "responseType", "onUploadProgress", "onDownloadProgress", "onCanceled", "uploadThrottled", "downloadThrottled", "flushUpload", "flushDownload", "done", "request", "onloadend", "responseHeaders", "response", "settle", "value", "err", "AxiosError_default", "event", "msg", "timeoutErrorMessage", "transitional", "transitional_default", "utils_default", "val", "key", "progressEventReducer", "cancel", "CanceledError_default", "protocol", "parseProtocol", "platform_default", "composeSignals", "signals", "timeout", "length", "controller", "aborted", "onabort", "reason", "unsubscribe", "err", "AxiosError_default", "CanceledError_default", "timer", "signal", "utils_default", "composeSignals_default", "streamChunk", "chunk", "chunkSize", "len", "pos", "end", "readBytes", "iterable", "readStream", "stream", "reader", "done", "value", "trackStream", "onProgress", "onFinish", "iterator", "bytes", "_onFinish", "e", "controller", "loadedBytes", "err", "reason", "DEFAULT_CHUNK_SIZE", "isFunction", "utils_default", "globalFetchAPI", "fetch", "Request", "Response", "ReadableStream", "TextEncoder", "test", "fn", "args", "factory", "env", "isFetchSupported", "isRequestSupported", "isResponseSupported", "isReadableStreamSupported", "encodeText", "encoder", "str", "supportsRequestStream", "duplexAccessed", "hasContentType", "platform_default", "supportsResponseStream", "resolvers", "res", "type", "config", "method", "AxiosError_default", "getBodyLength", "body", "resolveBodyLength", "headers", "length", "url", "data", "signal", "cancelToken", "timeout", "onDownloadProgress", "onUploadProgress", "responseType", "withCredentials", "fetchOptions", "resolveConfig_default", "composedSignal", "composeSignals_default", "request", "unsubscribe", "requestContentLength", "_request", "contentTypeHeader", "onProgress", "flush", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "trackStream", "isCredentialsSupported", "resolvedOptions", "response", "isStreamResponse", "options", "prop", "responseContentLength", "responseData", "resolve", "reject", "settle", "AxiosHeaders_default", "err", "seedCache", "getFetch", "seeds", "len", "i", "seed", "target", "map", "adapter", "knownAdapters", "http_default", "xhr_default", "getFetch", "utils_default", "fn", "value", "renderReason", "reason", "isResolvedHandle", "adapter", "adapters_default", "adapters", "config", "length", "nameOrAdapter", "rejectedReasons", "i", "id", "AxiosError_default", "reasons", "state", "s", "throwIfCancellationRequested", "config", "CanceledError_default", "dispatchRequest", "AxiosHeaders_default", "transformData", "adapters_default", "defaults_default", "response", "reason", "isCancel", "validators", "type", "i", "thing", "deprecatedWarnings", "validator", "version", "message", "formatMessage", "opt", "desc", "VERSION", "value", "opts", "AxiosError_default", "correctSpelling", "assertOptions", "options", "schema", "allowUnknown", "keys", "result", "validator_default", "validators", "validator_default", "Axios", "instanceConfig", "InterceptorManager_default", "configOrUrl", "config", "err", "dummy", "stack", "mergeConfig", "transitional", "paramsSerializer", "headers", "utils_default", "contextHeaders", "method", "AxiosHeaders_default", "requestInterceptorChain", "synchronousRequestInterceptors", "interceptor", "responseInterceptorChain", "promise", "i", "len", "chain", "dispatchRequest", "newConfig", "onFulfilled", "onRejected", "error", "fullPath", "buildFullPath", "buildURL", "url", "generateHTTPMethod", "isForm", "data", "Axios_default", "CancelToken", "_CancelToken", "executor", "resolvePromise", "resolve", "token", "cancel", "i", "onfulfilled", "_resolve", "promise", "message", "config", "request", "CanceledError_default", "listener", "index", "controller", "abort", "err", "c", "CancelToken_default", "spread", "callback", "arr", "isAxiosError", "payload", "utils_default", "HttpStatusCode", "key", "value", "HttpStatusCode_default", "createInstance", "defaultConfig", "context", "Axios_default", "instance", "bind", "utils_default", "instanceConfig", "mergeConfig", "axios", "defaults_default", "CanceledError_default", "CancelToken_default", "isCancel", "VERSION", "toFormData_default", "AxiosError_default", "promises", "spread", "isAxiosError", "AxiosHeaders_default", "thing", "formDataToJSON_default", "adapters_default", "HttpStatusCode_default", "axios_default", "Axios", "AxiosError", "CanceledError", "isCancel", "CancelToken", "VERSION", "all", "Cancel", "isAxiosError", "spread", "toFormData", "AxiosHeaders", "HttpStatusCode", "formToJSON", "getAdapter", "mergeConfig", "axios_default", "makeApi", "makeEndpoint", "z", "z", "pulseMetadataSchema", "pulseDatasourceSchema", "pulseFilterSchema", "pulseBasicSpecificationSchema", "pulseSpecificationSchema", "pulseExtensionOptionsSchema", "pulseMetricSpecificationSchema", "pulseGoalsSchema", "pulseMetricSchema", "pulseRepresentationOptionsSchema", "insightOptionsSchema", "comparisonSchema", "datasourceGoalsSchema", "pulseMetricDefinitionSchema", "pulseMetricSubscriptionSchema", "languageEnumSchema", "localeEnumSchema", "outputFormatEnumSchema", "pulseBundleRequestSchema", "popcBanInsightGroupSchema", "pulseBundleResponseSchema", "pulseInsightBundleTypeEnum", "pulseMetricDefinitionViewEnum", "listAllPulseMetricDefinitionsRestEndpoint", "makeEndpoint", "z", "pulseMetricDefinitionViewEnum", "pulseMetricDefinitionSchema", "listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint", "listPulseMetricsFromMetricDefinitionIdRestEndpoint", "pulseMetricSchema", "listPulseMetricsFromMetricIdsRestEndpoint", "listPulseMetricSubscriptionsForCurrentUserRestEndpoint", "pulseMetricSubscriptionSchema", "generatePulseMetricValueInsightBundleRestEndpoint", "pulseBundleRequestSchema", "pulseInsightBundleTypeEnum", "pulseBundleResponseSchema", "pulseApi", "makeApi", "pulseApis", "PulseMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "pulseApis", "view", "pageToken", "pageSize", "guardAgainstPulseDisabled", "response", "metricDefinitionIds", "pulseMetricDefinitionID", "metricIds", "bundleRequest", "bundleType", "callback", "Ok", "error", "isAxiosError", "Err", "isErrorFromAlias", "Zodios", "Err", "Ok", "makeApi", "makeEndpoint", "z", "z", "serverInfo", "z", "siteSchema", "z", "userSchema", "sessionSchema", "z", "siteSchema", "userSchema", "getServerInfoEndpoint", "makeEndpoint", "serverInfo", "getCurrentServerSessionEndpoint", "serverApi", "makeApi", "serverApis", "ServerMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "serverApis", "response", "Ok", "error", "isErrorFromAlias", "Err", "isAxiosError", "getExceptionMessage", "Zodios", "makeApi", "makeEndpoint", "z", "z", "viewSchema", "getViewEndpoint", "makeEndpoint", "z", "viewSchema", "queryViewDataEndpoint", "queryViewImageEndpoint", "queryViewsForWorkbookEndpoint", "queryViewsForSiteEndpoint", "paginationParameters", "paginationSchema", "viewsApi", "makeApi", "viewsApis", "ViewsMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "viewsApis", "viewId", "siteId", "width", "height", "resolution", "workbookId", "includeUsageStatistics", "filter", "pageSize", "pageNumber", "response", "isErrorFromAlias", "Zodios", "ZodiosError", "Err", "Ok", "makeApi", "z", "Connection", "Datasource", "ReturnFormat", "QueryOptions", "ReadMetadataRequest", "Function", "DataType", "PeriodType", "FieldMetadata", "ParameterValue", "ParameterBase", "Parameter", "MetadataOutput", "TableauError", "SortDirection", "FieldBase", "Field", "FilterField", "FilterBase", "SimpleFilterBase", "SetFilter", "RelativeDateFilterBase", "RelativeDateFilter", "MatchFilterBase", "MatchFilter", "QuantitativeNumericalFilterBase", "QuantitativeNumericalFilter", "QuantitativeDateFilterBase", "QuantitativeDateFilter", "TopNFilter", "Filter", "Query", "QueryDatasourceOptions", "QueryRequest", "QueryOutput", "vizqlDataServiceApi", "vizqlDataServiceApis", "VizqlDataServiceMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "vizqlDataServiceApis", "queryRequest", "Ok", "error", "isErrorFromAlias", "Err", "ZodiosError", "readMetadataRequest", "Zodios", "makeApi", "makeEndpoint", "z", "z", "workbookSchema", "z", "projectSchema", "viewSchema", "getWorkbookEndpoint", "makeEndpoint", "z", "workbookSchema", "queryWorkbooksForSiteEndpoint", "paginationParameters", "paginationSchema", "workbooksApi", "makeApi", "workbooksApis", "WorkbooksMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "workbooksApis", "workbookId", "siteId", "filter", "pageSize", "pageNumber", "response", "RestApi", "_RestApi", "host", "options", "AuthenticationMethods", "AuthenticatedAuthenticationMethods", "ContentExplorationMethods", "DatasourcesMethods", "baseUrl", "MetadataMethods", "PulseMethods", "ServerMethods", "VizqlDataServiceMethods", "ViewsMethods", "WorkbooksMethods", "authConfig", "accessToken", "userId", "parts", "siteId", "interceptors", "config", "getRequestInterceptorConfig", "error", "response", "getResponseInterceptorConfig", "getNewRestApiInstanceAsync", "config", "requestId", "server", "jwtScopes", "authInfo", "tableauServer", "invariant", "restApi", "RestApi", "getRequestInterceptor", "getRequestErrorInterceptor", "getResponseInterceptor", "getResponseErrorInterceptor", "getJwtSubClaim", "getJwtAdditionalPayload", "useRestApi", "callback", "request", "getUserAgent", "logRequest", "error", "baseUrl", "isAxiosError", "log", "getExceptionMessage", "getRequestInterceptorConfig", "response", "logResponse", "getResponseInterceptorConfig", "maskedRequest", "getConfig", "maskRequest", "url", "messageObj", "shouldLogWhenLevelIsAtLeast", "maskedResponse", "maskResponse", "userAgentParts", "userAgent", "name", "version", "json", "z", "z", "requiredString", "property", "mcpAuthorizeSchema", "z", "requiredString", "data", "mcpTokenSchema", "issue", "ctx", "opt", "client_id", "client_secret", "clientIdSecretPair", "callbackSchema", "mcpAccessTokenUserOnlySchema", "mcpAccessTokenSchema", "tableauAuthInfoSchema", "getTableauAuthInfo", "authInfo", "tableauAuthInfo", "tableauAuthInfoSchema", "ZodiosError", "fromError", "isZodErrorLike", "Provider", "provider", "Tool", "server", "name", "description", "paramsSchema", "annotations", "argsValidator", "callback", "Provider", "requestId", "args", "username", "log", "getToolLogMessage", "authInfo", "getSuccessResult", "getErrorText", "constrainSuccessResult", "tableauAuthInfoSchema", "error", "getErrorResult", "result", "constrainedResult", "ZodiosError", "isZodErrorLike", "validationError", "fromError", "getExceptionMessage", "buildOrderByString", "orderBy", "methodsUsed", "ordering", "buildFilterString", "filter", "filterExpressions", "typesUsed", "type", "idsUsed", "id", "modifiedTimesUsed", "modifiedTime", "startDate", "endDate", "reduceSearchContentResponse", "response", "searchResults", "item", "getReducedSearchItemContent", "unifiedDatasourceLuids", "datasourceLuid", "content", "reducedContent", "constrainSearchContent", "items", "boundedContext", "projectIds", "datasourceIds", "workbookIds", "paramsSchema", "z", "orderBySchema", "searchContentFilterSchema", "getSearchContentTool", "server", "searchContentTool", "Tool", "terms", "limit", "orderBy", "filter", "requestId", "authInfo", "config", "getConfig", "orderByString", "buildOrderByString", "filterString", "buildFilterString", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "response", "reduceSearchContentResponse", "items", "constrainSearchContent", "Err", "Ok", "z", "getVizqlDataServiceDisabledError", "ResourceAccessChecker", "_ResourceAccessChecker", "boundedContext", "getConfig", "datasourceLuid", "restApiArgs", "result", "workbookId", "viewId", "config", "requestId", "server", "cachedResult", "datasourceProjectId", "useRestApi", "restApi", "error", "getExceptionMessage", "workbook", "viewWorkbookId", "viewProjectId", "view", "resourceAccessChecker", "exportedForTesting", "validateDatasourceLuid", "datasourceLuid", "z", "fieldSchema", "parameterSchema", "fieldsResultSchema", "simplifyReadMetadataResult", "readMetadataResult", "simplifiedResponse", "field", "toPush", "parameter", "combineFields", "listFieldsResult", "combinedFields", "populateFieldWithAdditionalProperties", "matchingListField", "f", "sourceField", "targetField", "getGraphqlQuery", "datasourceLuid", "paramsSchema", "z", "getGetDatasourceMetadataTool", "server", "getDatasourceMetadataTool", "Tool", "validateDatasourceLuid", "requestId", "authInfo", "config", "getConfig", "query", "isDatasourceAllowedResult", "resourceAccessChecker", "useRestApi", "getTableauAuthInfo", "restApi", "readMetadataResult", "Err", "Ok", "simplifyReadMetadataResult", "listFieldsResult", "combineFields", "fields", "error", "getVizqlDataServiceDisabledError", "Ok", "z", "Ok", "z", "pageConfigSchema", "paginate", "pageConfig", "getDataFn", "pageSize", "limit", "pagination", "data", "result", "totalAvailable", "pageNumber", "nextPagination", "nextData", "pulsePaginateConfigSchema", "pulsePaginate", "config", "validatedConfig", "resultArray", "total_available", "next_page_token", "genericFilterDescription", "z", "z", "FilterOperatorSchema", "isISO8601DateTime", "value", "dateTimeFields", "parseAndValidateFilterString", "filterString", "allowedOperatorsByField", "filterFieldSchema", "isOperatorAllowed", "field", "operator", "expressions", "f", "parsedFilters", "expr", "fieldRaw", "operatorRaw", "valueParts", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateDatasourcesFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListDatasourcesTool", "server", "listDatasourcesTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "authInfo", "config", "getConfig", "validatedFilter", "parseAndValidateDatasourcesFilterString", "datasources", "useRestApi", "getTableauAuthInfo", "restApi", "paginate", "pageConfig", "pagination", "data", "Ok", "constrainDatasources", "boundedContext", "projectIds", "datasourceIds", "datasource", "Err", "z", "getPulseDisabledError", "reason", "paramsSchema", "pulseBundleRequestSchema", "z", "pulseInsightBundleTypeEnum", "getGeneratePulseMetricValueInsightBundleTool", "server", "generatePulseMetricValueInsightBundleTool", "Tool", "bundleRequest", "bundleType", "requestId", "authInfo", "config", "getConfig", "datasourceIds", "datasourceLuid", "Err", "result", "useRestApi", "getTableauAuthInfo", "restApi", "insightBundle", "error", "getPulseDisabledError", "Ok", "z", "constrainPulseDefinitions", "boundedContext", "definitions", "datasourceIds", "definition", "paramsSchema", "z", "pulseMetricDefinitionViewEnum", "getListAllPulseMetricDefinitionsTool", "server", "listAllPulseMetricDefinitionsTool", "Tool", "view", "limit", "pageSize", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "pulsePaginate", "pageToken", "apiResult", "Ok", "definitions", "constrainPulseDefinitions", "getPulseDisabledError", "z", "paramsSchema", "z", "pulseMetricDefinitionViewEnum", "getListPulseMetricDefinitionsFromDefinitionIdsTool", "server", "listPulseMetricDefinitionsFromDefinitionIdsTool", "Tool", "view", "metricDefinitionIds", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "definitions", "constrainPulseDefinitions", "getPulseDisabledError", "z", "constrainPulseMetrics", "metrics", "boundedContext", "datasourceIds", "metric", "paramsSchema", "z", "getListPulseMetricsFromMetricDefinitionIdTool", "server", "listPulseMetricsFromMetricDefinitionIdTool", "Tool", "pulseMetricDefinitionID", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "metrics", "constrainPulseMetrics", "getPulseDisabledError", "z", "paramsSchema", "z", "getListPulseMetricsFromMetricIdsTool", "server", "listPulseMetricsFromMetricIdsTool", "Tool", "metricIds", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "metrics", "constrainPulseMetrics", "getPulseDisabledError", "paramsSchema", "getListPulseMetricSubscriptionsTool", "server", "listPulseMetricSubscriptionsTool", "Tool", "_", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "subscriptions", "constrainPulseMetricSubscriptions", "getPulseDisabledError", "boundedContext", "restApiArgs", "datasourceIds", "metricsResult", "subscription", "getExceptionMessage", "allowedMetricIds", "metric", "error", "ZodiosError", "Err", "z", "z", "schema", "z", "luid", "u", "p", "credentialMap", "initialized", "getDatasourceCredentials", "datasourceLuid", "datasourceCredentials", "getConfig", "obj", "e", "parsed", "handleQueryDatasourceError", "error", "errorDetail", "validateFields", "fields", "hasEmptyFieldCaption", "sortPriorities", "acc", "field", "duplicateSortPriorities", "_", "duplicateSortPrioritiesArr", "priority", "fieldsWithBothFunctionAndCalculation", "hasFunctionAndCalculation", "fieldsWithNegativeMaxDecimalPlace", "hasNegativeMaxDecimalPlace", "hasFieldCaptionAndCalculation", "Err", "Ok", "validateFilters", "filters", "filter", "fieldCounts", "acc", "fieldsWithMultipleFilters", "_", "count", "field", "filtersWithInvalidFields", "result", "validateFilterField", "topNFiltersWithInvalidFields", "matchFiltersWithInvalidFields", "hasEmptyFieldCaption", "Err", "hasFieldCaptionAndCalculation", "fieldCaption", "hasFunctionAndCalculation", "Ok", "validateQuery", "datasourceLuid", "query", "validateDatasourceLuid", "fields", "filters", "validateFields", "validateFilters", "Query", "queryDatasourceToolDescription", "levenshtein", "Err", "Ok", "validateFilterValues", "server", "query", "vizqlDataServiceMethods", "datasource", "Ok", "validationErrors", "filtersToValidate", "filter", "fieldCaption", "result", "validateSetFilter", "validateMatchFilter", "error", "log", "Err", "filterValues", "v", "queryRequest", "data", "existingValues", "row", "invalidValues", "value", "suggestedValues", "getFuzzyMatches", "message", "fieldValues", "similarValues", "lowerValue", "fuzzyStartMatch", "pattern", "len", "dynamicDistance", "startSlice", "levenshtein", "fuzzyEndMatch", "endSlice", "fuzzyContainsMatch", "_", "i", "dist", "patternDescriptions", "similarValuesString", "maxDistance", "maxSuggestions", "suggestions", "existingValue", "matches", "invalidValue", "match", "a", "b", "bestMatch", "toReturn", "suggestionLimitPerInvalidValue", "invalidValueSuggestionCounter", "suggestionForInvalidValue", "paramsSchema", "z", "Query", "getQueryDatasourceTool", "server", "queryDatasourceTool", "Tool", "queryDatasourceToolDescription", "validateQuery", "datasourceLuid", "query", "requestId", "authInfo", "config", "getConfig", "isDatasourceAllowedResult", "resourceAccessChecker", "Err", "datasource", "options", "credentials", "getDatasourceCredentials", "queryRequest", "useRestApi", "getTableauAuthInfo", "restApi", "filterValidationResult", "validateFilterValues", "errorMessage", "error", "result", "ZodiosError", "queryOutput", "getVizqlDataServiceDisabledError", "handleQueryDatasourceError", "Err", "Ok", "z", "paramsSchema", "z", "getGetViewDataTool", "server", "getViewDataTool", "Tool", "viewId", "requestId", "authInfo", "config", "getConfig", "isViewAllowedResult", "resourceAccessChecker", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "Err", "viewData", "error", "Err", "Ok", "z", "convertPngDataToToolResult", "pngData", "paramsSchema", "z", "getGetViewImageTool", "server", "getViewImageTool", "Tool", "viewId", "width", "height", "requestId", "authInfo", "config", "getConfig", "isViewAllowedResult", "resourceAccessChecker", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "Err", "viewImage", "convertPngDataToToolResult", "error", "Ok", "z", "z", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateViewsFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListViewsTool", "server", "listViewsTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "authInfo", "config", "getConfig", "validatedFilter", "parseAndValidateViewsFilterString", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "paginate", "pageConfig", "pagination", "data", "views", "constrainViews", "boundedContext", "projectIds", "workbookIds", "view", "Err", "Ok", "z", "paramsSchema", "z", "getGetWorkbookTool", "server", "getWorkbookTool", "Tool", "workbookId", "requestId", "authInfo", "config", "getConfig", "isWorkbookAllowedResult", "resourceAccessChecker", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "workbook", "views", "Err", "error", "Ok", "z", "z", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateWorkbooksFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListWorkbooksTool", "server", "listWorkbooksTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "authInfo", "config", "getConfig", "validatedFilter", "parseAndValidateWorkbooksFilterString", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "paginate", "pageConfig", "pagination", "data", "workbooks", "constrainWorkbooks", "boundedContext", "projectIds", "workbookIds", "workbook", "toolFactories", "getGetDatasourceMetadataTool", "getListDatasourcesTool", "getQueryDatasourceTool", "getListAllPulseMetricDefinitionsTool", "getListPulseMetricDefinitionsFromDefinitionIdsTool", "getListPulseMetricsFromMetricDefinitionIdTool", "getListPulseMetricsFromMetricIdsTool", "getListPulseMetricSubscriptionsTool", "getGeneratePulseMetricValueInsightBundleTool", "getGetWorkbookTool", "getGetViewDataTool", "getGetViewImageTool", "getListWorkbooksTool", "getListViewsTool", "getSearchContentTool", "serverName", "serverVersion", "package_default", "userAgent", "Server", "McpServer", "clientInfo", "name", "description", "paramsSchema", "annotations", "callback", "SetLevelRequestSchema", "request", "setLogLevel", "includeTools", "excludeTools", "getConfig", "toolsToRegister", "toolFactories", "tool", "toolNames", "StreamableHTTPServerTransport", "isInitializeRequest", "cors", "express", "fs", "existsSync", "http", "https", "StreamableHTTPServerTransport", "randomUUID", "sessions", "createSession", "clientInfo", "transport", "sessionId", "deleteSession", "getSession", "validateProtocolVersion", "req", "res", "next", "version", "supportedVersions", "createPrivateKey", "createPublicKey", "readFileSync", "oauthAuthorizationServer", "app", "_req", "res", "origin", "getConfig", "oauthProtectedResource", "app", "_req", "res", "issuer", "getConfig", "serverName", "compactDecrypt", "Err", "Ok", "fromError", "authMiddleware", "privateKey", "req", "res", "next", "authHeader", "baseUrl", "token", "result", "verifyAccessToken", "jwePrivateKey", "config", "getConfig", "plaintext", "compactDecrypt", "payload", "mcpAccessToken", "mcpAccessTokenUserOnlySchema", "Err", "fromError", "iss", "aud", "exp", "clientId", "AUDIENCE", "tableauAuthInfo", "mcpAccessTokenSchema", "tableauAccessToken", "tableauRefreshToken", "tableauExpiresAt", "tableauUserId", "tableauServer", "sub", "Ok", "randomBytes", "randomUUID", "fromError", "setLongTimeout", "callback", "delay", "args", "createHash", "generateCodeChallenge", "verifier", "isValidRedirectUri", "redirectUri", "url", "authorize", "app", "pendingAuthorizations", "config", "getConfig", "req", "res", "result", "mcpAuthorizeSchema", "fromError", "clientId", "redirectUri", "responseType", "codeChallenge", "codeChallengeMethod", "state", "isValidRedirectUri", "tableauState", "randomBytes", "authKey", "tableauClientId", "randomUUID", "numCodeVerifierBytes", "tableauCodeVerifier", "tableauCodeChallenge", "generateCodeChallenge", "setLongTimeout", "server", "TABLEAU_CLOUD_SERVER_URL", "oauthUrl", "getDeviceName", "defaultDeviceName", "url", "randomBytes", "Err", "Ok", "fromError", "Zodios", "makeApi", "z", "tableauAccessTokenRequestSchema", "z", "tableauAccessTokenResponseSchema", "requiredString", "data", "tableauTokenApi", "makeApi", "tableauAccessTokenResponseSchema", "tableauAccessTokenRequestSchema", "getClient", "basePath", "Zodios", "tableauTokenApi", "getTokenResult", "basePath", "request", "getClient", "userAgent", "callback", "app", "pendingAuthorizations", "authorizationCodes", "config", "getConfig", "req", "res", "result", "callbackSchema", "fromError", "error", "code", "state", "authKey", "tableauState", "pendingAuth", "tokensResult", "exchangeAuthorizationCode", "TABLEAU_CLOUD_SERVER_URL", "accessToken", "refreshToken", "expiresInSeconds", "originHost", "originHostUrl", "configServerUrl", "server", "restApi", "RestApi", "sessionResult", "authorizationCode", "randomBytes", "redirectUrl", "redirectUri", "clientId", "codeVerifier", "getTokenResult", "Ok", "Err", "express", "register", "app", "express", "req", "res", "redirect_uris", "validatedRedirectUris", "uri", "isValidRedirectUri", "token_endpoint_auth_method", "randomBytes", "timingSafeEqual", "CompactEncrypt", "Err", "Ok", "fromError", "token", "app", "authorizationCodes", "refreshTokens", "publicKey", "config", "getConfig", "req", "res", "result", "mcpTokenSchema", "fromError", "clientCredentialsResult", "verifyClientCredentials", "code", "codeVerifier", "authCode", "generateCodeChallenge", "refreshTokenId", "randomBytes", "accessToken", "createAccessToken", "setLongTimeout", "createClientCredentialsAccessToken", "refreshToken", "tokenData", "tableauRefreshToken", "tokensResult", "exchangeRefreshToken", "newTableauAccessToken", "newTableauRefreshToken", "expiresInSeconds", "error", "payload", "AUDIENCE", "CompactEncrypt", "clientCredentials", "server", "clientId", "getTokenResult", "Ok", "Err", "required", "clientSecret", "clientIdSecretPairs", "authorizationHeader", "type", "credentials", "expectedClientSecret", "textEncoder", "clientSecretBuffer", "expectedClientSecretBuffer", "timingSafeEqual", "TABLEAU_CLOUD_SERVER_URL", "AUDIENCE", "OAuthProvider", "getConfig", "createPublicKey", "authMiddleware", "app", "oauthAuthorizationServer", "oauthProtectedResource", "register", "authorize", "callback", "token", "privateKeyContents", "readFileSync", "createPrivateKey", "SESSION_ID_HEADER", "startExpressServer", "basePath", "config", "logLevel", "app", "express", "cors", "middleware", "oauthProvider", "OAuthProvider", "validateProtocolVersion", "path", "createMcpServer", "methodNotAllowed", "handleSessionRequest", "resolve", "server", "http", "existsSync", "options", "fs", "https", "req", "res", "transport", "Server", "StreamableHTTPServerTransport", "connect", "sessionId", "session", "getSession", "isInitializeRequest", "clientInfo", "createSession", "error", "setLogLevel", "_req", "startServer", "dotenv", "config", "getConfig", "logLevel", "isLoggingLevel", "setServerLogger", "ServerLogger", "server", "Server", "transport", "StdioServerTransport", "setLogLevel", "log", "url", "startExpressServer", "serverName", "serverVersion", "writeToStderr", "error", "getExceptionMessage"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/config.ts", "../src/tools/toolName.ts", "../src/transports.ts", "../src/utils/invariant.ts", "../src/logging/log.ts", "../src/logging/serverLogger.ts", "../src/utils/getExceptionMessage.ts", "../src/server.ts", "../package.json", "../src/tools/contentExploration/searchContent.ts", "../src/logging/secretMask.ts", "../src/sdks/tableau/interceptors.ts", "../src/sdks/tableau/methods/authenticationMethods.ts", "../src/utils/getJwt.ts", "../src/sdks/tableau/apis/authenticationApi.ts", "../src/sdks/tableau/types/credentials.ts", "../src/sdks/tableau/methods/methods.ts", "../src/sdks/tableau/methods/authenticatedMethods.ts", "../src/sdks/tableau/methods/contentExplorationMethods.ts", "../src/sdks/tableau/apis/contentExplorationApi.ts", "../src/sdks/tableau/types/contentExploration.ts", "../src/sdks/tableau/methods/datasourcesMethods.ts", "../src/sdks/tableau/apis/datasourcesApi.ts", "../src/sdks/tableau/types/dataSource.ts", "../src/sdks/tableau/types/project.ts", "../src/sdks/tableau/types/pagination.ts", "../src/sdks/tableau/apis/paginationParameters.ts", "../src/sdks/tableau/methods/metadataMethods.ts", "../src/sdks/tableau/apis/metadataApi.ts", "../src/sdks/tableau/methods/pulseMethods.ts", "../node_modules/axios/lib/helpers/bind.js", "../node_modules/axios/lib/utils.js", "../node_modules/axios/lib/core/AxiosError.js", "../node_modules/axios/lib/platform/node/classes/FormData.js", "../node_modules/axios/lib/helpers/toFormData.js", "../node_modules/axios/lib/helpers/AxiosURLSearchParams.js", "../node_modules/axios/lib/helpers/buildURL.js", "../node_modules/axios/lib/core/InterceptorManager.js", "../node_modules/axios/lib/defaults/transitional.js", "../node_modules/axios/lib/platform/node/index.js", "../node_modules/axios/lib/platform/node/classes/URLSearchParams.js", "../node_modules/axios/lib/platform/common/utils.js", "../node_modules/axios/lib/platform/index.js", "../node_modules/axios/lib/helpers/toURLEncodedForm.js", "../node_modules/axios/lib/helpers/formDataToJSON.js", "../node_modules/axios/lib/defaults/index.js", "../node_modules/axios/lib/helpers/parseHeaders.js", "../node_modules/axios/lib/core/AxiosHeaders.js", "../node_modules/axios/lib/core/transformData.js", "../node_modules/axios/lib/cancel/isCancel.js", "../node_modules/axios/lib/cancel/CanceledError.js", "../node_modules/axios/lib/core/settle.js", "../node_modules/axios/lib/helpers/isAbsoluteURL.js", "../node_modules/axios/lib/helpers/combineURLs.js", "../node_modules/axios/lib/core/buildFullPath.js", "../node_modules/axios/lib/adapters/http.js", "../node_modules/axios/lib/env/data.js", "../node_modules/axios/lib/helpers/parseProtocol.js", "../node_modules/axios/lib/helpers/fromDataURI.js", "../node_modules/axios/lib/helpers/AxiosTransformStream.js", "../node_modules/axios/lib/helpers/formDataToStream.js", "../node_modules/axios/lib/helpers/readBlob.js", "../node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js", "../node_modules/axios/lib/helpers/callbackify.js", "../node_modules/axios/lib/helpers/speedometer.js", "../node_modules/axios/lib/helpers/throttle.js", "../node_modules/axios/lib/helpers/progressEventReducer.js", "../node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js", "../node_modules/axios/lib/helpers/isURLSameOrigin.js", "../node_modules/axios/lib/helpers/cookies.js", "../node_modules/axios/lib/core/mergeConfig.js", "../node_modules/axios/lib/helpers/resolveConfig.js", "../node_modules/axios/lib/adapters/xhr.js", "../node_modules/axios/lib/helpers/composeSignals.js", "../node_modules/axios/lib/helpers/trackStream.js", "../node_modules/axios/lib/adapters/fetch.js", "../node_modules/axios/lib/adapters/adapters.js", "../node_modules/axios/lib/core/dispatchRequest.js", "../node_modules/axios/lib/helpers/validator.js", "../node_modules/axios/lib/core/Axios.js", "../node_modules/axios/lib/cancel/CancelToken.js", "../node_modules/axios/lib/helpers/spread.js", "../node_modules/axios/lib/helpers/isAxiosError.js", "../node_modules/axios/lib/helpers/HttpStatusCode.js", "../node_modules/axios/lib/axios.js", "../node_modules/axios/index.js", "../src/utils/axios.ts", "../src/sdks/tableau/apis/pulseApi.ts", "../src/sdks/tableau/types/pulse.ts", "../src/sdks/tableau/methods/serverMethods.ts", "../src/sdks/tableau/apis/serverApi.ts", "../src/sdks/tableau/types/serverInfo.ts", "../src/sdks/tableau/types/site.ts", "../src/sdks/tableau/types/user.ts", "../src/sdks/tableau/methods/viewsMethods.ts", "../src/sdks/tableau/apis/viewsApi.ts", "../src/sdks/tableau/types/view.ts", "../src/sdks/tableau/methods/vizqlDataServiceMethods.ts", "../src/sdks/tableau/apis/vizqlDataServiceApi.ts", "../src/sdks/tableau/methods/workbooksMethods.ts", "../src/sdks/tableau/apis/workbooksApi.ts", "../src/sdks/tableau/types/workbook.ts", "../src/sdks/tableau/restApi.ts", "../src/restApiInstance.ts", "../src/server/oauth/schemas.ts", "../src/utils/requiredString.ts", "../src/server/oauth/getTableauAuthInfo.ts", "../src/tools/tool.ts", "../src/utils/provider.ts", "../src/tools/contentExploration/searchContentUtils.ts", "../src/tools/getDatasourceMetadata/getDatasourceMetadata.ts", "../src/tools/getVizqlDataServiceDisabledError.ts", "../src/tools/resourceAccessChecker.ts", "../src/tools/validateDatasourceLuid.ts", "../src/tools/getDatasourceMetadata/datasourceMetadataUtils.ts", "../src/tools/listDatasources/listDatasources.ts", "../src/utils/paginate.ts", "../src/tools/genericFilterDescription.ts", "../src/tools/listDatasources/datasourcesFilterUtils.ts", "../src/utils/parseAndValidateFilterString.ts", "../src/tools/pulse/generateMetricValueInsightBundle/generatePulseMetricValueInsightBundleTool.ts", "../src/tools/pulse/getPulseDisabledError.ts", "../src/tools/pulse/listAllMetricDefinitions/listAllPulseMetricDefinitions.ts", "../src/tools/pulse/constrainPulseDefinitions.ts", "../src/tools/pulse/listMetricDefinitionsFromDefinitionIds/listPulseMetricDefinitionsFromDefinitionIds.ts", "../src/tools/pulse/listMetricsFromMetricDefinitionId/listPulseMetricsFromMetricDefinitionId.ts", "../src/tools/pulse/constrainPulseMetrics.ts", "../src/tools/pulse/listMetricsFromMetricIds/listPulseMetricsFromMetricIds.ts", "../src/tools/pulse/listMetricSubscriptions/listPulseMetricSubscriptions.ts", "../src/tools/queryDatasource/queryDatasource.ts", "../src/getTableauServerVersion.ts", "../src/utils/expiringMap.ts", "../src/utils/isTableauVersionAtLeast.ts", "../src/tools/queryDatasource/datasourceCredentials.ts", "../src/tools/queryDatasource/queryDatasourceErrorHandler.ts", "../src/tools/queryDatasource/validators/validateFields.ts", "../src/tools/queryDatasource/validators/validateFilters.ts", "../src/tools/queryDatasource/queryDatasourceValidator.ts", "../src/tools/queryDatasource/queryDescription.2025.3.ts", "../src/tools/queryDatasource/queryDescription.ts", "../src/tools/queryDatasource/validators/validateFilterValues.ts", "../src/tools/queryDatasource/validators/validateQueryAgainstDatasourceMetadata.ts", "../src/tools/views/getViewData.ts", "../src/tools/views/getViewImage.ts", "../src/tools/convertPngDataToToolResult.ts", "../src/tools/views/listViews.ts", "../src/tools/views/viewsFilterUtils.ts", "../src/tools/workbooks/getWorkbook.ts", "../src/tools/workbooks/listWorkbooks.ts", "../src/tools/workbooks/workbooksFilterUtils.ts", "../src/tools/tools.ts", "../src/server/express.ts", "../src/sessions.ts", "../src/server/middleware.ts", "../src/server/oauth/provider.ts", "../src/server/oauth/.well-known/oauth-authorization-server.ts", "../src/server/oauth/.well-known/oauth-protected-resource.ts", "../src/server/oauth/authMiddleware.ts", "../src/server/oauth/authorize.ts", "../src/utils/parseUrl.ts", "../src/utils/setLongTimeout.ts", "../src/server/oauth/clientMetadataCache.ts", "../src/server/oauth/dnsResolver.ts", "../src/server/oauth/generateCodeChallenge.ts", "../src/server/oauth/isValidRedirectUri.ts", "../src/server/oauth/callback.ts", "../src/sdks/tableau-oauth/client.ts", "../src/sdks/tableau-oauth/apis.ts", "../src/sdks/tableau-oauth/types.ts", "../src/sdks/tableau-oauth/methods.ts", "../src/server/oauth/register.ts", "../src/server/oauth/token.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport dotenv from 'dotenv';\n\nimport { getConfig } from './config.js';\nimport { isLoggingLevel, log, setLogLevel, setServerLogger, writeToStderr } from './logging/log.js';\nimport { ServerLogger } from './logging/serverLogger.js';\nimport { Server, serverName, serverVersion } from './server.js';\nimport { startExpressServer } from './server/express.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\n\nasync function startServer(): Promise<void> {\n dotenv.config();\n const config = getConfig();\n\n const logLevel = isLoggingLevel(config.defaultLogLevel) ? config.defaultLogLevel : 'debug';\n if (config.enableServerLogging) {\n setServerLogger(new ServerLogger({ logDirectory: config.serverLogDirectory }));\n }\n\n switch (config.transport) {\n case 'stdio': {\n const server = new Server();\n await server.registerTools();\n server.registerRequestHandlers();\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n setLogLevel(server, logLevel);\n log.info(server, `${server.name} v${server.version} running on stdio`);\n break;\n }\n case 'http': {\n const { url } = await startExpressServer({ basePath: serverName, config, logLevel });\n\n if (!config.oauth.enabled) {\n console.warn(\n '\u26A0\uFE0F TRANSPORT is \"http\" but OAuth is disabled! Your MCP server may not be protected from unauthorized access! By having explicitly disabled OAuth by setting the DANGEROUSLY_DISABLE_OAUTH environment variable to \"true\", you accept any and all risks associated with this decision.',\n );\n }\n\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(\n `${serverName} v${serverVersion} ${config.disableSessionManagement ? 'stateless ' : ''}streamable HTTP server available at ${url}`,\n );\n break;\n }\n }\n\n if (config.disableLogMasking) {\n writeToStderr('\u26A0\uFE0F Log masking is disabled!');\n }\n}\n\ntry {\n await startServer();\n} catch (error) {\n writeToStderr(`Fatal error when starting the server: ${getExceptionMessage(error)}`);\n process.exit(1);\n}\n", "import { CorsOptions } from 'cors';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { fileURLToPath } from 'url';\n\nimport { isToolGroupName, isToolName, toolGroups, ToolName } from './tools/toolName.js';\nimport { isTransport, TransportName } from './transports.js';\nimport invariant from './utils/invariant.js';\n\nconst __dirname = fileURLToPath(new URL('.', import.meta.url));\n\nexport const TEN_MINUTES_IN_MS = 10 * 60 * 1000;\nexport const ONE_HOUR_IN_MS = 60 * 60 * 1000;\nexport const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000;\nexport const THIRTY_DAYS_IN_MS = 30 * 24 * 60 * 60 * 1000;\nexport const ONE_YEAR_IN_MS = 365.25 * 24 * 60 * 60 * 1000;\n\nconst authTypes = ['pat', 'direct-trust', 'oauth'] as const;\ntype AuthType = (typeof authTypes)[number];\n\nfunction isAuthType(auth: unknown): auth is AuthType {\n return !!authTypes.find((type) => type === auth);\n}\n\nexport type BoundedContext = {\n projectIds: Set<string> | null;\n datasourceIds: Set<string> | null;\n workbookIds: Set<string> | null;\n};\n\nexport class Config {\n auth: AuthType;\n server: string;\n transport: TransportName;\n sslKey: string;\n sslCert: string;\n httpPort: number;\n corsOriginConfig: CorsOptions['origin'];\n trustProxyConfig: boolean | number | string | null;\n siteName: string;\n patName: string;\n patValue: string;\n jwtSubClaim: string;\n connectedAppClientId: string;\n connectedAppSecretId: string;\n connectedAppSecretValue: string;\n jwtAdditionalPayload: string;\n datasourceCredentials: string;\n defaultLogLevel: string;\n disableLogMasking: boolean;\n includeTools: Array<ToolName>;\n excludeTools: Array<ToolName>;\n maxResultLimit: number | null;\n disableQueryDatasourceValidationRequests: boolean;\n disableMetadataApiRequests: boolean;\n disableSessionManagement: boolean;\n enableServerLogging: boolean;\n serverLogDirectory: string;\n boundedContext: BoundedContext;\n tableauServerVersionCheckIntervalInHours: number;\n oauth: {\n enabled: boolean;\n issuer: string;\n redirectUri: string;\n jwePrivateKey: string;\n jwePrivateKeyPath: string;\n jwePrivateKeyPassphrase: string | undefined;\n authzCodeTimeoutMs: number;\n accessTokenTimeoutMs: number;\n refreshTokenTimeoutMs: number;\n clientIdSecretPairs: Record<string, string> | null;\n dnsServers: string[];\n };\n\n constructor() {\n const cleansedVars = removeClaudeMcpBundleUserConfigTemplates(process.env);\n const {\n AUTH: auth,\n SERVER: server,\n SITE_NAME: siteName,\n TRANSPORT: transport,\n SSL_KEY: sslKey,\n SSL_CERT: sslCert,\n HTTP_PORT_ENV_VAR_NAME: httpPortEnvVarName,\n CORS_ORIGIN_CONFIG: corsOriginConfig,\n TRUST_PROXY_CONFIG: trustProxyConfig,\n PAT_NAME: patName,\n PAT_VALUE: patValue,\n JWT_SUB_CLAIM: jwtSubClaim,\n CONNECTED_APP_CLIENT_ID: clientId,\n CONNECTED_APP_SECRET_ID: secretId,\n CONNECTED_APP_SECRET_VALUE: secretValue,\n JWT_ADDITIONAL_PAYLOAD: jwtAdditionalPayload,\n DATASOURCE_CREDENTIALS: datasourceCredentials,\n DEFAULT_LOG_LEVEL: defaultLogLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n INCLUDE_TOOLS: includeTools,\n EXCLUDE_TOOLS: excludeTools,\n MAX_RESULT_LIMIT: maxResultLimit,\n DISABLE_QUERY_DATASOURCE_VALIDATION_REQUESTS: disableQueryDatasourceValidationRequests,\n DISABLE_METADATA_API_REQUESTS: disableMetadataApiRequests,\n DISABLE_SESSION_MANAGEMENT: disableSessionManagement,\n ENABLE_SERVER_LOGGING: enableServerLogging,\n SERVER_LOG_DIRECTORY: serverLogDirectory,\n INCLUDE_PROJECT_IDS: includeProjectIds,\n INCLUDE_DATASOURCE_IDS: includeDatasourceIds,\n INCLUDE_WORKBOOK_IDS: includeWorkbookIds,\n TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS: tableauServerVersionCheckIntervalInHours,\n DANGEROUSLY_DISABLE_OAUTH: disableOauth,\n OAUTH_ISSUER: oauthIssuer,\n OAUTH_JWE_PRIVATE_KEY: oauthJwePrivateKey,\n OAUTH_JWE_PRIVATE_KEY_PATH: oauthJwePrivateKeyPath,\n OAUTH_JWE_PRIVATE_KEY_PASSPHRASE: oauthJwePrivateKeyPassphrase,\n OAUTH_REDIRECT_URI: redirectUri,\n OAUTH_CLIENT_ID_SECRET_PAIRS: oauthClientIdSecretPairs,\n OAUTH_CIMD_DNS_SERVERS: dnsServers,\n OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS: authzCodeTimeoutMs,\n OAUTH_ACCESS_TOKEN_TIMEOUT_MS: accessTokenTimeoutMs,\n OAUTH_REFRESH_TOKEN_TIMEOUT_MS: refreshTokenTimeoutMs,\n } = cleansedVars;\n\n this.siteName = siteName ?? '';\n\n this.sslKey = sslKey?.trim() ?? '';\n this.sslCert = sslCert?.trim() ?? '';\n this.httpPort = parseNumber(cleansedVars[httpPortEnvVarName?.trim() || 'PORT'], {\n defaultValue: 3927,\n minValue: 1,\n maxValue: 65535,\n });\n this.corsOriginConfig = getCorsOriginConfig(corsOriginConfig?.trim() ?? '');\n this.trustProxyConfig = getTrustProxyConfig(trustProxyConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultLogLevel = defaultLogLevel ?? 'debug';\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableQueryDatasourceValidationRequests =\n disableQueryDatasourceValidationRequests === 'true';\n this.disableMetadataApiRequests = disableMetadataApiRequests === 'true';\n this.disableSessionManagement = disableSessionManagement === 'true';\n this.enableServerLogging = enableServerLogging === 'true';\n this.serverLogDirectory = serverLogDirectory || join(__dirname, 'logs');\n this.boundedContext = {\n projectIds: createSetFromCommaSeparatedString(includeProjectIds),\n datasourceIds: createSetFromCommaSeparatedString(includeDatasourceIds),\n workbookIds: createSetFromCommaSeparatedString(includeWorkbookIds),\n };\n\n if (this.boundedContext.projectIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_PROJECT_IDS must have at least one value',\n );\n }\n\n if (this.boundedContext.datasourceIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_DATASOURCE_IDS must have at least one value',\n );\n }\n\n if (this.boundedContext.workbookIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_WORKBOOK_IDS must have at least one value',\n );\n }\n\n this.tableauServerVersionCheckIntervalInHours = parseNumber(\n tableauServerVersionCheckIntervalInHours,\n {\n defaultValue: 1,\n minValue: 1,\n maxValue: 24 * 7, // 7 days\n },\n );\n\n const disableOauthOverride = disableOauth === 'true';\n this.oauth = {\n enabled: disableOauthOverride ? false : !!oauthIssuer,\n issuer: oauthIssuer ?? '',\n redirectUri: redirectUri || (oauthIssuer ? `${oauthIssuer}/Callback` : ''),\n jwePrivateKey: oauthJwePrivateKey ?? '',\n jwePrivateKeyPath: oauthJwePrivateKeyPath ?? '',\n jwePrivateKeyPassphrase: oauthJwePrivateKeyPassphrase || undefined,\n dnsServers: dnsServers\n ? dnsServers.split(',').map((ip) => ip.trim())\n : ['1.1.1.1', '1.0.0.1' /* Cloudflare public DNS */],\n authzCodeTimeoutMs: parseNumber(authzCodeTimeoutMs, {\n defaultValue: TEN_MINUTES_IN_MS,\n minValue: 0,\n maxValue: ONE_HOUR_IN_MS,\n }),\n accessTokenTimeoutMs: parseNumber(accessTokenTimeoutMs, {\n defaultValue: ONE_HOUR_IN_MS,\n minValue: 0,\n maxValue: THIRTY_DAYS_IN_MS,\n }),\n refreshTokenTimeoutMs: parseNumber(refreshTokenTimeoutMs, {\n defaultValue: THIRTY_DAYS_IN_MS,\n minValue: 0,\n maxValue: ONE_YEAR_IN_MS,\n }),\n clientIdSecretPairs: oauthClientIdSecretPairs\n ? oauthClientIdSecretPairs.split(',').reduce<Record<string, string>>((acc, curr) => {\n const [clientId, secret] = curr.split(':');\n if (clientId && secret) {\n acc[clientId] = secret;\n }\n return acc;\n }, {})\n : null,\n };\n\n this.auth = isAuthType(auth) ? auth : this.oauth.enabled ? 'oauth' : 'pat';\n this.transport = isTransport(transport) ? transport : this.oauth.enabled ? 'http' : 'stdio';\n\n if (this.transport === 'http' && !disableOauthOverride && !this.oauth.issuer) {\n throw new Error(\n 'OAUTH_ISSUER must be set when TRANSPORT is \"http\" unless DANGEROUSLY_DISABLE_OAUTH is \"true\"',\n );\n }\n\n if (this.auth === 'oauth') {\n if (disableOauthOverride) {\n throw new Error('When AUTH is \"oauth\", DANGEROUSLY_DISABLE_OAUTH cannot be \"true\"');\n }\n\n if (!this.oauth.issuer) {\n throw new Error('When AUTH is \"oauth\", OAUTH_ISSUER must be set');\n }\n } else {\n invariant(server, 'The environment variable SERVER is not set');\n validateServer(server);\n }\n\n if (this.oauth.enabled) {\n invariant(this.oauth.redirectUri, 'The environment variable OAUTH_REDIRECT_URI is not set');\n\n if (!this.oauth.jwePrivateKey && !this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set',\n );\n }\n\n if (this.oauth.jwePrivateKey && this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set',\n );\n }\n\n if (\n this.oauth.jwePrivateKeyPath &&\n process.env.TABLEAU_MCP_TEST !== 'true' &&\n !existsSync(this.oauth.jwePrivateKeyPath)\n ) {\n throw new Error(\n `OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`,\n );\n }\n\n if (this.transport === 'stdio') {\n throw new Error('TRANSPORT must be \"http\" when OAUTH_ISSUER is set');\n }\n }\n\n const maxResultLimitNumber = maxResultLimit ? parseInt(maxResultLimit) : NaN;\n this.maxResultLimit =\n isNaN(maxResultLimitNumber) || maxResultLimitNumber <= 0 ? null : maxResultLimitNumber;\n\n this.includeTools = includeTools\n ? includeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n this.excludeTools = excludeTools\n ? excludeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n if (this.includeTools.length > 0 && this.excludeTools.length > 0) {\n throw new Error('Cannot include and exclude tools simultaneously');\n }\n\n if (this.auth === 'pat') {\n invariant(patName, 'The environment variable PAT_NAME is not set');\n invariant(patValue, 'The environment variable PAT_VALUE is not set');\n } else if (this.auth === 'direct-trust') {\n invariant(jwtSubClaim, 'The environment variable JWT_SUB_CLAIM is not set');\n invariant(clientId, 'The environment variable CONNECTED_APP_CLIENT_ID is not set');\n invariant(secretId, 'The environment variable CONNECTED_APP_SECRET_ID is not set');\n invariant(secretValue, 'The environment variable CONNECTED_APP_SECRET_VALUE is not set');\n }\n\n this.server = server ?? '';\n this.patName = patName ?? '';\n this.patValue = patValue ?? '';\n this.jwtSubClaim = jwtSubClaim ?? '';\n this.connectedAppClientId = clientId ?? '';\n this.connectedAppSecretId = secretId ?? '';\n this.connectedAppSecretValue = secretValue ?? '';\n this.jwtAdditionalPayload = jwtAdditionalPayload || '{}';\n }\n}\n\nfunction validateServer(server: string): void {\n if (!server.startsWith('https://')) {\n throw new Error(`The environment variable SERVER must start with \"https://\": ${server}`);\n }\n\n try {\n const _ = new URL(server);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `The environment variable SERVER is not a valid URL: ${server} -- ${errorMessage}`,\n );\n }\n}\n\nfunction getCorsOriginConfig(corsOriginConfig: string): CorsOptions['origin'] {\n if (!corsOriginConfig) {\n return true;\n }\n\n if (corsOriginConfig.match(/^true|false$/i)) {\n return corsOriginConfig.toLowerCase() === 'true';\n }\n\n if (corsOriginConfig === '*') {\n return '*';\n }\n\n if (corsOriginConfig.startsWith('[') && corsOriginConfig.endsWith(']')) {\n try {\n const origins = JSON.parse(corsOriginConfig) as Array<string>;\n return origins.map((origin) => new URL(origin).origin);\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${corsOriginConfig}`,\n );\n }\n }\n\n try {\n return new URL(corsOriginConfig).origin;\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${corsOriginConfig}`,\n );\n }\n}\n\nfunction getTrustProxyConfig(trustProxyConfig: string): boolean | number | string | null {\n if (!trustProxyConfig) {\n return null;\n }\n\n if (trustProxyConfig.match(/^true|false$/i)) {\n return trustProxyConfig.toLowerCase() === 'true';\n }\n\n if (trustProxyConfig.match(/^\\d+$/)) {\n return parseInt(trustProxyConfig, 10);\n }\n\n return trustProxyConfig;\n}\n\n// Creates a set from a comma-separated string of values.\n// Returns null if the value is undefined.\nfunction createSetFromCommaSeparatedString(value: string | undefined): Set<string> | null {\n if (value === undefined) {\n return null;\n }\n\n return new Set(\n value\n .trim()\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean),\n );\n}\n\n// When the user does not provide a site name in the Claude MCP Bundle configuration,\n// Claude doesn't replace its value and sets the site name to \"${user_config.site_name}\".\nfunction removeClaudeMcpBundleUserConfigTemplates(\n envVars: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n return Object.entries(envVars).reduce<Record<string, string | undefined>>((acc, [key, value]) => {\n if (value?.startsWith('${user_config.')) {\n acc[key] = '';\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\nfunction parseNumber(\n value: string | undefined,\n {\n defaultValue,\n minValue,\n maxValue,\n }: { defaultValue: number; minValue?: number; maxValue?: number } = {\n defaultValue: 0,\n minValue: Number.NEGATIVE_INFINITY,\n maxValue: Number.POSITIVE_INFINITY,\n },\n): number {\n if (!value) {\n return defaultValue;\n }\n\n const number = parseFloat(value);\n return isNaN(number) ||\n (minValue !== undefined && number < minValue) ||\n (maxValue !== undefined && number > maxValue)\n ? defaultValue\n : number;\n}\n\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n parseNumber,\n};\n", "export const toolNames = [\n 'list-datasources',\n 'list-workbooks',\n 'list-views',\n 'query-datasource',\n 'get-datasource-metadata',\n 'get-workbook',\n 'get-view-data',\n 'get-view-image',\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n 'search-content',\n] as const;\nexport type ToolName = (typeof toolNames)[number];\n\nexport const toolGroupNames = [\n 'datasource',\n 'workbook',\n 'view',\n 'pulse',\n 'content-exploration',\n] as const;\nexport type ToolGroupName = (typeof toolGroupNames)[number];\n\nexport const toolGroups = {\n datasource: ['list-datasources', 'get-datasource-metadata', 'query-datasource'],\n workbook: ['list-workbooks', 'get-workbook'],\n view: ['list-views', 'get-view-data', 'get-view-image'],\n pulse: [\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n ],\n 'content-exploration': ['search-content'],\n} as const satisfies Record<ToolGroupName, Array<ToolName>>;\n\nexport function isToolName(value: unknown): value is ToolName {\n return !!toolNames.find((name) => name === value);\n}\n\nexport function isToolGroupName(value: unknown): value is ToolGroupName {\n return !!toolGroupNames.find((name) => name === value);\n}\n", "const transports = ['stdio', 'http'] as const;\nexport type TransportName = (typeof transports)[number];\nexport function isTransport(transport: unknown): transport is TransportName {\n return !!transports.find((t) => t === transport);\n}\n", "export default function invariant(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ? message : 'Invariant Violation');\n }\n}\n", "import { LoggingLevel, RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Server } from '../server.js';\nimport { ToolName } from '../tools/toolName.js';\nimport { ServerLogger } from './serverLogger.js';\ntype Logger = 'rest-api' | (string & {});\ntype LogType = LoggingLevel | 'request' | 'response' | 'tool';\ntype LogMessage = {\n type: LogType;\n [key: string]: any;\n};\n\nexport const loggingLevels = [\n 'debug',\n 'info',\n 'notice',\n 'warning',\n 'error',\n 'critical',\n 'alert',\n 'emergency',\n] as const;\n\nlet currentLogLevel: LoggingLevel = 'debug';\nlet serverLogger: ServerLogger | undefined;\n\nexport function isLoggingLevel(level: unknown): level is LoggingLevel {\n return !!loggingLevels.find((l) => l === level);\n}\n\nexport const setLogLevel = (\n server: Server,\n level: LoggingLevel,\n { silent = false }: { silent?: boolean } = {},\n): void => {\n if (currentLogLevel === level) {\n return;\n }\n\n currentLogLevel = level;\n\n if (!silent) {\n log.notice(server, `Logging level set to: ${level}`);\n }\n};\n\nexport const setServerLogger = (logger: ServerLogger): void => {\n serverLogger = logger;\n};\n\ntype LogMethodOptions = Partial<{ logger: Logger; requestId: RequestId }>;\n\nexport const log = {\n debug: getSendLoggingMessageFn('debug'),\n info: getSendLoggingMessageFn('info'),\n notice: getSendLoggingMessageFn('notice'),\n warning: getSendLoggingMessageFn('warning'),\n error: getSendLoggingMessageFn('error'),\n critical: getSendLoggingMessageFn('critical'),\n alert: getSendLoggingMessageFn('alert'),\n emergency: getSendLoggingMessageFn('emergency'),\n} satisfies {\n [level in LoggingLevel]: (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions,\n ) => Promise<void>;\n};\n\nexport const shouldLogWhenLevelIsAtLeast = (level = currentLogLevel): boolean => {\n return loggingLevels.indexOf(level) >= loggingLevels.indexOf(currentLogLevel);\n};\n\nexport const writeToStderr = (message: string): void => {\n if (process.env.TABLEAU_MCP_TEST === 'true') {\n // Silence logging when running in test mode\n return;\n }\n\n message = message.endsWith('\\n') ? message : `${message}\\n`;\n process.stderr.write(message);\n};\n\nexport const getToolLogMessage = ({\n requestId,\n toolName,\n args,\n username,\n}: {\n requestId: RequestId;\n toolName: ToolName;\n args: unknown;\n username?: string;\n}): LogMessage => {\n return {\n type: 'tool',\n requestId,\n ...(username ? { username } : {}),\n tool: {\n name: toolName,\n ...(args !== undefined ? { args } : {}),\n },\n };\n};\n\nfunction getSendLoggingMessageFn(level: LoggingLevel) {\n return async (\n server: Server,\n message: string | LogMessage,\n { logger, requestId }: LogMethodOptions = {\n logger: server.name,\n },\n ) => {\n serverLogger?.log({ message, level, logger });\n\n if (!shouldLogWhenLevelIsAtLeast(level)) {\n return;\n }\n\n // server.sendNotification doesn't provide a way to provide the relatedRequestId\n // so we're using server.notification directly.\n return server.server.notification(\n {\n method: 'notifications/message',\n params: {\n level,\n logger,\n data: JSON.stringify(\n {\n timestamp: new Date().toISOString(),\n currentLogLevel,\n message,\n },\n null,\n 2,\n ),\n },\n },\n {\n relatedRequestId: requestId,\n },\n );\n };\n}\n", "import { appendFile } from 'node:fs/promises';\n\nimport { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { writeToStderr } from './log.js';\n\nexport class ServerLogger {\n private readonly _logDirectory: string;\n private readonly _fileMutexes = new Map<string, Promise<void>>();\n\n constructor({ logDirectory }: { logDirectory: string }) {\n this._logDirectory = logDirectory;\n\n if (!existsSync(this._logDirectory)) {\n mkdirSync(this._logDirectory, { recursive: true });\n }\n }\n\n async log(obj: Record<string, unknown>): Promise<void> {\n // Create a new log file each hour e.g. 2025-10-15T21-00-00-000Z.log\n const timestamp = new Date().toISOString();\n const filename = `${new Date(new Date().setMinutes(0, 0, 0)).toISOString().replace(/[:.]/g, '-')}.log`;\n const logFilePath = join(this._logDirectory, filename);\n\n // Get or create a mutex for this specific log file\n const mutexKey = logFilePath;\n const currentMutex = this._fileMutexes.get(mutexKey) ?? Promise.resolve();\n\n // Chain the file write operation after the current mutex\n const newMutex = currentMutex.then(async () => {\n try {\n // appendFile will create the file if it doesn't exist\n await appendFile(logFilePath, JSON.stringify({ timestamp, ...obj }) + '\\n');\n } catch (error) {\n writeToStderr(`Failed to write to log file ${logFilePath}: ${getExceptionMessage(error)}`);\n }\n });\n\n this._fileMutexes.set(mutexKey, newMutex);\n\n // Clean up completed mutexes to prevent memory leaks\n newMutex.finally(() => {\n if (this._fileMutexes.get(mutexKey) === newMutex) {\n this._fileMutexes.delete(mutexKey);\n }\n });\n\n // Wait for the file write operation to complete\n await newMutex;\n }\n}\n", "export function getExceptionMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error) ?? 'undefined';\n } catch {\n return `${error}`;\n }\n}\n", "import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { InitializeRequest, SetLevelRequestSchema } from '@modelcontextprotocol/sdk/types.js';\n\nimport pkg from '../package.json' with { type: 'json' };\nimport { getConfig } from './config.js';\nimport { setLogLevel } from './logging/log.js';\nimport { TableauAuthInfo } from './server/oauth/schemas.js';\nimport { Tool } from './tools/tool.js';\nimport { toolNames } from './tools/toolName.js';\nimport { toolFactories } from './tools/tools.js';\nimport { Provider } from './utils/provider.js';\n\nexport const serverName = 'tableau-mcp';\nexport const serverVersion = pkg.version;\nexport const userAgent = `${serverName}/${serverVersion}`;\n\nexport type ClientInfo = InitializeRequest['params']['clientInfo'];\n\nexport class Server extends McpServer {\n readonly name: string;\n readonly version: string;\n\n // Note that the McpServer class does expose a (poorly named) \"getClientVersion()\" method that returns the client info,\n // but the value of the field it returns is only set during the initialization lifecycle request.\n //\n // With HTTP transport, we create a new instance of the Server class for *each* request, so we store the client info\n // provided by the client in its initialization lifecycle request in the session store,\n // and pass it to the constructor with each post-initialization request.\n //\n // With stdio transport, we can use the getClientVersion() method to get the client info.\n private readonly _clientInfo: ClientInfo | undefined;\n\n get clientInfo(): ClientInfo | undefined {\n return this._clientInfo ?? this.server.getClientVersion();\n }\n\n constructor({ clientInfo }: { clientInfo?: ClientInfo } = {}) {\n super(\n {\n name: serverName,\n version: serverVersion,\n },\n {\n capabilities: {\n logging: {},\n tools: {},\n },\n },\n );\n\n this.name = serverName;\n this.version = serverVersion;\n this._clientInfo = clientInfo;\n }\n\n registerTools = async (authInfo?: TableauAuthInfo): Promise<void> => {\n for (const {\n name,\n description,\n paramsSchema,\n annotations,\n callback,\n } of this._getToolsToRegister(authInfo)) {\n this.tool(\n name,\n await Provider.from(description),\n await Provider.from(paramsSchema),\n await Provider.from(annotations),\n await Provider.from(callback),\n );\n }\n };\n\n registerRequestHandlers = (): void => {\n this.server.setRequestHandler(SetLevelRequestSchema, async (request) => {\n setLogLevel(this, request.params.level);\n return {};\n });\n };\n\n private _getToolsToRegister = (authInfo?: TableauAuthInfo): Array<Tool<any>> => {\n const { includeTools, excludeTools } = getConfig();\n\n const tools = toolFactories.map((toolFactory) => toolFactory(this, authInfo));\n const toolsToRegister = tools.filter((tool) => {\n if (includeTools.length > 0) {\n return includeTools.includes(tool.name);\n }\n\n if (excludeTools.length > 0) {\n return !excludeTools.includes(tool.name);\n }\n\n return true;\n });\n\n if (toolsToRegister.length === 0) {\n throw new Error(`\n No tools to register.\n Tools available = [${toolNames.join(', ')}].\n EXCLUDE_TOOLS = [${excludeTools.join(', ')}].\n INCLUDE_TOOLS = [${includeTools.join(', ')}]\n `);\n }\n\n return toolsToRegister;\n };\n}\n\nexport const exportedForTesting = {\n Server,\n};\n", "{\n \"name\": \"@tableau/mcp-server\",\n \"description\": \"An MCP server for Tableau, providing a suite of tools that will make it easier for developers to build AI applications that integrate with Tableau.\",\n \"version\": \"1.13.1\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/tableau/tableau-mcp.git\"\n },\n \"homepage\": \"https://github.com/tableau/tableau-mcp\",\n \"bugs\": \"https://github.com/tableau/tableau-mcp/issues\",\n \"author\": \"Tableau\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"keywords\": [\n \"tableau\",\n \"mcp\"\n ],\n \"bin\": {\n \"tableau-mcp-server\": \"./build/index.js\"\n },\n \"scripts\": {\n \":build\": \"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --minify --outdir=build --sourcemap\",\n \":build:dev\": \"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --outdir=build --sourcemap\",\n \"build\": \"run-s :build exec-perms\",\n \"build:dev\": \"run-s :build:dev exec-perms\",\n \"build:watch\": \"npm run :build:dev -- --watch\",\n \"build:docker\": \"docker build -t tableau-mcp .\",\n \":build:mcpb\": \"npx -y @anthropic-ai/mcpb pack . tableau-mcp.mcpb\",\n \"build:mcpb\": \"run-s build:manifest:script build:manifest :build:mcpb\",\n \"build:manifest\": \"node build/scripts/createClaudeMcpBundleManifest.mjs\",\n \"build:manifest:script\": \"esbuild src/scripts/createClaudeMcpBundleManifest.ts --bundle --platform=node --format=esm --outdir=build/scripts --sourcemap=inline --out-extension:.js=.mjs\",\n \"start:http\": \"node build/index.js\",\n \"start:http:docker\": \"docker run -p 3927:3927 -i --rm --env-file env.list tableau-mcp\",\n \"lint\": \"npm exec eslint\",\n \"inspect\": \"npx @modelcontextprotocol/inspector --config config.json --server tableau\",\n \":inspect:http\": \"npx @modelcontextprotocol/inspector --config config.http.json --server tableau\",\n \"inspect:http\": \"run-p start:http :inspect:http\",\n \"inspect:docker\": \"npx @modelcontextprotocol/inspector --config config.docker.json --server tableau\",\n \"inspect:docker:http\": \"run-p start:http:docker :inspect:http\",\n \"build:inspect\": \"run-s build inspect\",\n \"build:inspect:docker\": \"run-s build:docker inspect:docker\",\n \"build:inspect:docker:http\": \"run-s build:docker inspect:docker:http\",\n \"exec-perms\": \"shx chmod +x build/*.js\",\n \"test\": \"vitest --config ./vitest.config.ts\",\n \"test:e2e\": \"vitest --config ./vitest.config.e2e.ts\",\n \"test:eval\": \"vitest --config ./vitest.config.eval.ts\",\n \"test:oauth\": \"vitest --config ./vitest.config.oauth.ts\",\n \"coverage\": \"vitest run --config ./vitest.config.ts --coverage\",\n \"version:major\": \"npm version major --no-git-tag-version\",\n \"version:minor\": \"npm version minor --no-git-tag-version\",\n \"version:patch\": \"npm version patch --no-git-tag-version\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.12.1\",\n \"@zodios/core\": \"^10.9.6\",\n \"axios-retry\": \"^4.5.0\",\n \"cors\": \"^2.8.5\",\n \"dotenv\": \"^16.5.0\",\n \"express\": \"^5.1.0\",\n \"fast-levenshtein\": \"^3.0.0\",\n \"jose\": \"^6.0.12\",\n \"ssrfcheck\": \"^1.2.0\",\n \"ts-results-es\": \"^5.0.1\",\n \"zod\": \"^3.24.3\",\n \"zod-validation-error\": \"^4.0.1\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/mcpb\": \"^1.0.0\",\n \"@eslint/eslintrc\": \"^3.3.1\",\n \"@eslint/js\": \"^9.25.1\",\n \"@modelcontextprotocol/inspector\": \"^0.16.6\",\n \"@openai/agents\": \"^0.1.9\",\n \"@types/cors\": \"^2.8.19\",\n \"@types/eslint__js\": \"^8.42.3\",\n \"@types/express\": \"^5.0.3\",\n \"@types/fast-levenshtein\": \"^0.0.1\",\n \"@types/node\": \"^22.15.3\",\n \"@types/supertest\": \"^6.0.3\",\n \"@typescript-eslint/eslint-plugin\": \"^8.31.1\",\n \"@typescript-eslint/parser\": \"^8.31.1\",\n \"@vitest/coverage-v8\": \"^3.1.3\",\n \"esbuild\": \"^0.25.5\",\n \"eslint\": \"^9.25.1\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"eslint-plugin-prettier\": \"^5.2.6\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"npm-run-all\": \"^4.1.5\",\n \"openai\": \"^5.23.2\",\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"shx\": \"^0.4.0\",\n \"supertest\": \"^7.1.4\",\n \"typescript\": \"^5.8.3\",\n \"typescript-eslint\": \"^8.31.1\",\n \"vitest\": \"^3.1.3\"\n },\n \"engines\": {\n \"node\": \">=22.7.5\"\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n orderBySchema,\n searchContentFilterSchema,\n} from '../../sdks/tableau/types/contentExploration.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../tool.js';\nimport {\n buildFilterString,\n buildOrderByString,\n constrainSearchContent,\n ReducedSearchContentResponse,\n reduceSearchContentResponse,\n} from './searchContentUtils.js';\n\nconst paramsSchema = {\n terms: z.string().trim().nonempty().optional(),\n limit: z.number().int().min(1).max(2000).default(100).optional(),\n orderBy: orderBySchema.optional(),\n filter: searchContentFilterSchema.optional(),\n};\n\nexport const getSearchContentTool = (server: Server): Tool<typeof paramsSchema> => {\n const searchContentTool = new Tool({\n server,\n name: 'search-content',\n description: `\nThis tool searches across all supported content types for objects relevant to the search expression specified by search terms and filters.\n\n**Parameters:**\n\n- \\`terms\\` (optional): A string containing one or more search terms that the search uses as the basis for determining which items are relevant to return. If the terms parameter is not provided, it searches for everything bound by the specified filters.\n\n- \\`filter\\` (optional): Allows you to limit search results based on:\n - \\`contentTypes\\`: Filter by content types. Supported types are: 'lens', 'datasource', 'virtualconnection', 'collection', 'project', 'flow', 'datarole', 'table', 'database', 'view', 'workbook'\n - \\`ownerIds\\`: Filter by specific owner IDs (array of integers)\n - \\`modifiedTime\\`: Filter by last modified times using ISO 8601 date-time strings. Can be either a range (with startDate/endDate) or an array of specific date-times to include\n\n- \\`limit\\` (optional): The number of items to return in the search response (default: 100, max: 2000)\n\n- \\`orderBy\\` (optional): Determines the sorting method for returned items. Available sorting methods:\n - \\`hitsTotal\\`: Number of times a content item has been viewed since it was created\n - \\`hitsSmallSpanTotal\\`: Number of times a content item was viewed in the last month\n - \\`hitsMediumSpanTotal\\`: Number of times a content item was viewed in the last 3 months\n - \\`hitsLargeSpanTotal\\`: Number of times a content item was viewed in the last year\n - \\`downstreamWorkbookCount\\`: Number of workbooks in a given project. This value is only available when the content type filter includes 'database' or 'table'\n \n For each sort method, you can specify a sort direction: 'asc' for ascending or 'desc' for descending (default: 'asc'). The orderBy parameter is an array of objects containing the sorting method and direction. The first element determines primary sorting, with subsequent elements used as tiebreakers.\n\n**Important Notes:**\n- If \\`orderBy\\` is omitted, the search will sort items by their \"relevance score\" in descending order, which is Tableau's internal algorithm for providing the most relevant results`,\n paramsSchema,\n annotations: {\n title: 'Search Content',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { terms, limit, orderBy, filter },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const orderByString = orderBy ? buildOrderByString(orderBy) : undefined;\n const filterString = filter ? buildFilterString(filter) : undefined;\n return await searchContentTool.logAndExecute<Array<ReducedSearchContentResponse>>({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const response = await restApi.contentExplorationMethods.searchContent({\n terms,\n page: 0,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? 100)\n : (limit ?? 100),\n orderBy: orderByString,\n filter: filterString,\n });\n return reduceSearchContentResponse(response);\n },\n }),\n );\n },\n constrainSuccessResult: (items) =>\n constrainSearchContent({ items, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return searchContentTool;\n};\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport {\n RequestInterceptorConfig,\n ResponseInterceptorConfig,\n} from '../sdks/tableau/interceptors.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { shouldLogWhenLevelIsAtLeast, writeToStderr } from './log.js';\n\ntype MaskedKeys = 'data' | 'headers';\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;\ntype MaskedRequest = Optional<RequestInterceptorConfig, MaskedKeys>;\ntype MaskedResponse = Optional<ResponseInterceptorConfig, MaskedKeys>;\n\nexport const maskRequest = (config: RequestInterceptorConfig): MaskedRequest => {\n const result = clone<MaskedRequest>(config);\n if (result.isErr()) {\n return config;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n\n if (Array.isArray(maskedData?.data?.datasource?.connections)) {\n const connections = maskedData.data.datasource.connections as Array<{\n connectionLuid: string;\n connectionUsername: string;\n connectionPassword: string;\n }>;\n\n connections.forEach((connection) => {\n connection.connectionUsername = '<redacted>';\n connection.connectionPassword = '<redacted>';\n });\n }\n\n if (maskedData.headers?.['X-Tableau-Auth']) {\n maskedData.headers['X-Tableau-Auth'] = '<redacted>';\n }\n\n if (maskedData.params?.['user_id']) {\n maskedData.params['user_id'] = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n delete maskedData.params;\n }\n\n return maskedData;\n};\n\nexport const maskResponse = (response: ResponseInterceptorConfig): MaskedResponse => {\n const result = clone<MaskedResponse>(response);\n if (result.isErr()) {\n return response;\n }\n\n const maskedData = result.value;\n if (shouldLogWhenLevelIsAtLeast('debug')) {\n if (maskedData.data?.credentials) {\n maskedData.data.credentials = '<redacted>';\n }\n } else {\n delete maskedData.data;\n delete maskedData.headers;\n }\n\n return maskedData;\n};\n\nfunction clone<T>(obj: T): Result<T, Error> {\n try {\n return Ok(structuredClone(obj));\n } catch (error) {\n if (error instanceof Error) {\n return Err(error);\n }\n\n const message = getExceptionMessage(error);\n writeToStderr(`Could not clone object, notification may not be sanitized! Error: ${message}`);\n return Err(new Error(message));\n }\n}\n", "import { ZodiosClass } from '@zodios/core';\n\nexport type RequestInterceptor = (config: RequestInterceptorConfig) => void;\nexport type ResponseInterceptor = (response: ResponseInterceptorConfig) => void;\nexport type ErrorInterceptor = (error: unknown, baseUrl: string) => void;\n\nexport type AxiosInterceptor = ZodiosClass<any>['axios']['interceptors'];\nexport type AxiosRequestInterceptor = Parameters<AxiosInterceptor['request']['use']>[0];\nexport type AxiosRequestInterceptorConfig = Parameters<NonNullable<AxiosRequestInterceptor>>[0];\nexport type RequestInterceptorConfig = {\n baseUrl: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosRequestInterceptorConfig, 'headers'>;\n\nexport type AxiosResponseInterceptor = Parameters<AxiosInterceptor['response']['use']>[0];\nexport type AxiosResponseInterceptorConfig = Parameters<NonNullable<AxiosResponseInterceptor>>[0];\nexport type ResponseInterceptorConfig = {\n baseUrl: string;\n url: string;\n headers: Record<string, any>;\n // AxiosHeaders is a complex class, overwrite it for simplicity.\n} & Omit<AxiosResponseInterceptorConfig, 'headers' | 'statusText' | 'config'>;\n\nexport function getRequestInterceptorConfig(\n config: AxiosRequestInterceptorConfig,\n): Omit<RequestInterceptorConfig, 'baseUrl'> {\n return {\n method: config.method ?? 'UNKNOWN METHOD',\n url: config.url ?? 'UNKNOWN URL',\n headers: config.headers,\n data: config.data,\n params: config.params,\n };\n}\n\nexport function getResponseInterceptorConfig(\n response: AxiosResponseInterceptorConfig,\n): Omit<ResponseInterceptorConfig, 'baseUrl'> {\n return {\n url: response.config.url ?? 'UNKNOWN URL',\n status: response.status,\n headers: response.headers,\n data: response.data,\n };\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { getJwt } from '../../../utils/getJwt.js';\nimport { authenticationApis } from '../apis/authenticationApi.js';\nimport { AuthConfig } from '../authConfig.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\nimport Methods from './methods.js';\n\n/**\n * Authentication methods of the Tableau Server REST API\n *\n * @export\n * @class AuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport class AuthenticationMethods extends Methods<typeof authenticationApis> {\n constructor(baseUrl: string) {\n super(new Zodios(baseUrl, authenticationApis));\n }\n\n /**\n * Signs you in as a user on the specified site on Tableau Server or Tableau Cloud.\n *\n * @param {AuthConfig} authConfig - The authentication configuration\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_in\n */\n signIn = async (authConfig: AuthConfig): Promise<Credentials> => {\n return (\n await this._apiClient.signIn({\n credentials: {\n site: {\n contentUrl: authConfig.siteName,\n },\n ...(await (async () => {\n switch (authConfig.type) {\n case 'pat':\n return {\n personalAccessTokenName: authConfig.patName,\n personalAccessTokenSecret: authConfig.patValue,\n };\n case 'direct-trust':\n return {\n jwt: await getJwt({\n username: authConfig.username,\n connectedApp: {\n clientId: authConfig.clientId,\n secretId: authConfig.secretId,\n secretValue: authConfig.secretValue,\n },\n scopes: authConfig.scopes,\n additionalPayload: authConfig.additionalPayload,\n }),\n };\n }\n })()),\n },\n })\n ).credentials;\n };\n}\n\n/**\n * Authentication methods of the Tableau Server REST API that assume the user is already authenticated\n *\n * @export\n * @class AuthenticatedAuthenticationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm\n */\nexport class AuthenticatedAuthenticationMethods extends AuthenticatedMethods<\n typeof authenticationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, authenticationApis), creds);\n }\n\n /**\n * Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.\n *\n * Required scopes: none\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_authentication.htm#sign_out\n */\n signOut = async (): Promise<void> => {\n await this._apiClient.signOut(undefined, {\n ...this.authHeader,\n });\n };\n}\n", "import { randomUUID } from 'node:crypto';\n\nimport { JWTHeaderParameters, JWTPayload, SignJWT } from 'jose';\n\nexport async function getJwt({\n username,\n connectedApp,\n scopes,\n additionalPayload,\n}: {\n username: string;\n connectedApp: {\n clientId: string;\n secretId: string;\n secretValue: string;\n };\n scopes: Set<string>;\n additionalPayload?: Record<string, unknown>;\n}): Promise<string> {\n const header: JWTHeaderParameters = {\n alg: 'HS256',\n typ: 'JWT',\n kid: connectedApp.secretId,\n };\n\n const payload: JWTPayload = {\n jti: randomUUID(),\n iss: connectedApp.clientId,\n aud: 'tableau',\n sub: username,\n scp: [...scopes],\n iat: Math.floor(Date.now() / 1000) - 5,\n exp: Math.floor(Date.now() / 1000) + 5 * 60,\n ...additionalPayload,\n };\n\n const token = await new SignJWT(payload)\n .setProtectedHeader(header)\n .sign(new TextEncoder().encode(connectedApp.secretValue));\n\n return token;\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { credentialsSchema } from '../types/credentials.js';\n\nconst signInRequestSchema = z.object({\n credentials: z\n .object({\n site: z.object({\n contentUrl: z.string(),\n }),\n })\n .and(\n z\n .object({\n personalAccessTokenName: z.string(),\n personalAccessTokenSecret: z.string(),\n })\n .or(\n z.object({\n jwt: z.string(),\n }),\n ),\n ),\n});\n\nconst signInEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signin',\n alias: 'signIn',\n description: 'Signs in with Tableau credentials.',\n response: credentialsSchema,\n parameters: [\n {\n name: 'credentials',\n type: 'Body',\n schema: signInRequestSchema,\n },\n ],\n});\n\nconst signOutEndpoint = makeEndpoint({\n method: 'post',\n path: '/auth/signout',\n alias: 'signOut',\n description:\n 'Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.',\n response: z.void(),\n});\n\nconst authenticationApi = makeApi([signInEndpoint, signOutEndpoint]);\nexport const authenticationApis = [\n ...authenticationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const credentialsSchema = z.object({\n credentials: z.object({\n site: z.object({\n id: z.string(),\n }),\n user: z.object({\n id: z.string(),\n }),\n token: z.string(),\n }),\n});\n\nexport type Credentials = z.infer<typeof credentialsSchema>['credentials'];\n", "import { ZodiosClass, ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nexport default class Methods<T extends ZodiosEndpointDefinitions> {\n protected _apiClient: ZodiosInstance<T>;\n\n constructor(apiClient: ZodiosInstance<T>) {\n this._apiClient = apiClient;\n }\n\n get interceptors(): ZodiosClass<T>['axios']['interceptors'] {\n return this._apiClient.axios.interceptors;\n }\n}\n", "import { ZodiosEndpointDefinitions, ZodiosInstance } from '@zodios/core';\n\nimport { Credentials } from '../types/credentials.js';\nimport Methods from './methods.js';\n\ntype AuthHeaders = {\n headers: {\n 'X-Tableau-Auth': string;\n };\n};\n\n/**\n * Base abstract class for any methods classes that require authentication.\n *\n * @export\n * @abstract\n * @class AuthenticatedMethods\n */\nexport default abstract class AuthenticatedMethods<\n T extends ZodiosEndpointDefinitions,\n> extends Methods<T> {\n private _creds: Credentials;\n\n protected get authHeader(): AuthHeaders {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n\n return {\n headers: {\n 'X-Tableau-Auth': this._creds.token,\n },\n };\n }\n\n protected get userId(): string {\n if (!this._creds) {\n throw new Error('Authenticate by calling signIn() first');\n }\n return this._creds.user.id;\n }\n\n constructor(apiClient: ZodiosInstance<T>, creds: Credentials) {\n super(apiClient);\n this._creds = creds;\n }\n}\n", "import { Zodios } from '@zodios/core';\n\nimport { contentExplorationApis } from '../apis/contentExplorationApi.js';\nimport { SearchContentResponse } from '../types/contentExploration.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Content Exploration methods of the Tableau Server REST API\n *\n * @export\n * @class ContentExplorationMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm\n */\nexport default class ContentExplorationMethods extends AuthenticatedMethods<\n typeof contentExplorationApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, contentExplorationApis), creds);\n }\n\n /**\n * Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param terms - The search terms\n * @param page - The number of the page in the list reponse pages to return. Maximum number of items is 2000.\n * @param limit - The number of items to return on each page. The default is 10.\n * @param orderBy - The sorting method for items returned.\n * @param filter - An expression to filter the response\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_content_exploration.htm#ContentExplorationService_getSearch\n */\n searchContent = async (queries: {\n terms?: string;\n page?: number;\n limit?: number;\n orderBy?: string;\n filter?: string;\n }): Promise<SearchContentResponse> => {\n Object.entries(queries).forEach(([key, value]) => {\n if (value === undefined) {\n delete queries[key as keyof typeof queries];\n }\n });\n const response = await this._apiClient.searchContent({ queries, ...this.authHeader });\n return response.hits;\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { searchContentResponseSchema } from '../types/contentExploration.js';\n\nconst searchContentEndpoint = makeEndpoint({\n method: 'get',\n path: '/search',\n alias: 'searchContent',\n description:\n 'Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.',\n parameters: [\n {\n name: 'terms',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'page',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'limit',\n type: 'Query',\n schema: z.number().int().optional(),\n },\n {\n name: 'order_by',\n type: 'Query',\n schema: z.string().optional(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n },\n ],\n response: z.object({\n hits: searchContentResponseSchema,\n }),\n});\n\nconst contentExplorationApi = makeApi([searchContentEndpoint]);\n\nexport const contentExplorationApis = [\n ...contentExplorationApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst orderingMethods = z.enum([\n 'hitsTotal',\n 'hitsSmallSpanTotal',\n 'hitsMediumSpanTotal',\n 'hitsLargeSpanTotal',\n 'downstreamWorkbookCount',\n]);\n\nexport const orderBySchema = z\n .array(\n z.object({\n method: orderingMethods,\n sortDirection: z.enum(['asc', 'desc']).default('asc').optional(),\n }),\n )\n .nonempty();\n\nexport type OrderBy = z.infer<typeof orderBySchema>;\n\nconst contentTypes = z.enum([\n 'lens',\n 'datasource',\n 'virtualconnection',\n 'collection',\n 'project',\n 'flow',\n 'datarole',\n 'table',\n 'database',\n 'view',\n 'workbook',\n]);\n\nconst modifiedTimeSchema = z.union([\n z.array(z.string().datetime()).nonempty(),\n z\n .object({\n startDate: z.string().datetime(),\n endDate: z.string().datetime().optional(),\n })\n .strict(),\n z\n .object({\n startDate: z.string().datetime().optional(),\n endDate: z.string().datetime(),\n })\n .strict(),\n]);\n\nexport const searchContentFilterBase = z\n .object({\n contentTypes: z.array(contentTypes).nonempty(),\n ownerIds: z.array(z.number().int()).nonempty(),\n modifiedTime: modifiedTimeSchema,\n })\n .partial();\n\nexport const searchContentFilterSchema = z.union([\n searchContentFilterBase.extend({ contentTypes: z.array(contentTypes).nonempty() }).strict(),\n searchContentFilterBase.extend({ ownerIds: z.array(z.number().int()).nonempty() }).strict(),\n searchContentFilterBase.extend({ modifiedTime: modifiedTimeSchema }).strict(),\n]);\n\nexport type SearchContentFilter = z.infer<typeof searchContentFilterSchema>;\n\nconst searchContentItemSchema = z.object({\n uri: z.string(),\n content: z.record(z.string(), z.unknown()),\n});\n\nexport const searchContentResponseSchema = z\n .object({\n next: z.string(),\n prev: z.string(),\n pageIndex: z.number().int(),\n startIndex: z.number().int(),\n total: z.number().int(),\n limit: z.number().int(),\n items: z.array(searchContentItemSchema),\n })\n .partial();\n\nexport type SearchContentItem = z.infer<typeof searchContentItemSchema>;\n\nexport type SearchContentResponse = z.infer<typeof searchContentResponseSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { datasourcesApis } from '../apis/datasourcesApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { DataSource } from '../types/dataSource.js';\nimport { Pagination } from '../types/pagination.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Data Sources methods of the Tableau Server REST API\n *\n * @export\n * @class DatasourcesMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm\n */\nexport default class DatasourcesMethods extends AuthenticatedMethods<typeof datasourcesApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, datasourcesApis), creds);\n }\n\n /**\n * Returns a list of published data sources on the specified site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter datasources by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm#query_data_sources\n */\n listDatasources = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; datasources: DataSource[] }> => {\n const response = await this._apiClient.listDatasources({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n datasources: response.datasources.datasource ?? [],\n };\n };\n\n /**\n * Returns information about the specified data source.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param datasourceId - The ID of the data source\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_data_sources.htm#query_data_source\n */\n queryDatasource = async ({\n siteId,\n datasourceId,\n }: {\n siteId: string;\n datasourceId: string;\n }): Promise<DataSource> => {\n return (\n await this._apiClient.queryDatasource({\n params: { siteId, datasourceId },\n ...this.authHeader,\n })\n ).datasource;\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { dataSourceSchema } from '../types/dataSource.js';\nimport { paginationSchema } from '../types/pagination.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst listDatasourcesEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/datasources',\n alias: 'listDatasources',\n description:\n 'Returns a list of published data sources on the specified site. Supports a filter string as a query parameter in the format field:operator:value.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description: 'Filter string in the format field:operator:value (e.g., name:eq:Project Views)',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n datasources: z.object({\n datasource: z.optional(z.array(dataSourceSchema)),\n }),\n }),\n});\n\nconst queryDatasourceEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/datasources/:datasourceId',\n alias: 'queryDatasource',\n description: 'Returns information about the specified data source.',\n response: z.object({\n datasource: dataSourceSchema,\n }),\n});\n\nconst datasourcesApi = makeApi([listDatasourcesEndpoint, queryDatasourceEndpoint]);\nexport const datasourcesApis = [...datasourcesApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\n\nexport const dataSourceSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n project: projectSchema,\n});\n\nexport type DataSource = z.infer<typeof dataSourceSchema>;\n", "import { z } from 'zod';\n\nexport const projectSchema = z.object({\n name: z.string(),\n id: z.string(),\n});\n", "import { z } from 'zod';\n\nexport const paginationSchema = z.object({\n pageNumber: z.coerce.number(),\n pageSize: z.coerce.number(),\n totalAvailable: z.coerce.number(),\n});\n\nexport type Pagination = z.infer<typeof paginationSchema>;\n\nexport const pulsePaginationSchema = z.object({\n next_page_token: z.string().optional(),\n total_available: z.coerce.number().optional(),\n});\n\nexport type PulsePagination = z.infer<typeof pulsePaginationSchema>;\n", "import { ZodiosEndpointParameter } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const paginationParameters = [\n {\n name: 'pageSize',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.',\n },\n {\n name: 'pageNumber',\n type: 'Query',\n schema: z.number().optional(),\n description: 'The offset for paging. The default is 1.',\n },\n] as const satisfies Array<ZodiosEndpointParameter>;\n", "import { Zodios } from '@zodios/core';\n\nimport { GraphQLResponse, metadataApis } from '../apis/metadataApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Metadata methods of the Tableau Server REST API\n *\n * @export\n * @class MetadataMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_metadata.htm\n */\nexport default class MetadataMethods extends AuthenticatedMethods<typeof metadataApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, metadataApis), creds);\n }\n\n /**\n * Executes a GraphQL query against the Tableau Server.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} query\n * @link https://help.tableau.com/current/api/metadata_api/en-us/index.html\n */\n graphql = async (query: string): Promise<GraphQLResponse> => {\n return await this._apiClient.graphql({ query }, { ...this.authHeader });\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const graphqlResponse = z.object({\n data: z.object({\n publishedDatasources: z.array(\n z.object({\n name: z.string().nullable(),\n description: z.string().nullable(),\n owner: z.object({\n name: z.string().nullable(),\n }),\n fields: z.array(\n z.object({\n name: z.string(),\n isHidden: z.boolean().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(\n z\n .object({\n attribute: z.string(),\n value: z.string().nullable(),\n })\n .nullable(),\n )\n .nullable(),\n fullyQualifiedName: z.string(),\n __typename: z.string(),\n // Common field properties (optional since they depend on field type)\n dataCategory: z.string().nullish(),\n role: z.string().nullish(),\n dataType: z.string().nullish(),\n defaultFormat: z.string().nullish(),\n semanticRole: z.string().nullish(),\n aggregation: z.string().nullish(),\n aggregationParam: z.string().nullish(),\n // CalculatedField specific properties\n formula: z.string().nullish(),\n isAutoGenerated: z.boolean().nullish(),\n hasUserReference: z.boolean().nullish(),\n // BinField specific properties\n binSize: z.number().nullish(),\n // GroupField specific properties\n hasOther: z.boolean().nullish(),\n // CombinedSetField specific properties\n delimiter: z.string().nullish(),\n combinationType: z.string().nullish(),\n }),\n ),\n }),\n ),\n }),\n});\n\nexport type GraphQLResponse = z.infer<typeof graphqlResponse>;\n\nconst graphqlEndpoint = makeEndpoint({\n method: 'post',\n path: '/graphql',\n alias: 'graphql',\n response: graphqlResponse,\n parameters: [\n {\n name: 'query',\n type: 'Body',\n schema: z.object({\n query: z.string(),\n }),\n },\n ],\n});\n\nconst metadataApi = makeApi([graphqlEndpoint]);\nexport const metadataApis = [...metadataApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport z from 'zod';\n\nimport { isAxiosError } from '../../../utils/axios.js';\nimport { pulseApis } from '../apis/pulseApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { PulsePagination } from '../types/pagination.js';\nimport {\n pulseBundleRequestSchema,\n PulseBundleResponse,\n PulseInsightBundleType,\n PulseMetric,\n PulseMetricDefinition,\n PulseMetricDefinitionView,\n PulseMetricSubscription,\n} from '../types/pulse.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Pulse methods of the Tableau Server REST API\n *\n * @export\n * @class PulseMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm\n */\nexport default class PulseMethods extends AuthenticatedMethods<typeof pulseApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, pulseApis), creds);\n }\n\n /**\n * Returns a list of all published Pulse Metric Definitions.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param view - The view of the definition to return. If not specified, the default view is returned.\n * @param pageToken - Token for retrieving the next page of results. Omit for the first page.\n * @param pageSize - Specifies the number of results in a paged response.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListDefinitions\n */\n listAllPulseMetricDefinitions = async (\n view?: PulseMetricDefinitionView,\n pageToken?: string,\n pageSize?: number,\n ): Promise<\n PulseResult<{\n pagination: PulsePagination;\n definitions: PulseMetricDefinition[];\n }>\n > => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listAllPulseMetricDefinitions({\n queries: { view, page_token: pageToken, page_size: pageSize },\n ...this.authHeader,\n });\n return {\n pagination: {\n next_page_token: response.next_page_token,\n offset: response.offset,\n total_available: response.total_available,\n },\n definitions: response.definitions ?? [],\n };\n });\n };\n\n /**\n * Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param metricDefinitionIds - The list of metric definition IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetDefinitionsByPost\n */\n listPulseMetricDefinitionsFromMetricDefinitionIds = async (\n metricDefinitionIds: string[],\n view?: PulseMetricDefinitionView,\n ): Promise<PulseResult<PulseMetricDefinition[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricDefinitionsFromMetricDefinitionIds(\n { definition_ids: metricDefinitionIds },\n { queries: { view }, ...this.authHeader },\n );\n return response.definitions ?? [];\n });\n };\n\n /**\n * Returns a list of published Pulse Metrics.\n *\n * Required scopes: `tableau:insight_definitions_metrics:read`\n *\n * @param pulseMetricDefinitionID - The ID of the Pulse Metric Definition to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_ListMetrics\n */\n listPulseMetricsFromMetricDefinitionId = async (\n pulseMetricDefinitionID: string,\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricDefinitionId({\n params: { pulseMetricDefinitionID },\n ...this.authHeader,\n });\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metrics for a list of metric IDs.\n *\n * Required scopes: `tableau:insight_metrics:read`\n *\n * @param metricIds - The list of metric IDs to list metrics for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#MetricQueryService_BatchGetMetrics\n */\n listPulseMetricsFromMetricIds = async (\n metricIds: string[],\n ): Promise<PulseResult<PulseMetric[]>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricsFromMetricIds(\n { metric_ids: metricIds },\n { ...this.authHeader },\n );\n return response.metrics ?? [];\n });\n };\n\n /**\n * Returns a list of Pulse Metric Subscriptions for the current user.\n *\n * Required scopes: `tableau:metric_subscriptions:read`\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseSubscriptionService_ListSubscriptions\n */\n listPulseMetricSubscriptionsForCurrentUser = async (): Promise<\n PulseResult<PulseMetricSubscription[]>\n > => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.listPulseMetricSubscriptionsForCurrentUser({\n queries: { user_id: this.userId },\n ...this.authHeader,\n });\n return response.subscriptions ?? [];\n });\n };\n\n /**\n * Returns the generated bundle of the current aggregate value for the Pulse metric.\n *\n * Required scopes: `tableau:insights:read`\n *\n * @param bundleRequest - The request to generate a bundle for.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_pulse.htm#PulseInsightsService_GenerateInsightBundleBasic\n */\n generatePulseMetricValueInsightBundle = async (\n bundleRequest: z.infer<typeof pulseBundleRequestSchema>,\n bundleType: PulseInsightBundleType,\n ): Promise<PulseResult<PulseBundleResponse>> => {\n return await guardAgainstPulseDisabled(async () => {\n const response = await this._apiClient.generatePulseMetricValueInsightBundle(\n { bundle_request: bundleRequest.bundle_request },\n { params: { bundle_type: bundleType }, ...this.authHeader },\n );\n return response ?? {};\n });\n };\n}\n\nexport type PulseDisabledError = 'tableau-server' | 'pulse-disabled';\nexport type PulseResult<T> = Result<T, PulseDisabledError>;\nasync function guardAgainstPulseDisabled<T>(callback: () => Promise<T>): Promise<PulseResult<T>> {\n try {\n return new Ok(await callback());\n } catch (error) {\n if (isAxiosError(error)) {\n if (error.response?.status === 404) {\n return new Err('tableau-server');\n }\n\n if (\n error.response?.status === 400 &&\n error.response.headers.tableau_error_code === '0xd3408984' &&\n error.response.headers.validation_code === '400999'\n ) {\n // ntbue-service-chassis/-/blob/main/server/interceptors/site_settings.go\n return new Err('pulse-disabled');\n }\n }\n\n throw error;\n }\n}\n", "'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n", "'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n", "import FormData from 'form-data';\n\nexport default FormData;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n", "'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n", "'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n", "import crypto from 'crypto';\nimport URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n const randomValues = new Uint32Array(size);\n crypto.randomFillSync(randomValues);\n for (let i = 0; i < size; i++) {\n str += alphabet[randomValues[i] % length];\n }\n\n return str;\n}\n\n\nexport default {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob: typeof Blob !== 'undefined' && Blob || null\n },\n ALPHABET,\n generateString,\n protocols: [ 'http', 'https', 'file', 'data' ]\n};\n", "'use strict';\n\nimport url from 'url';\nexport default url.URLSearchParams;\n", "const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n", "import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n", "'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n", "'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n", "'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n", "'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n", "'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n", "'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n", "'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n", "'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport buildURL from './../helpers/buildURL.js';\nimport proxyFromEnv from 'proxy-from-env';\nimport http from 'http';\nimport https from 'https';\nimport util from 'util';\nimport followRedirects from 'follow-redirects';\nimport zlib from 'zlib';\nimport {VERSION} from '../env/data.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport platform from '../platform/index.js';\nimport fromDataURI from '../helpers/fromDataURI.js';\nimport stream from 'stream';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport AxiosTransformStream from '../helpers/AxiosTransformStream.js';\nimport {EventEmitter} from 'events';\nimport formDataToStream from \"../helpers/formDataToStream.js\";\nimport readBlob from \"../helpers/readBlob.js\";\nimport ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';\nimport callbackify from \"../helpers/callbackify.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';\n\nconst zlibOptions = {\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH\n};\n\nconst brotliOptions = {\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH\n}\n\nconst isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);\n\nconst {http: httpFollow, https: httpsFollow} = followRedirects;\n\nconst isHttps = /https:?/;\n\nconst supportedProtocols = platform.protocols.map(protocol => {\n return protocol + ':';\n});\n\n\nconst flushOnFinish = (stream, [throttled, flush]) => {\n stream\n .on('end', flush)\n .on('error', flush);\n\n return throttled;\n}\n\n\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */\nfunction dispatchBeforeRedirect(options, responseDetails) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options, responseDetails);\n }\n}\n\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */\nfunction setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = proxyFromEnv.getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');\n }\n\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');\n }\n const base64 = Buffer\n .from(proxy.auth, 'utf8')\n .toString('base64');\n options.headers['Proxy-Authorization'] = 'Basic ' + base64;\n }\n\n options.headers.host = options.hostname + (options.port ? ':' + options.port : '');\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\n\nconst isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process';\n\n// temporary hotfix\n\nconst wrapAsync = (asyncExecutor) => {\n return new Promise((resolve, reject) => {\n let onDone;\n let isDone;\n\n const done = (value, isRejected) => {\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n }\n\n const _resolve = (value) => {\n done(value);\n resolve(value);\n };\n\n const _reject = (reason) => {\n done(reason, true);\n reject(reason);\n }\n\n asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);\n })\n};\n\nconst resolveFamily = ({address, family}) => {\n if (!utils.isString(address)) {\n throw TypeError('address must be a string');\n }\n return ({\n address,\n family: family || (address.indexOf('.') < 0 ? 6 : 4)\n });\n}\n\nconst buildAddressEntry = (address, family) => resolveFamily(utils.isObject(address) ? address : {address, family});\n\n/*eslint consistent-return:0*/\nexport default isHttpAdapterSupported && function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let {data, lookup, family} = config;\n const {responseType, responseEncoding} = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n\n if (lookup) {\n const _lookup = callbackify(lookup, (value) => utils.isArray(value) ? value : [value]);\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb) => {\n _lookup(hostname, opt, (err, arg0, arg1) => {\n if (err) {\n return cb(err);\n }\n\n const addresses = utils.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];\n\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n }\n }\n\n // temporary internal emitter until the AxiosRequest class will be implemented\n const emitter = new EventEmitter();\n\n const onFinished = () => {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', abort);\n }\n\n emitter.removeAllListeners();\n }\n\n onDone((value, isRejected) => {\n isDone = true;\n if (isRejected) {\n rejected = true;\n onFinished();\n }\n });\n\n function abort(reason) {\n emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);\n }\n\n emitter.once('abort', reject);\n\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);\n }\n }\n\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);\n const protocol = parsed.protocol || supportedProtocols[0];\n\n if (protocol === 'data:') {\n // Apply the same semantics as HTTP: only enforce if a finite, non-negative cap is set.\n if (config.maxContentLength > -1) {\n // Use the exact string passed to fromDataURI (config.url); fall back to fullPath if needed.\n const dataUrl = String(config.url || fullPath || '');\n const estimated = estimateDataURLDecodedBytes(dataUrl);\n\n if (estimated > config.maxContentLength) {\n return reject(new AxiosError(\n 'maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE,\n config\n ));\n }\n }\n\n let convertedData;\n\n if (method !== 'GET') {\n return settle(resolve, reject, {\n status: 405,\n statusText: 'method not allowed',\n headers: {},\n config\n });\n }\n\n try {\n convertedData = fromDataURI(config.url, responseType === 'blob', {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n\n if (responseType === 'text') {\n convertedData = convertedData.toString(responseEncoding);\n\n if (!responseEncoding || responseEncoding === 'utf8') {\n convertedData = utils.stripBOM(convertedData);\n }\n } else if (responseType === 'stream') {\n convertedData = stream.Readable.from(convertedData);\n }\n\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: 'OK',\n headers: new AxiosHeaders(),\n config\n });\n }\n\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\n 'Unsupported protocol ' + protocol,\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n const headers = AxiosHeaders.from(config.headers).normalize();\n\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set('User-Agent', 'axios/' + VERSION, false);\n\n const {onUploadProgress, onDownloadProgress} = config;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n\n // support for spec compliant FormData objects\n if (utils.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n\n data = formDataToStream(data, (formHeaders) => {\n headers.set(formHeaders);\n }, {\n tag: `axios-${VERSION}-boundary`,\n boundary: userBoundary && userBoundary[1] || undefined\n });\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util.promisify(data.getLength).call(data);\n Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);\n /*eslint no-empty:0*/\n } catch (e) {\n }\n }\n } else if (utils.isBlob(data) || utils.isFile(data)) {\n data.size && headers.setContentType(data.type || 'application/octet-stream');\n headers.setContentLength(data.size || 0);\n data = stream.Readable.from(readBlob(data));\n } else if (data && !utils.isStream(data)) {\n if (Buffer.isBuffer(data)) {\n // Nothing to do...\n } else if (utils.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils.isString(data)) {\n data = Buffer.from(data, 'utf-8');\n } else {\n return reject(new AxiosError(\n 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\n 'Request body larger than maxBodyLength limit',\n AxiosError.ERR_BAD_REQUEST,\n config\n ));\n }\n }\n\n const contentLength = utils.toFiniteNumber(headers.getContentLength());\n\n if (utils.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils.isStream(data)) {\n data = stream.Readable.from(data, {objectMode: false});\n }\n\n data = stream.pipeline([data, new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxUploadRate)\n })], utils.noop);\n\n onUploadProgress && data.on('progress', flushOnFinish(\n data,\n progressEventDecorator(\n contentLength,\n progressEventReducer(asyncDecorator(onUploadProgress), false, 3)\n )\n ));\n }\n\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n auth = username + ':' + password;\n }\n\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + ':' + urlPassword;\n }\n\n auth && headers.delete('authorization');\n\n let path;\n\n try {\n path = buildURL(\n parsed.pathname + parsed.search,\n config.params,\n config.paramsSerializer\n ).replace(/^\\?/, '');\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n\n headers.set(\n 'Accept-Encoding',\n 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false\n );\n\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: { http: config.httpAgent, https: config.httpsAgent },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {}\n };\n\n // cacheable-lookup integration hotfix\n !utils.isUndefined(lookup) && (options.lookup = lookup);\n\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname.startsWith(\"[\") ? parsed.hostname.slice(1, -1) : parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);\n }\n\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https : http;\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n\n const streams = [res];\n\n const responseLength = +res.headers['content-length'];\n\n if (onDownloadProgress || maxDownloadRate) {\n const transformStream = new AxiosTransformStream({\n maxRate: utils.toFiniteNumber(maxDownloadRate)\n });\n\n onDownloadProgress && transformStream.on('progress', flushOnFinish(\n transformStream,\n progressEventDecorator(\n responseLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)\n )\n ));\n\n streams.push(transformStream);\n }\n\n // decompress the response body transparently if required\n let responseStream = res;\n\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers['content-encoding']) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === 'HEAD' || res.statusCode === 204) {\n delete res.headers['content-encoding'];\n }\n\n switch ((res.headers['content-encoding'] || '').toLowerCase()) {\n /*eslint default-case:0*/\n case 'gzip':\n case 'x-gzip':\n case 'compress':\n case 'x-compress':\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'deflate':\n streams.push(new ZlibHeaderTransformStream());\n\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib.createUnzip(zlibOptions));\n\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers['content-encoding'];\n break;\n case 'br':\n if (isBrotliSupported) {\n streams.push(zlib.createBrotliDecompress(brotliOptions));\n delete res.headers['content-encoding'];\n }\n }\n }\n\n responseStream = streams.length > 1 ? stream.pipeline(streams, utils.noop) : streams[0];\n\n const offListeners = stream.finished(responseStream, () => {\n offListeners();\n onFinished();\n });\n\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders(res.headers),\n config,\n request: lastRequest\n };\n\n if (responseType === 'stream') {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n\n responseStream.on('data', function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',\n AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n\n responseStream.on('aborted', function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n\n const err = new AxiosError(\n 'stream has been aborted',\n AxiosError.ERR_BAD_RESPONSE,\n config,\n lastRequest\n );\n responseStream.destroy(err);\n reject(err);\n });\n\n responseStream.on('error', function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n\n responseStream.on('end', function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== 'arraybuffer') {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === 'utf8') {\n responseData = utils.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n\n emitter.once('abort', err => {\n if (!responseStream.destroyed) {\n responseStream.emit('error', err);\n responseStream.destroy();\n }\n });\n });\n\n emitter.once('abort', err => {\n reject(err);\n req.destroy(err);\n });\n\n // Handle errors\n req.on('error', function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n\n // set tcp keep alive to prevent drop connection by peer\n req.on('socket', function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n\n if (Number.isNaN(timeout)) {\n reject(new AxiosError(\n 'error trying to parse `config.timeout` to int',\n AxiosError.ERR_BAD_OPTION_VALUE,\n config,\n req\n ));\n\n return;\n }\n\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n req\n ));\n abort();\n });\n }\n\n\n // Send the request\n if (utils.isStream(data)) {\n let ended = false;\n let errored = false;\n\n data.on('end', () => {\n ended = true;\n });\n\n data.once('error', err => {\n errored = true;\n req.destroy(err);\n });\n\n data.on('close', () => {\n if (!ended && !errored) {\n abort(new CanceledError('Request stream has been aborted', config, req));\n }\n });\n\n data.pipe(req);\n } else {\n req.end(data);\n }\n });\n}\n\nexport const __setProxy = setProxy;\n", "export const VERSION = \"1.12.1\";", "'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport parseProtocol from './parseProtocol.js';\nimport platform from '../platform/index.js';\n\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */\nexport default function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n\n if (protocol === 'data') {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n\n const match = DATA_URL_PATTERN.exec(uri);\n\n if (!match) {\n throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);\n }\n\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');\n\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);\n }\n\n return new _Blob([buffer], {type: mime});\n }\n\n return buffer;\n }\n\n throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\n", "'use strict';\n\nimport stream from 'stream';\nimport utils from '../utils.js';\n\nconst kInternals = Symbol('internals');\n\nclass AxiosTransformStream extends stream.Transform{\n constructor(options) {\n options = utils.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source) => {\n return !utils.isUndefined(source[prop]);\n });\n\n super({\n readableHighWaterMark: options.chunkSize\n });\n\n const internals = this[kInternals] = {\n timeWindow: options.timeWindow,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n\n this.on('newListener', event => {\n if (event === 'progress') {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n }\n\n _read(size) {\n const internals = this[kInternals];\n\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n\n return super._read(size);\n }\n\n _transform(chunk, encoding, callback) {\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n\n const readableHighWaterMark = this.readableHighWaterMark;\n\n const timeWindow = internals.timeWindow;\n\n const divider = 1000 / timeWindow;\n const bytesThreshold = (maxRate / divider);\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n\n const pushChunk = (_chunk, _callback) => {\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n\n internals.isCaptured && this.emit('progress', internals.bytesSeen);\n\n if (this.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = () => {\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n }\n\n const transformChunk = (_chunk, _callback) => {\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n\n if (maxRate) {\n const now = Date.now();\n\n if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n\n bytesLeft = bytesThreshold - internals.bytes;\n }\n\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(() => {\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n\n if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n\n pushChunk(_chunk, chunkRemainder ? () => {\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n}\n\nexport default AxiosTransformStream;\n", "import util from 'util';\nimport {Readable} from 'stream';\nimport utils from \"../utils.js\";\nimport readBlob from \"./readBlob.js\";\nimport platform from \"../platform/index.js\";\n\nconst BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';\n\nconst textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util.TextEncoder();\n\nconst CRLF = '\\r\\n';\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\n\nclass FormDataPart {\n constructor(name, value) {\n const {escapeName} = this.constructor;\n const isStringValue = utils.isString(value);\n\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${\n !isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : ''\n }${CRLF}`;\n\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || \"application/octet-stream\"}${CRLF}`\n }\n\n this.headers = textEncoder.encode(headers + CRLF);\n\n this.contentLength = isStringValue ? value.byteLength : value.size;\n\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n\n this.name = name;\n this.value = value;\n }\n\n async *encode(){\n yield this.headers;\n\n const {value} = this;\n\n if(utils.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob(value);\n }\n\n yield CRLF_BYTES;\n }\n\n static escapeName(name) {\n return String(name).replace(/[\\r\\n\"]/g, (match) => ({\n '\\r' : '%0D',\n '\\n' : '%0A',\n '\"' : '%22',\n }[match]));\n }\n}\n\nconst formDataToStream = (form, headersHandler, options) => {\n const {\n tag = 'form-data-boundary',\n size = 25,\n boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)\n } = options || {};\n\n if(!utils.isFormData(form)) {\n throw TypeError('FormData instance required');\n }\n\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error('boundary must be 10-70 characters long')\n }\n\n const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);\n const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF);\n let contentLength = footerBytes.byteLength;\n\n const parts = Array.from(form.entries()).map(([name, value]) => {\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n\n contentLength += boundaryBytes.byteLength * parts.length;\n\n contentLength = utils.toFiniteNumber(contentLength);\n\n const computedHeaders = {\n 'Content-Type': `multipart/form-data; boundary=${boundary}`\n }\n\n if (Number.isFinite(contentLength)) {\n computedHeaders['Content-Length'] = contentLength;\n }\n\n headersHandler && headersHandler(computedHeaders);\n\n return Readable.from((async function *() {\n for(const part of parts) {\n yield boundaryBytes;\n yield* part.encode();\n }\n\n yield footerBytes;\n })());\n};\n\nexport default formDataToStream;\n", "const {asyncIterator} = Symbol;\n\nconst readBlob = async function* (blob) {\n if (blob.stream) {\n yield* blob.stream()\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer()\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n}\n\nexport default readBlob;\n", "\"use strict\";\n\nimport stream from \"stream\";\n\nclass ZlibHeaderTransformStream extends stream.Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) { // Hex: 78\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C \n this.push(header, encoding);\n }\n }\n\n this.__transform(chunk, encoding, callback);\n }\n}\n\nexport default ZlibHeaderTransformStream;\n", "import utils from \"../utils.js\";\n\nconst callbackify = (fn, reducer) => {\n return utils.isAsyncFn(fn) ? function (...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value) => {\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n } : fn;\n}\n\nexport default callbackify;\n", "'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n", "/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n", "import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n", "/**\n * Estimate decoded byte length of a data:// URL *without* allocating large buffers.\n * - For base64: compute exact decoded size using length and padding;\n * handle %XX at the character-count level (no string allocation).\n * - For non-base64: use UTF-8 byteLength of the encoded body as a safe upper bound.\n *\n * @param {string} url\n * @returns {number}\n */\nexport default function estimateDataURLDecodedBytes(url) {\n if (!url || typeof url !== 'string') return 0;\n if (!url.startsWith('data:')) return 0;\n\n const comma = url.indexOf(',');\n if (comma < 0) return 0;\n\n const meta = url.slice(5, comma);\n const body = url.slice(comma + 1);\n const isBase64 = /;base64/i.test(meta);\n\n if (isBase64) {\n let effectiveLen = body.length;\n const len = body.length; // cache length\n\n for (let i = 0; i < len; i++) {\n if (body.charCodeAt(i) === 37 /* '%' */ && i + 2 < len) {\n const a = body.charCodeAt(i + 1);\n const b = body.charCodeAt(i + 2);\n const isHex =\n ((a >= 48 && a <= 57) || (a >= 65 && a <= 70) || (a >= 97 && a <= 102)) &&\n ((b >= 48 && b <= 57) || (b >= 65 && b <= 70) || (b >= 97 && b <= 102));\n\n if (isHex) {\n effectiveLen -= 2;\n i += 2;\n }\n }\n }\n\n let pad = 0;\n let idx = len - 1;\n\n const tailIsPct3D = (j) =>\n j >= 2 &&\n body.charCodeAt(j - 2) === 37 && // '%'\n body.charCodeAt(j - 1) === 51 && // '3'\n (body.charCodeAt(j) === 68 || body.charCodeAt(j) === 100); // 'D' or 'd'\n\n if (idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n idx--;\n } else if (tailIsPct3D(idx)) {\n pad++;\n idx -= 3;\n }\n }\n\n if (pad === 1 && idx >= 0) {\n if (body.charCodeAt(idx) === 61 /* '=' */) {\n pad++;\n } else if (tailIsPct3D(idx)) {\n pad++;\n }\n }\n\n const groups = Math.floor(effectiveLen / 4);\n const bytes = groups * 3 - (pad || 0);\n return bytes > 0 ? bytes : 0;\n }\n\n return Buffer.byteLength(body, 'utf8');\n}\n", "import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n", "import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils.isString(path) && cookie.push('path=' + path);\n\n utils.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop , caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop , caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n", "import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n", "import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n", "\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({fetch, Request, Response}) => ({\n fetch, Request, Response\n }))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n const {fetch, Request, Response} = Object.assign({}, globalFetchAPI, env);\n const isFetchSupported = isFunction(fetch);\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? fetch(request, fetchOptions) : fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, config ? config.env : null);\n\n const {fetch, Request, Response} = env;\n\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n", "import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n getAdapter: (adapters, config) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n", "'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n", "'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n", "'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n", "'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n", "'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n", "const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n", "'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n", "import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n", "import axios, { AxiosResponse, isAxiosError } from '../../node_modules/axios/index.js';\n\nexport function getStringResponseHeader(\n headers: AxiosResponse['headers'],\n headerName: string,\n): string {\n const headerValue = headers[headerName] || '';\n if (typeof headerValue === 'string') {\n return headerValue;\n }\n return '';\n}\n\n// Our dependency on Axios is indirect through Zodios.\n// Zodios doesn't re-export the exports of axios, so we need to import it haphazardly through node_modules.\n// This re-export is only to prevent import clutter in the codebase.\nexport { axios, AxiosResponse, isAxiosError };\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport {\n pulseBundleRequestSchema,\n pulseBundleResponseSchema,\n pulseInsightBundleTypeEnum,\n pulseMetricDefinitionSchema,\n pulseMetricDefinitionViewEnum,\n pulseMetricSchema,\n pulseMetricSubscriptionSchema,\n} from '../types/pulse.js';\n\nconst listAllPulseMetricDefinitionsRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions',\n alias: 'listAllPulseMetricDefinitions',\n description: 'Returns a list of all published Pulse Metric Definitions on the specified site.',\n parameters: [\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n {\n name: 'page_size',\n type: 'Query',\n schema: z.optional(z.coerce.number().int().positive()),\n description: 'Specifies the number of results in a paged response.',\n },\n {\n name: 'page_token',\n type: 'Query',\n schema: z.optional(z.string()),\n description: 'Token for retrieving the next page of results. Omit for the first page.',\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n next_page_token: z.string().optional(),\n offset: z.coerce.number(),\n total_available: z.coerce.number(),\n }),\n});\n\nconst listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/definitions%3AbatchGet',\n alias: 'listPulseMetricDefinitionsFromMetricDefinitionIds',\n description:\n 'Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.',\n parameters: [\n {\n name: 'definition_ids',\n type: 'Body',\n schema: z.object({ definition_ids: z.array(z.string().nonempty()).min(1) }),\n description: 'A list of metric definition IDs to retrieve.',\n },\n {\n name: 'view',\n type: 'Query',\n schema: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n description: `The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.\n - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.\n - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`,\n },\n ],\n response: z.object({\n definitions: z.array(pulseMetricDefinitionSchema),\n }),\n});\n\nconst listPulseMetricsFromMetricDefinitionIdRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/definitions/:pulseMetricDefinitionID/metrics',\n alias: 'listPulseMetricsFromMetricDefinitionId',\n description: 'Returns a list of published Pulse Metrics for a specific Pulse Metric Definition.',\n parameters: [\n {\n name: 'pulseMetricDefinitionID',\n type: 'Path',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n total_available: z.number(),\n }),\n});\n\nconst listPulseMetricsFromMetricIdsRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/metrics%3AbatchGet',\n alias: 'listPulseMetricsFromMetricIds',\n description: 'Returns a list of Pulse Metrics for a list of metric IDs.',\n parameters: [\n {\n name: 'metric_ids',\n type: 'Body',\n schema: z.object({ metric_ids: z.array(z.string().nonempty()) }),\n },\n ],\n response: z.object({\n metrics: z.array(pulseMetricSchema),\n }),\n});\n\nconst listPulseMetricSubscriptionsForCurrentUserRestEndpoint = makeEndpoint({\n method: 'get',\n path: '/pulse/subscriptions',\n alias: 'listPulseMetricSubscriptionsForCurrentUser',\n description: 'Returns a list of Pulse Subscriptions for the current user.',\n parameters: [\n {\n name: 'user_id',\n type: 'Query',\n schema: z.string().nonempty(),\n },\n ],\n response: z.object({\n subscriptions: z.array(pulseMetricSubscriptionSchema),\n }),\n});\n\nconst generatePulseMetricValueInsightBundleRestEndpoint = makeEndpoint({\n method: 'post',\n path: '/pulse/insights/:bundle_type',\n alias: 'generatePulseMetricValueInsightBundle',\n description: 'Generates a bundle for the current aggregated value for the Pulse metric.',\n parameters: [\n {\n name: 'bundle_request',\n type: 'Body',\n schema: pulseBundleRequestSchema,\n },\n {\n name: 'bundle_type',\n type: 'Path',\n schema: z.enum(pulseInsightBundleTypeEnum),\n },\n ],\n response: pulseBundleResponseSchema,\n});\n\nconst pulseApi = makeApi([\n generatePulseMetricValueInsightBundleRestEndpoint,\n listAllPulseMetricDefinitionsRestEndpoint,\n listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint,\n listPulseMetricsFromMetricDefinitionIdRestEndpoint,\n listPulseMetricSubscriptionsForCurrentUserRestEndpoint,\n listPulseMetricsFromMetricIdsRestEndpoint,\n]);\nexport const pulseApis = [...pulseApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nconst pulseMetadataSchema = z.object({\n name: z.string(),\n description: z.string(),\n id: z.string(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n definition_version: z.coerce.number(),\n last_updated_user: z.object({ id: z.string() }).optional(),\n});\n\nconst pulseDatasourceSchema = z.object({\n id: z.string(),\n});\n\nconst pulseFilterSchema = z.object({\n field: z.string(),\n operator: z.string(),\n categorical_values: z.array(\n z.object({\n string_value: z.string().optional(),\n bool_value: z.boolean().optional(),\n null_value: z.string().optional(),\n }),\n ),\n});\n\nconst pulseBasicSpecificationSchema = z.object({\n measure: z.object({ field: z.string(), aggregation: z.string() }),\n time_dimension: z.object({ field: z.string() }),\n filters: z.array(pulseFilterSchema),\n});\n\nconst pulseSpecificationSchema = z.object({\n datasource: pulseDatasourceSchema,\n basic_specification: pulseBasicSpecificationSchema.optional(),\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n is_running_total: z.boolean(),\n});\n\nexport const pulseExtensionOptionsSchema = z.object({\n allowed_dimensions: z.array(z.string()),\n allowed_granularities: z.array(z.string()),\n offset_from_today: z.number(),\n});\n\nexport const pulseMetricSpecificationSchema = z.object({\n filters: z.array(pulseFilterSchema),\n measurement_period: z.object({\n granularity: z.string(),\n range: z.string(),\n }),\n comparison: z.object({ comparison: z.string() }),\n});\n\nexport const pulseGoalsSchema = z.object({\n target: z.object({ value: z.number() }).optional(),\n});\n\nexport const pulseMetricSchema = z.object({\n id: z.string(),\n specification: pulseMetricSpecificationSchema,\n definition_id: z.string(),\n is_default: z.boolean(),\n schema_version: z.string(),\n metric_version: z.coerce.number(),\n goals: pulseGoalsSchema.optional(),\n is_followed: z.boolean(),\n datasource_luid: z.string(),\n});\n\nexport const pulseRepresentationOptionsSchema = z.object({\n type: z.string(),\n number_units: z.object({\n singular_noun: z.string(),\n plural_noun: z.string(),\n }),\n sentiment_type: z.string(),\n row_level_id_field: z.object({ identifier_col: z.string() }),\n row_level_entity_names: z.object({\n entity_name_singular: z.string().optional(),\n entity_name_plural: z.string().optional(),\n }),\n row_level_name_field: z.object({ name_col: z.string() }),\n currency_code: z.string(),\n});\n\nexport const insightOptionsSchema = z.object({\n settings: z.array(z.object({ type: z.string(), disabled: z.boolean() })),\n});\n\nexport const comparisonSchema = z.object({\n comparisons: z.array(\n z.object({\n compare_config: z.object({ comparison: z.string() }),\n index: z.coerce.number(),\n }),\n ),\n});\n\nexport const datasourceGoalsSchema = z.array(\n z.object({\n basic_specification: pulseBasicSpecificationSchema.optional(),\n threshold_basic_specification: pulseBasicSpecificationSchema.optional(),\n threshold_viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n viz_state_specification: z.object({ viz_state_string: z.string() }).optional(),\n minimum_granularity: z.string(),\n benchmark_sentiment_type: z.string(),\n name: z.string(),\n }),\n);\n\nexport const pulseMetricDefinitionSchema = z.object({\n metadata: pulseMetadataSchema,\n specification: pulseSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n metrics: z.array(pulseMetricSchema),\n total_metrics: z.coerce.number(),\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n comparisons: comparisonSchema,\n datasource_goals: datasourceGoalsSchema,\n});\n\nexport const pulseMetricSubscriptionSchema = z.object({\n id: z.string(),\n metric_id: z.string(),\n});\n\nexport const languageEnumSchema = z.enum([\n 'LANGUAGE_UNSPECIFIED',\n 'LANGUAGE_DE_DE',\n 'LANGUAGE_EN_US',\n 'LANGUAGE_EN_GB',\n 'LANGUAGE_ES_ES',\n 'LANGUAGE_FR_FR',\n 'LANGUAGE_FR_CA',\n 'LANGUAGE_GA_IE',\n 'LANGUAGE_IT_IT',\n 'LANGUAGE_JA_JP',\n 'LANGUAGE_KO_KR',\n 'LANGUAGE_NL_NL',\n 'LANGUAGE_PT_BR',\n 'LANGUAGE_SV_SE',\n 'LANGUAGE_TH_TH',\n 'LANGUAGE_ZH_CN',\n 'LANGUAGE_ZH_TW',\n]);\nexport type LanguageEnumType = z.infer<typeof languageEnumSchema>;\n\nexport const localeEnumSchema = z.enum([\n 'LOCALE_UNSPECIFIED',\n 'LOCALE_AR_AE',\n 'LOCALE_AR_BH',\n 'LOCALE_AR_DZ',\n 'LOCALE_AR_EG',\n 'LOCALE_AR_IQ',\n 'LOCALE_AR_JO',\n 'LOCALE_AR_KW',\n 'LOCALE_AR_LB',\n 'LOCALE_AR_LY',\n 'LOCALE_AR_MA',\n 'LOCALE_AR_OM',\n 'LOCALE_AR_QA',\n 'LOCALE_AR_SA',\n 'LOCALE_AR_SD',\n 'LOCALE_AR_SY',\n 'LOCALE_AR_TN',\n 'LOCALE_AR_YE',\n 'LOCALE_BE_BY',\n 'LOCALE_BG_BG',\n 'LOCALE_CA_ES',\n 'LOCALE_CS_CZ',\n 'LOCALE_DA_DK',\n 'LOCALE_DE_AT',\n 'LOCALE_DE_CH',\n 'LOCALE_DE_DE',\n 'LOCALE_DE_LU',\n 'LOCALE_EL_CY',\n 'LOCALE_EL_GR',\n 'LOCALE_EN_AU',\n 'LOCALE_EN_CA',\n 'LOCALE_EN_GB',\n 'LOCALE_EN_IE',\n 'LOCALE_EN_IN',\n 'LOCALE_EN_MT',\n 'LOCALE_EN_NZ',\n 'LOCALE_EN_PH',\n 'LOCALE_EN_SG',\n 'LOCALE_EN_US',\n 'LOCALE_EN_ZA',\n 'LOCALE_ES_AR',\n 'LOCALE_ES_BO',\n 'LOCALE_ES_CL',\n 'LOCALE_ES_CO',\n 'LOCALE_ES_CR',\n 'LOCALE_ES_DO',\n 'LOCALE_ES_EC',\n 'LOCALE_ES_ES',\n 'LOCALE_ES_GT',\n 'LOCALE_ES_HN',\n 'LOCALE_ES_MX',\n 'LOCALE_ES_NI',\n 'LOCALE_ES_PA',\n 'LOCALE_ES_PE',\n 'LOCALE_ES_PR',\n 'LOCALE_ES_PY',\n 'LOCALE_ES_SV',\n 'LOCALE_ES_US',\n 'LOCALE_ES_UY',\n 'LOCALE_ES_VE',\n 'LOCALE_ET_EE',\n 'LOCALE_FI_FI',\n 'LOCALE_FR_BE',\n 'LOCALE_FR_CA',\n 'LOCALE_FR_CH',\n 'LOCALE_FR_FR',\n 'LOCALE_FR_LU',\n 'LOCALE_GA_IE',\n 'LOCALE_HE_IL',\n 'LOCALE_HI_IN',\n 'LOCALE_HR_HR',\n 'LOCALE_HU_HU',\n 'LOCALE_ID_ID',\n 'LOCALE_IN_ID',\n 'LOCALE_IS_IS',\n 'LOCALE_IT_CH',\n 'LOCALE_IT_IT',\n 'LOCALE_IW_IL',\n 'LOCALE_JA_JP',\n 'LOCALE_KO_KR',\n 'LOCALE_LT_LT',\n 'LOCALE_LV_LV',\n 'LOCALE_MK_MK',\n 'LOCALE_MS_MY',\n 'LOCALE_MT_MT',\n 'LOCALE_NL_BE',\n 'LOCALE_NL_NL',\n 'LOCALE_NB_NO',\n 'LOCALE_NO_NO',\n 'LOCALE_PL_PL',\n 'LOCALE_PT_BR',\n 'LOCALE_PT_PT',\n 'LOCALE_RO_RO',\n 'LOCALE_RU_RU',\n 'LOCALE_SK_SK',\n 'LOCALE_SL_SI',\n 'LOCALE_SQ_AL',\n 'LOCALE_SR_BA',\n 'LOCALE_SR_ME',\n 'LOCALE_SR_RS',\n 'LOCALE_SV_SE',\n 'LOCALE_TH_TH',\n 'LOCALE_TR_TR',\n 'LOCALE_UK_UA',\n 'LOCALE_VI_VN',\n 'LOCALE_ZH_CN',\n 'LOCALE_ZH_HK',\n 'LOCALE_ZH_SG',\n 'LOCALE_ZH_TW',\n]);\nexport type LocaleEnumType = z.infer<typeof localeEnumSchema>;\n\nexport const outputFormatEnumSchema = z.enum([\n 'OUTPUT_FORMAT_UNSPECIFIED',\n 'OUTPUT_FORMAT_HTML',\n 'OUTPUT_FORMAT_TEXT',\n]);\nexport type OutputFormatEnumType = z.infer<typeof outputFormatEnumSchema>;\n\nexport const pulseBundleRequestSchema = z.object({\n bundle_request: z.object({\n version: z.number(),\n options: z.object({\n output_format: outputFormatEnumSchema,\n time_zone: z.string(),\n language: languageEnumSchema,\n locale: localeEnumSchema,\n }),\n input: z.object({\n metadata: z.object({\n name: z.string().nonempty(),\n metric_id: z.string().nonempty(),\n definition_id: z.string().nonempty(),\n }),\n metric: z.object({\n definition: z.object({\n datasource: z.object({\n id: z.string(),\n }),\n basic_specification: pulseBasicSpecificationSchema,\n is_running_total: z.boolean(),\n }),\n metric_specification: pulseMetricSpecificationSchema,\n extension_options: pulseExtensionOptionsSchema,\n representation_options: pulseRepresentationOptionsSchema,\n insights_options: insightOptionsSchema,\n goals: pulseGoalsSchema.optional(),\n }),\n }),\n }),\n});\n\nexport const popcBanInsightGroupSchema = z.object({\n type: z.string(),\n insights: z.array(\n z.object({\n result: z.object({\n type: z.string(),\n version: z.number(),\n content: z.string().optional(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n facts: z.any().optional(),\n characterization: z.string().optional(),\n question: z.string(),\n score: z.number(),\n }),\n insight_type: z.string(),\n }),\n ),\n summaries: z.array(\n z.object({\n result: z.object({\n id: z.string(),\n markup: z.string().optional(),\n viz: z.any().optional(),\n generation_id: z.string(),\n timestamp: z.string().optional(),\n last_attempted_timestamp: z.string().optional(),\n }),\n }),\n ),\n});\n\nexport const pulseBundleResponseSchema = z.object({\n bundle_response: z.object({\n result: z.object({\n insight_groups: z.array(popcBanInsightGroupSchema),\n has_errors: z.boolean(),\n characterization: z.string(),\n }),\n }),\n});\n\nexport type PulseBundleResponse = z.infer<typeof pulseBundleResponseSchema>;\n\nexport const pulseInsightBundleTypeEnum = ['ban', 'springboard', 'basic', 'detail'] as const;\nexport type PulseInsightBundleType = (typeof pulseInsightBundleTypeEnum)[number];\n\nexport const pulseMetricDefinitionViewEnum = [\n 'DEFINITION_VIEW_BASIC',\n 'DEFINITION_VIEW_FULL',\n 'DEFINITION_VIEW_DEFAULT',\n] as const;\nexport type PulseMetricDefinitionView = (typeof pulseMetricDefinitionViewEnum)[number];\n\nexport type PulseMetricDefinition = z.infer<typeof pulseMetricDefinitionSchema>;\nexport type PulseMetric = z.infer<typeof pulseMetricSchema>;\nexport type PulseMetricSubscription = z.infer<typeof pulseMetricSubscriptionSchema>;\n", "import { isErrorFromAlias, Zodios } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\n\nimport { isAxiosError } from '../../../utils/axios.js';\nimport { getExceptionMessage } from '../../../utils/getExceptionMessage.js';\nimport { serverApis, Session } from '../apis/serverApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { ServerInfo } from '../types/serverInfo.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\nimport Methods from './methods.js';\n\n/**\n * Server methods of the Tableau Server REST API\n *\n * @export\n * @class ServerMethods\n * @extends {Methods<typeof serverApis>}\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_server.htm\n */\nexport class ServerMethods extends Methods<typeof serverApis> {\n constructor(baseUrl: string) {\n super(new Zodios(baseUrl, serverApis));\n }\n\n /**\n * Returns the version of Tableau Server and the supported version of the REST API.\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_server.htm#get_server_info\n */\n getServerInfo = async (): Promise<ServerInfo> => {\n return (await this._apiClient.getServerInfo()).serverInfo;\n };\n}\n\n/**\n * Authenticated server methods of the Tableau Server REST API\n *\n * @export\n * @class AuthenticatedServerMethods\n * @extends {AuthenticatedMethods<typeof serverApis>}\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_server.htm\n */\nexport class AuthenticatedServerMethods extends AuthenticatedMethods<typeof serverApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, serverApis), creds);\n }\n\n /**\n * Returns details of the current session of Tableau Server.\n *\n * Required scopes: none\n *\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_server.htm#get-current-server-session\n */\n getCurrentServerSession = async (): Promise<\n Result<Session, { type: 'unauthorized' | 'unknown'; message: unknown }>\n > => {\n try {\n const response = await this._apiClient.getCurrentServerSession({\n ...this.authHeader,\n });\n return Ok(response.session);\n } catch (error) {\n if (isErrorFromAlias(this._apiClient.api, 'getCurrentServerSession', error)) {\n return Err({ type: 'unauthorized', message: error.response.data.error });\n }\n\n if (isAxiosError(error) && error.response) {\n return Err({ type: 'unknown', message: error.response.data });\n }\n\n return Err({ type: 'unknown', message: getExceptionMessage(error) });\n }\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { serverInfo } from '../types/serverInfo.js';\nimport { siteSchema } from '../types/site.js';\nimport { userSchema } from '../types/user.js';\n\nconst sessionSchema = z.object({\n site: siteSchema,\n user: userSchema,\n});\n\nconst getServerInfoEndpoint = makeEndpoint({\n method: 'get',\n path: '/serverinfo',\n alias: 'getServerInfo',\n description: 'Returns the version of Tableau Server and the supported version of the REST API.',\n response: z.object({\n serverInfo,\n }),\n});\n\nconst getCurrentServerSessionEndpoint = makeEndpoint({\n method: 'get',\n path: '/sessions/current',\n alias: 'getCurrentServerSession',\n description: 'Returns details of the current session of Tableau Server.',\n response: z.object({ session: sessionSchema }),\n errors: [\n {\n status: 401,\n schema: z.object({\n error: z.object({\n code: z.string(),\n summary: z.string(),\n detail: z.string(),\n }),\n }),\n },\n ],\n});\n\nexport type Session = z.infer<typeof sessionSchema>;\nconst serverApi = makeApi([getServerInfoEndpoint, getCurrentServerSessionEndpoint]);\nexport const serverApis = [...serverApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const serverInfo = z.object({\n productVersion: z.object({\n value: z.string(),\n build: z.string(),\n }),\n restApiVersion: z.string(),\n});\n\nexport type ServerInfo = z.infer<typeof serverInfo>;\nexport type ProductVersion = ServerInfo['productVersion'];\n", "import { z } from 'zod';\n\nexport const siteSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n", "import { z } from 'zod';\n\nexport const userSchema = z.object({\n id: z.string(),\n name: z.string(),\n});\n\nexport type User = z.infer<typeof userSchema>;\n", "import { Zodios } from '@zodios/core';\n\nimport { viewsApis } from '../apis/viewsApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { View } from '../types/view.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Views methods of the Tableau Server REST API\n *\n * @export\n * @class ViewsMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class ViewsMethods extends AuthenticatedMethods<typeof viewsApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, viewsApis), creds);\n }\n\n /**\n * Gets the details of a specific view.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} viewId The ID of the view to get.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#get_view\n */\n getView = async ({ viewId, siteId }: { viewId: string; siteId: string }): Promise<View> => {\n return (await this._apiClient.getView({ params: { siteId, viewId }, ...this.authHeader })).view;\n };\n\n /**\n * Returns a specified view rendered as data in comma separated value (CSV) format.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_data\n */\n queryViewData = async ({\n viewId,\n siteId,\n }: {\n viewId: string;\n siteId: string;\n }): Promise<string> => {\n return await this._apiClient.queryViewData({\n params: { siteId, viewId },\n ...this.authHeader,\n });\n };\n\n /**\n * Returns an image of the specified view.\n *\n * Required scopes: `tableau:views:download`\n *\n * @param {string} viewId The ID of the view to return an image for.\n * @param {string} siteId - The Tableau site ID\n * @param {number} width - (Optional) The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.\n * @param {number} height - (Optional) The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.\n * @param {string} resolution - (Optional) The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_view_image\n */\n queryViewImage = async ({\n viewId,\n siteId,\n width,\n height,\n resolution,\n }: {\n viewId: string;\n siteId: string;\n width?: number;\n height?: number;\n resolution?: 'high';\n }): Promise<string> => {\n return await this._apiClient.queryViewImage({\n params: { siteId, viewId },\n queries: { vizWidth: width, vizHeight: height, resolution },\n ...this.authHeader,\n responseType: 'arraybuffer',\n });\n };\n\n /**\n * Returns all the views for the specified workbook, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return views for.\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_workbook\n */\n queryViewsForWorkbook = async ({\n workbookId,\n siteId,\n includeUsageStatistics,\n }: {\n workbookId: string;\n siteId: string;\n includeUsageStatistics?: boolean;\n }): Promise<View[]> => {\n return (\n await this._apiClient.queryViewsForWorkbook({\n params: { siteId, workbookId },\n queries: { includeUsageStatistics },\n ...this.authHeader,\n })\n ).views.view;\n };\n\n /**\n * Returns all the views for the specified site, optionally including usage statistics.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} siteId - The Tableau site ID\n * @param {boolean} includeUsageStatistics - (Optional) true to return usage statistics. The default is false.\n * @param {string} filter - (Optional) Fields and operators that you can use to filter results\n * @param {number} pageSize - (Optional) The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param {number} pageNumber - (Optional) The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_views_for_site\n */\n queryViewsForSite = async ({\n siteId,\n includeUsageStatistics,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n includeUsageStatistics?: boolean;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; views: View[] }> => {\n const response = await this._apiClient.queryViewsForSite({\n params: { siteId },\n queries: { includeUsageStatistics, filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n views: response.views.view ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { viewSchema } from '../types/view.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst getViewEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views/:viewId',\n alias: 'getView',\n description: 'Gets the details of a specific view.',\n response: z.object({ view: viewSchema }),\n});\n\nconst queryViewDataEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views/:viewId/data',\n alias: 'queryViewData',\n description: 'Returns a specified view rendered as data in comma separated value (CSV) format.',\n response: z.string(),\n});\n\nconst queryViewImageEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views/:viewId/image',\n alias: 'queryViewImage',\n description: 'Returns an image of the specified view.',\n parameters: [\n {\n name: 'vizWidth',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio.',\n },\n {\n name: 'vizHeight',\n type: 'Query',\n schema: z.number().optional(),\n description:\n 'The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio.',\n },\n {\n name: 'resolution',\n type: 'Query',\n schema: z.literal('high').optional(),\n description:\n 'The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density.',\n },\n ],\n response: z.string(),\n});\n\nconst queryViewsForWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/workbooks/:workbookId/views',\n alias: 'queryViewsForWorkbook',\n description:\n 'Returns all the views for the specified workbook, optionally including usage statistics.',\n parameters: [\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n ],\n response: z.object({ views: z.object({ view: z.array(viewSchema) }) }),\n});\n\nconst queryViewsForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/views',\n alias: 'queryViewsForSite',\n description:\n 'Returns all the views for the specified site, optionally including usage statistics.',\n parameters: [\n ...paginationParameters,\n {\n name: 'includeUsageStatistics',\n type: 'Query',\n schema: z.boolean().optional(),\n description: 'true to return usage statistics. The default is false.',\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of views to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n views: z.object({ view: z.array(viewSchema).optional() }),\n }),\n});\n\nconst viewsApi = makeApi([\n getViewEndpoint,\n queryViewDataEndpoint,\n queryViewImageEndpoint,\n queryViewsForWorkbookEndpoint,\n queryViewsForSiteEndpoint,\n]);\n\nexport const viewsApis = [...viewsApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nexport const viewSchema = z.object({\n id: z.string(),\n name: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n workbook: z\n .object({\n id: z.string(),\n })\n .optional(),\n owner: z\n .object({\n id: z.string(),\n })\n .optional(),\n project: z\n .object({\n id: z.string(),\n })\n .optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n usage: z\n .object({\n totalViewCount: z.coerce.number(),\n })\n .optional(),\n});\n\nexport type View = z.infer<typeof viewSchema>;\n", "import { isErrorFromAlias, Zodios, ZodiosError } from '@zodios/core';\nimport { Err, Ok, Result } from 'ts-results-es';\n\nimport {\n MetadataResponse,\n QueryOutput,\n QueryRequest,\n ReadMetadataRequest,\n TableauError,\n vizqlDataServiceApis,\n} from '../apis/vizqlDataServiceApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * The VizQL Data Service (VDS) provides a programmatic way for you to access your published data outside of a Tableau visualization.\n *\n * @export\n * @class VizqlDataServiceMethods\n * @extends {AuthenticatedMethods<typeof vizqlDataServiceApis>}\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/index.html\n */\nexport default class VizqlDataServiceMethods extends AuthenticatedMethods<\n typeof vizqlDataServiceApis\n> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, vizqlDataServiceApis), creds);\n }\n\n /**\n * Queries a specific data source and returns the resulting data.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {QueryRequest} queryRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/QueryDatasource\n */\n queryDatasource = async (\n queryRequest: QueryRequest,\n ): Promise<Result<QueryOutput, 'feature-disabled' | TableauError | ZodiosError>> => {\n try {\n return Ok(await this._apiClient.queryDatasource(queryRequest, { ...this.authHeader }));\n } catch (error) {\n if (isErrorFromAlias(this._apiClient.api, 'queryDatasource', error)) {\n if (error.response.status === 404) {\n return Err('feature-disabled');\n }\n\n return Err(error.response.data);\n }\n\n if (error instanceof ZodiosError) {\n return Err(error);\n }\n\n throw error;\n }\n };\n\n /**\n * Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.\n *\n * Required scopes: `tableau:viz_data_service:read`\n *\n * @param {ReadMetadataRequest} readMetadataRequest\n * @link https://help.tableau.com/current/api/vizql-data-service/en-us/reference/index.html#tag/HeadlessBI/operation/ReadMetadata\n */\n readMetadata = async (\n readMetadataRequest: ReadMetadataRequest,\n ): Promise<Result<MetadataResponse, 'feature-disabled'>> => {\n try {\n return Ok(await this._apiClient.readMetadata(readMetadataRequest, { ...this.authHeader }));\n } catch (error) {\n if (\n isErrorFromAlias(this._apiClient.api, 'readMetadata', error) &&\n error.response.status === 404\n ) {\n return Err('feature-disabled');\n }\n\n throw error;\n }\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nexport const functionSchema = z.enum([\n 'SUM',\n 'AVG',\n 'MEDIAN',\n 'COUNT',\n 'COUNTD',\n 'MIN',\n 'MAX',\n 'STDEV',\n 'VAR',\n 'COLLECT',\n 'YEAR',\n 'QUARTER',\n 'MONTH',\n 'WEEK',\n 'DAY',\n 'TRUNC_YEAR',\n 'TRUNC_QUARTER',\n 'TRUNC_MONTH',\n 'TRUNC_WEEK',\n 'TRUNC_DAY',\n 'AGG',\n 'NONE',\n 'UNSPECIFIED',\n]);\n\nconst dataTypeSchema = z.enum([\n 'INTEGER',\n 'REAL',\n 'STRING',\n 'DATETIME',\n 'BOOLEAN',\n 'DATE',\n 'SPATIAL',\n 'UNKNOWN',\n]);\n\nconst periodTypeSchema = z.enum([\n 'MINUTES',\n 'HOURS',\n 'DAYS',\n 'WEEKS',\n 'MONTHS',\n 'QUARTERS',\n 'YEARS',\n]);\n\nconst columnClassSchema = z.enum(['COLUMN', 'BIN', 'GROUP', 'CALCULATION', 'TABLE_CALCULATION']);\n\nconst fieldMetadataSchema = z\n .object({\n fieldName: z.string(),\n fieldCaption: z.string(),\n dataType: dataTypeSchema,\n defaultAggregation: functionSchema,\n columnClass: columnClassSchema,\n formula: z.string(),\n logicalTableId: z.string(),\n })\n .partial()\n .passthrough();\n\n// Parameter schemas\nconst parameterValueSchema = z.union([z.number(), z.string(), z.boolean(), z.null()]);\n\nconst parameterBaseSchema = z.object({\n parameterCaption: z.string(),\n dataType: dataTypeSchema.exclude(['DATETIME', 'SPATIAL', 'UNKNOWN']),\n parameterName: z.string().optional(),\n value: parameterValueSchema,\n});\n\nconst parameterSchema = z.discriminatedUnion('parameterType', [\n parameterBaseSchema.extend({ parameterType: z.literal('ANY_VALUE') }).strict(),\n parameterBaseSchema\n .extend({\n parameterType: z.literal('LIST'),\n members: z.array(parameterValueSchema),\n })\n .strict(),\n parameterBaseSchema\n .extend({\n parameterType: z.literal('QUANTITATIVE_DATE'),\n value: z.string().nullable(),\n minDate: z.string().nullish(),\n maxDate: z.string().nullish(),\n periodValue: z.number().nullish(),\n periodType: periodTypeSchema.nullish(),\n })\n .strict(),\n parameterBaseSchema\n .extend({\n parameterType: z.literal('QUANTITATIVE_RANGE'),\n value: z.number().nullable(),\n min: z.number().nullish(),\n max: z.number().nullish(),\n step: z.number().nullish(),\n })\n .strict(),\n]);\n\n// Field schemas\nconst sortDirectionSchema = z.enum(['ASC', 'DESC']);\n\nconst fieldBaseSchema = z.object({\n fieldCaption: z.string(),\n fieldAlias: z.string().optional(),\n maxDecimalPlaces: z.number().int().gte(0).optional(),\n sortDirection: sortDirectionSchema.optional(),\n sortPriority: z.number().int().gt(0).optional(),\n});\n\nconst dimensionFieldSchema = fieldBaseSchema.strict();\nconst measureFieldSchema = fieldBaseSchema.extend({ function: functionSchema }).strict();\nconst calculatedFieldSchema = fieldBaseSchema.extend({ calculation: z.string() }).strict();\nconst binFieldSchema = fieldBaseSchema.extend({ binSize: z.number().gt(0) }).strict();\n\nexport const fieldSchema = z.union([\n dimensionFieldSchema,\n measureFieldSchema,\n calculatedFieldSchema,\n binFieldSchema,\n]);\n\n// Filter schemas\nconst dimensionFilterFieldSchema = z.object({ fieldCaption: z.string() }).strict();\nconst measureFilterFieldSchema = z\n .object({ fieldCaption: z.string(), function: functionSchema })\n .strict();\nconst calculatedFilterFieldSchema = z.object({ calculation: z.string() }).strict();\n\nexport const filterFieldSchema = z.union([\n dimensionFilterFieldSchema,\n measureFilterFieldSchema,\n calculatedFilterFieldSchema,\n]);\n\nconst filterBaseSchema = z.object({\n field: filterFieldSchema,\n context: z.boolean().optional(),\n});\n\nconst simpleFilterBaseSchema = z.object({\n field: z.object({ fieldCaption: z.string() }).strict(),\n context: z.boolean().optional(),\n});\n\nexport const setFilterSchema = simpleFilterBaseSchema.extend({\n filterType: z.literal('SET'),\n values: z.union([z.array(z.string()), z.array(z.number()), z.array(z.boolean())]),\n exclude: z.boolean().optional(),\n});\n\nconst relativeDateFilterBaseSchema = simpleFilterBaseSchema.extend({\n filterType: z.literal('DATE'),\n periodType: periodTypeSchema,\n anchorDate: z.string().optional(),\n includeNulls: z.boolean().optional(),\n});\n\nconst relativeDateFilterSchema = z.discriminatedUnion('dateRangeType', [\n relativeDateFilterBaseSchema.extend({ dateRangeType: z.literal('CURRENT') }).strict(),\n relativeDateFilterBaseSchema.extend({ dateRangeType: z.literal('LAST') }).strict(),\n relativeDateFilterBaseSchema.extend({ dateRangeType: z.literal('NEXT') }).strict(),\n relativeDateFilterBaseSchema.extend({ dateRangeType: z.literal('TODATE') }).strict(),\n relativeDateFilterBaseSchema\n .extend({\n dateRangeType: z.literal('LASTN'),\n rangeN: z.number().int(),\n })\n .strict(),\n relativeDateFilterBaseSchema\n .extend({\n dateRangeType: z.literal('NEXTN'),\n rangeN: z.number().int(),\n })\n .strict(),\n]);\n\nconst matchFilterBaseSchema = simpleFilterBaseSchema.extend({\n filterType: z.literal('MATCH'),\n startsWith: z.string().optional(),\n endsWith: z.string().optional(),\n contains: z.string().optional(),\n exclude: z.boolean().optional(),\n});\n\nexport const matchFilterSchema = z.union([\n matchFilterBaseSchema.extend({ startsWith: z.string() }).strict(),\n matchFilterBaseSchema.extend({ endsWith: z.string() }).strict(),\n matchFilterBaseSchema.extend({ contains: z.string() }).strict(),\n]);\n\nconst quantitativeNumericalFilterBaseSchema = filterBaseSchema.extend({\n filterType: z.literal('QUANTITATIVE_NUMERICAL'),\n});\n\nconst quantitativeNumericalFilterSchema = z.discriminatedUnion('quantitativeFilterType', [\n quantitativeNumericalFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('RANGE'),\n min: z.number(),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n })\n .strict(),\n quantitativeNumericalFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('MIN'),\n min: z.number(),\n includeNulls: z.boolean().optional(),\n })\n .strict(),\n quantitativeNumericalFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('MAX'),\n max: z.number(),\n includeNulls: z.boolean().optional(),\n })\n .strict(),\n quantitativeNumericalFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n })\n .strict(),\n quantitativeNumericalFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n })\n .strict(),\n]);\n\nconst quantitativeDateFilterBaseSchema = filterBaseSchema.extend({\n filterType: z.literal('QUANTITATIVE_DATE'),\n});\n\nconst quantitativeDateFilterSchema = z.discriminatedUnion('quantitativeFilterType', [\n quantitativeDateFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('RANGE'),\n minDate: z.string(),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n })\n .strict(),\n quantitativeDateFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('MIN'),\n minDate: z.string(),\n includeNulls: z.boolean().optional(),\n })\n .strict(),\n quantitativeDateFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('MAX'),\n maxDate: z.string(),\n includeNulls: z.boolean().optional(),\n })\n .strict(),\n quantitativeDateFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('ONLY_NULL'),\n })\n .strict(),\n quantitativeDateFilterBaseSchema\n .extend({\n quantitativeFilterType: z.literal('ONLY_NON_NULL'),\n })\n .strict(),\n]);\n\nexport const topNFilterSchema = filterBaseSchema.extend({\n filterType: z.literal('TOP'),\n howMany: z.number().int(),\n fieldToMeasure: filterFieldSchema,\n direction: z.enum(['TOP', 'BOTTOM']).optional().default('TOP'),\n});\n\nexport const filterSchema = z.union([\n setFilterSchema.strict(),\n topNFilterSchema.strict(),\n ...matchFilterSchema.options,\n ...quantitativeNumericalFilterSchema.options,\n ...quantitativeDateFilterSchema.options,\n ...relativeDateFilterSchema.options,\n]);\n\n// VDS API schemas\nconst queryParameterSchema = z.object({\n parameterCaption: z.string(),\n value: parameterValueSchema,\n});\n\nconst connectionSchema = z.object({\n connectionLuid: z.string().optional(),\n connectionUsername: z.string(),\n connectionPassword: z.string(),\n});\n\nexport const datasourceSchema = z.object({\n datasourceLuid: z.string().nonempty(),\n connections: z.array(connectionSchema).optional(),\n});\n\nconst returnFormatSchema = z.enum(['OBJECTS', 'ARRAYS']);\n\nconst queryOptionsSchema = z\n .object({\n returnFormat: returnFormatSchema,\n debug: z.boolean().default(false),\n })\n .partial()\n .passthrough();\n\nexport const readMetadataRequestSchema = z\n .object({\n datasource: datasourceSchema,\n options: queryOptionsSchema.optional(),\n })\n .passthrough();\n\nexport const metadataOutputSchema = z\n .object({\n data: z.array(fieldMetadataSchema),\n extraData: z.object({\n parameters: z.array(parameterSchema),\n }),\n })\n .partial()\n .passthrough();\n\nexport const tableauErrorSchema = z\n .object({\n errorCode: z.string(),\n message: z.string(),\n datetime: z.string().datetime({ offset: true }),\n debug: z.object({}).partial().passthrough(),\n 'tab-error-code': z.string(),\n })\n .partial()\n .passthrough();\n\nexport const querySchema = z.strictObject({\n fields: z.array(fieldSchema),\n filters: z.array(filterSchema).optional(),\n parameters: z.array(queryParameterSchema).optional(),\n});\n\nconst queryDatasourceOptionsSchema = queryOptionsSchema.and(\n z\n .object({\n disaggregate: z.boolean(),\n })\n .partial()\n .passthrough(),\n);\n\nexport const queryRequestSchema = z\n .object({\n datasource: datasourceSchema,\n query: querySchema,\n options: queryDatasourceOptionsSchema.optional(),\n })\n .passthrough();\n\nexport const queryOutputSchema = z\n .object({\n data: z.array(z.unknown()),\n })\n .partial()\n .passthrough();\n\n// Exported Types\nexport type Datasource = z.infer<typeof datasourceSchema>;\nexport type DataType = z.infer<typeof dataTypeSchema>;\n\nexport type Field = z.infer<typeof fieldSchema>;\nexport type FieldMetadata = z.infer<typeof fieldMetadataSchema>;\nexport type Filter = z.infer<typeof filterSchema>;\nexport type FilterField = z.infer<typeof filterFieldSchema>;\n\nexport type MetadataResponse = z.infer<typeof metadataOutputSchema>;\nexport type MatchFilter = z.infer<typeof matchFilterSchema>;\n\nexport type SetFilter = z.infer<typeof setFilterSchema>;\n\nexport type Parameter = z.infer<typeof parameterSchema>;\n\nexport type Query = z.infer<typeof querySchema>;\nexport type QueryOutput = z.infer<typeof queryOutputSchema>;\nexport type QueryRequest = z.infer<typeof queryRequestSchema>;\nexport type QueryParameter = z.infer<typeof queryParameterSchema>;\n\nexport type ReadMetadataRequest = z.infer<typeof readMetadataRequestSchema>;\n\nexport type TableauError = z.infer<typeof tableauErrorSchema>;\n\n// Endpoints & APIs\nconst queryDatasourceEndpoint = makeEndpoint({\n method: 'post',\n path: '/query-datasource',\n alias: 'queryDatasource',\n description: 'Queries a specific data source and returns the resulting data.',\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: queryRequestSchema,\n },\n ],\n response: queryOutputSchema,\n errors: [\n {\n status: 'default',\n schema: tableauErrorSchema,\n },\n {\n status: 404,\n schema: z.any(),\n },\n ],\n});\n\nconst readMetadataEndpoint = makeEndpoint({\n method: 'post',\n path: '/read-metadata',\n alias: 'readMetadata',\n description:\n \"Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.','Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.\",\n requestFormat: 'json',\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: readMetadataRequestSchema,\n },\n ],\n response: metadataOutputSchema,\n errors: [\n {\n status: 404,\n schema: z.any(),\n },\n ],\n});\n\nconst simpleRequestEndpoint = makeEndpoint({\n method: 'get',\n path: '/simple-request',\n alias: 'simpleRequest',\n description: 'Sends a request that can be used for testing or doing a health check.',\n requestFormat: 'json',\n response: z.string(),\n});\n\nconst vizqlDataServiceApi = makeApi([\n queryDatasourceEndpoint,\n readMetadataEndpoint,\n simpleRequestEndpoint,\n]);\n\nexport const vizqlDataServiceApis = [\n ...vizqlDataServiceApi,\n] as const satisfies ZodiosEndpointDefinitions;\n", "import { Zodios } from '@zodios/core';\n\nimport { workbooksApis } from '../apis/workbooksApi.js';\nimport { Credentials } from '../types/credentials.js';\nimport { Pagination } from '../types/pagination.js';\nimport { Workbook } from '../types/workbook.js';\nimport AuthenticatedMethods from './authenticatedMethods.js';\n\n/**\n * Workbooks methods of the Tableau Server REST API\n *\n * @export\n * @class WorkbooksMethods\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm\n */\nexport default class WorkbooksMethods extends AuthenticatedMethods<typeof workbooksApis> {\n constructor(baseUrl: string, creds: Credentials) {\n super(new Zodios(baseUrl, workbooksApis), creds);\n }\n\n /**\n * Returns information about the specified workbook, including information about views and tags.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param {string} workbookId The ID of the workbook to return information for.\n * @param {string} siteId - The Tableau site ID\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbook\n */\n getWorkbook = async ({\n workbookId,\n siteId,\n }: {\n workbookId: string;\n siteId: string;\n }): Promise<Workbook> => {\n return (\n await this._apiClient.getWorkbook({\n params: { siteId, workbookId },\n ...this.authHeader,\n })\n ).workbook;\n };\n\n /**\n * Returns the workbooks on a site.\n *\n * Required scopes: `tableau:content:read`\n *\n * @param siteId - The Tableau site ID\n * @param filter - The filter string to filter workbooks by\n * @param pageSize - The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100.\n * @param pageNumber - The offset for paging. The default is 1.\n * @link https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref_workbooks_and_views.htm#query_workbooks_for_site\n */\n queryWorkbooksForSite = async ({\n siteId,\n filter,\n pageSize,\n pageNumber,\n }: {\n siteId: string;\n filter: string;\n pageSize?: number;\n pageNumber?: number;\n }): Promise<{ pagination: Pagination; workbooks: Workbook[] }> => {\n const response = await this._apiClient.queryWorkbooksForSite({\n params: { siteId },\n queries: { filter, pageSize, pageNumber },\n ...this.authHeader,\n });\n return {\n pagination: response.pagination,\n workbooks: response.workbooks.workbook ?? [],\n };\n };\n}\n", "import { makeApi, makeEndpoint, ZodiosEndpointDefinitions } from '@zodios/core';\nimport { z } from 'zod';\n\nimport { paginationSchema } from '../types/pagination.js';\nimport { workbookSchema } from '../types/workbook.js';\nimport { paginationParameters } from './paginationParameters.js';\n\nconst getWorkbookEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/workbooks/:workbookId',\n alias: 'getWorkbook',\n description:\n 'Returns information about the specified workbook, including information about views and tags.',\n response: z.object({ workbook: workbookSchema }),\n});\n\nconst queryWorkbooksForSiteEndpoint = makeEndpoint({\n method: 'get',\n path: '/sites/:siteId/workbooks',\n alias: 'queryWorkbooksForSite',\n description: 'Returns the workbooks on a site.',\n parameters: [\n ...paginationParameters,\n {\n name: 'siteId',\n type: 'Path',\n schema: z.string(),\n },\n {\n name: 'filter',\n type: 'Query',\n schema: z.string().optional(),\n description:\n 'An expression that lets you specify a subset of workbooks to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions.',\n },\n ],\n response: z.object({\n pagination: paginationSchema,\n workbooks: z.object({\n workbook: z.optional(z.array(workbookSchema)),\n }),\n }),\n});\n\nconst workbooksApi = makeApi([queryWorkbooksForSiteEndpoint, getWorkbookEndpoint]);\n\nexport const workbooksApis = [...workbooksApi] as const satisfies ZodiosEndpointDefinitions;\n", "import { z } from 'zod';\n\nimport { projectSchema } from './project.js';\nimport { viewSchema } from './view.js';\n\nexport const workbookSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional(),\n webpageUrl: z.string().optional(),\n contentUrl: z.string(),\n project: projectSchema.optional(),\n showTabs: z.coerce.boolean(),\n defaultViewId: z.string().optional(),\n tags: z.object({ tag: z.array(z.object({ label: z.string() })).optional() }),\n views: z.optional(\n z.object({\n view: z.array(viewSchema),\n }),\n ),\n});\n\nexport type Workbook = z.infer<typeof workbookSchema>;\n", "import { AuthConfig } from './authConfig.js';\nimport {\n AxiosInterceptor,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n ResponseInterceptor,\n} from './interceptors.js';\nimport {\n AuthenticatedAuthenticationMethods,\n AuthenticationMethods,\n} from './methods/authenticationMethods.js';\nimport ContentExplorationMethods from './methods/contentExplorationMethods.js';\nimport DatasourcesMethods from './methods/datasourcesMethods.js';\nimport MetadataMethods from './methods/metadataMethods.js';\nimport PulseMethods from './methods/pulseMethods.js';\nimport { AuthenticatedServerMethods, ServerMethods } from './methods/serverMethods.js';\nimport ViewsMethods from './methods/viewsMethods.js';\nimport VizqlDataServiceMethods from './methods/vizqlDataServiceMethods.js';\nimport WorkbooksMethods from './methods/workbooksMethods.js';\nimport { Credentials } from './types/credentials.js';\n\n/**\n * Interface for the Tableau REST APIs\n *\n * @export\n * @class RestApi\n */\nexport class RestApi {\n private _creds?: Credentials;\n private readonly _host: string;\n private readonly _baseUrl: string;\n private readonly _baseUrlWithoutVersion: string;\n\n private _authenticationMethods?: AuthenticationMethods;\n private _authenticatedAuthenticationMethods?: AuthenticatedAuthenticationMethods;\n private _authenticatedServerMethods?: AuthenticatedServerMethods;\n private _contentExplorationMethods?: ContentExplorationMethods;\n private _datasourcesMethods?: DatasourcesMethods;\n private _metadataMethods?: MetadataMethods;\n private _pulseMethods?: PulseMethods;\n private _serverMethods?: ServerMethods;\n private _vizqlDataServiceMethods?: VizqlDataServiceMethods;\n private _viewsMethods?: ViewsMethods;\n private _workbooksMethods?: WorkbooksMethods;\n private static _version = '3.24';\n\n private _requestInterceptor?: [RequestInterceptor, ErrorInterceptor?];\n private _responseInterceptor?: [ResponseInterceptor, ErrorInterceptor?];\n\n constructor(\n host: string,\n options?: Partial<{\n requestInterceptor: [RequestInterceptor, ErrorInterceptor?];\n responseInterceptor: [ResponseInterceptor, ErrorInterceptor?];\n }>,\n ) {\n this._host = host;\n this._baseUrl = `${this._host}/api/${RestApi._version}`;\n this._baseUrlWithoutVersion = `${this._host}/api/-`;\n this._requestInterceptor = options?.requestInterceptor;\n this._responseInterceptor = options?.responseInterceptor;\n }\n\n private get creds(): Credentials {\n if (!this._creds) {\n throw new Error('No credentials found. Authenticate by calling signIn() first.');\n }\n\n return this._creds;\n }\n\n get siteId(): string {\n return this.creds.site.id;\n }\n\n private get authenticationMethods(): AuthenticationMethods {\n if (!this._authenticationMethods) {\n this._authenticationMethods = new AuthenticationMethods(this._baseUrl);\n this._addInterceptors(this._baseUrl, this._authenticationMethods.interceptors);\n }\n return this._authenticationMethods;\n }\n\n private get authenticatedAuthenticationMethods(): AuthenticatedAuthenticationMethods {\n if (!this._authenticatedAuthenticationMethods) {\n this._authenticatedAuthenticationMethods = new AuthenticatedAuthenticationMethods(\n this._baseUrl,\n this.creds,\n );\n this._addInterceptors(this._baseUrl, this._authenticatedAuthenticationMethods.interceptors);\n }\n return this._authenticatedAuthenticationMethods;\n }\n\n get authenticatedServerMethods(): AuthenticatedServerMethods {\n if (!this._authenticatedServerMethods) {\n this._authenticatedServerMethods = new AuthenticatedServerMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._authenticatedServerMethods.interceptors);\n }\n return this._authenticatedServerMethods;\n }\n\n get contentExplorationMethods(): ContentExplorationMethods {\n if (!this._contentExplorationMethods) {\n this._contentExplorationMethods = new ContentExplorationMethods(\n this._baseUrlWithoutVersion,\n this.creds,\n );\n this._addInterceptors(\n this._baseUrlWithoutVersion,\n this._contentExplorationMethods.interceptors,\n );\n }\n\n return this._contentExplorationMethods;\n }\n\n get datasourcesMethods(): DatasourcesMethods {\n if (!this._datasourcesMethods) {\n this._datasourcesMethods = new DatasourcesMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._datasourcesMethods.interceptors);\n }\n\n return this._datasourcesMethods;\n }\n\n get metadataMethods(): MetadataMethods {\n if (!this._metadataMethods) {\n const baseUrl = `${this._host}/api/metadata`;\n this._metadataMethods = new MetadataMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._metadataMethods.interceptors);\n }\n\n return this._metadataMethods;\n }\n\n get pulseMethods(): PulseMethods {\n if (!this._pulseMethods) {\n this._pulseMethods = new PulseMethods(this._baseUrlWithoutVersion, this.creds);\n this._addInterceptors(this._baseUrlWithoutVersion, this._pulseMethods.interceptors);\n }\n\n return this._pulseMethods;\n }\n\n get serverMethods(): ServerMethods {\n if (!this._serverMethods) {\n this._serverMethods = new ServerMethods(this._baseUrl);\n this._addInterceptors(this._baseUrl, this._serverMethods.interceptors);\n }\n\n return this._serverMethods;\n }\n\n get vizqlDataServiceMethods(): VizqlDataServiceMethods {\n if (!this._vizqlDataServiceMethods) {\n const baseUrl = `${this._host}/api/v1/vizql-data-service`;\n this._vizqlDataServiceMethods = new VizqlDataServiceMethods(baseUrl, this.creds);\n this._addInterceptors(baseUrl, this._vizqlDataServiceMethods.interceptors);\n }\n\n return this._vizqlDataServiceMethods;\n }\n\n get viewsMethods(): ViewsMethods {\n if (!this._viewsMethods) {\n this._viewsMethods = new ViewsMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._viewsMethods.interceptors);\n }\n\n return this._viewsMethods;\n }\n\n get workbooksMethods(): WorkbooksMethods {\n if (!this._workbooksMethods) {\n this._workbooksMethods = new WorkbooksMethods(this._baseUrl, this.creds);\n this._addInterceptors(this._baseUrl, this._workbooksMethods.interceptors);\n }\n\n return this._workbooksMethods;\n }\n\n signIn = async (authConfig: AuthConfig): Promise<void> => {\n this._creds = await this.authenticationMethods.signIn(authConfig);\n };\n\n signOut = async (): Promise<void> => {\n await this.authenticatedAuthenticationMethods.signOut();\n this._creds = undefined;\n };\n\n setCredentials = (accessToken: string, userId: string): void => {\n const parts = accessToken.split('|');\n if (parts.length < 3) {\n throw new Error('Could not determine site ID. Access token must have 3 parts.');\n }\n\n const siteId = parts[2];\n this._creds = {\n site: {\n id: siteId,\n },\n user: {\n id: userId,\n },\n token: accessToken,\n };\n };\n\n private _addInterceptors = (baseUrl: string, interceptors: AxiosInterceptor): void => {\n interceptors.request.use(\n (config) => {\n this._requestInterceptor?.[0]({\n baseUrl,\n ...getRequestInterceptorConfig(config),\n });\n return config;\n },\n (error) => {\n this._requestInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n\n interceptors.response.use(\n (response) => {\n this._responseInterceptor?.[0]({\n baseUrl,\n ...getResponseInterceptorConfig(response),\n });\n return response;\n },\n (error) => {\n this._responseInterceptor?.[1]?.(error, baseUrl);\n return Promise.reject(error);\n },\n );\n };\n}\n", "import { RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { Config, getConfig } from './config.js';\nimport { log, shouldLogWhenLevelIsAtLeast } from './logging/log.js';\nimport { maskRequest, maskResponse } from './logging/secretMask.js';\nimport {\n AxiosResponseInterceptorConfig,\n ErrorInterceptor,\n getRequestInterceptorConfig,\n getResponseInterceptorConfig,\n RequestInterceptor,\n RequestInterceptorConfig,\n ResponseInterceptor,\n ResponseInterceptorConfig,\n} from './sdks/tableau/interceptors.js';\nimport { RestApi } from './sdks/tableau/restApi.js';\nimport { Server, userAgent } from './server.js';\nimport { TableauAuthInfo } from './server/oauth/schemas.js';\nimport { isAxiosError } from './utils/axios.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\nimport invariant from './utils/invariant.js';\n\ntype JwtScopes =\n | 'tableau:viz_data_service:read'\n | 'tableau:content:read'\n | 'tableau:insight_definitions_metrics:read'\n | 'tableau:insight_metrics:read'\n | 'tableau:metric_subscriptions:read'\n | 'tableau:insights:read'\n | 'tableau:views:download';\n\nconst getNewRestApiInstanceAsync = async (\n config: Config,\n requestId: RequestId,\n server: Server,\n jwtScopes: Set<JwtScopes>,\n authInfo?: TableauAuthInfo,\n): Promise<RestApi> => {\n const tableauServer = config.server || authInfo?.server;\n invariant(tableauServer, 'Tableau server could not be determined');\n\n const restApi = new RestApi(tableauServer, {\n requestInterceptor: [\n getRequestInterceptor(server, requestId),\n getRequestErrorInterceptor(server, requestId),\n ],\n responseInterceptor: [\n getResponseInterceptor(server, requestId),\n getResponseErrorInterceptor(server, requestId),\n ],\n });\n\n if (config.auth === 'pat') {\n await restApi.signIn({\n type: 'pat',\n patName: config.patName,\n patValue: config.patValue,\n siteName: config.siteName,\n });\n } else if (config.auth === 'direct-trust') {\n await restApi.signIn({\n type: 'direct-trust',\n siteName: config.siteName,\n username: getJwtSubClaim(config, authInfo),\n clientId: config.connectedAppClientId,\n secretId: config.connectedAppSecretId,\n secretValue: config.connectedAppSecretValue,\n scopes: jwtScopes,\n additionalPayload: getJwtAdditionalPayload(config, authInfo),\n });\n } else {\n if (!authInfo?.accessToken || !authInfo?.userId) {\n throw new Error('Auth info is required when not signing in first.');\n }\n\n restApi.setCredentials(authInfo.accessToken, authInfo.userId);\n }\n\n return restApi;\n};\n\nexport const useRestApi = async <T>({\n config,\n requestId,\n server,\n callback,\n jwtScopes,\n authInfo,\n}: {\n config: Config;\n requestId: RequestId;\n server: Server;\n jwtScopes: Array<JwtScopes>;\n callback: (restApi: RestApi) => Promise<T>;\n authInfo?: TableauAuthInfo;\n}): Promise<T> => {\n const restApi = await getNewRestApiInstanceAsync(\n config,\n requestId,\n server,\n new Set(jwtScopes),\n authInfo,\n );\n try {\n return await callback(restApi);\n } finally {\n if (config.auth !== 'oauth') {\n // Tableau REST sessions for 'pat' and 'direct-trust' are intentionally ephemeral.\n // Sessions for 'oauth' are not. Signing out would invalidate the session,\n // preventing the access token from being reused for subsequent requests.\n await restApi.signOut();\n }\n }\n};\n\nexport const getRequestInterceptor =\n (server: Server, requestId: RequestId): RequestInterceptor =>\n (request) => {\n request.headers['User-Agent'] = getUserAgent(server);\n logRequest(server, request, requestId);\n return request;\n };\n\nexport const getRequestErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.request) {\n log.error(server, `Request ${requestId} failed with error: ${getExceptionMessage(error)}`, {\n logger: 'rest-api',\n requestId,\n });\n return;\n }\n\n const { request } = error;\n logRequest(\n server,\n {\n baseUrl,\n ...getRequestInterceptorConfig(request),\n },\n requestId,\n );\n };\n\nexport const getResponseInterceptor =\n (server: Server, requestId: RequestId): ResponseInterceptor =>\n (response) => {\n logResponse(server, response, requestId);\n return response;\n };\n\nexport const getResponseErrorInterceptor =\n (server: Server, requestId: RequestId): ErrorInterceptor =>\n (error, baseUrl) => {\n if (!isAxiosError(error) || !error.response) {\n log.error(\n server,\n `Response from request ${requestId} failed with error: ${getExceptionMessage(error)}`,\n { logger: 'rest-api', requestId },\n );\n return;\n }\n\n // The type for the AxiosResponse headers is complex and not directly assignable to that of the Axios response interceptor's.\n const { response } = error as { response: AxiosResponseInterceptorConfig };\n logResponse(\n server,\n {\n baseUrl,\n ...getResponseInterceptorConfig(response),\n },\n requestId,\n );\n };\n\nfunction logRequest(server: Server, request: RequestInterceptorConfig, requestId: RequestId): void {\n const config = getConfig();\n const maskedRequest = config.disableLogMasking ? request : maskRequest(request);\n const url = new URL(maskedRequest.url ?? '', maskedRequest.baseUrl);\n if (request.params && Object.keys(request.params).length > 0) {\n url.search = new URLSearchParams(request.params).toString();\n }\n\n const messageObj = {\n type: 'request',\n requestId,\n method: maskedRequest.method,\n url: url.toString(),\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedRequest.headers,\n data: maskedRequest.data,\n params: maskedRequest.params,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction logResponse(\n server: Server,\n response: ResponseInterceptorConfig,\n requestId: RequestId,\n): void {\n const config = getConfig();\n const maskedResponse = config.disableLogMasking ? response : maskResponse(response);\n const url = new URL(maskedResponse.url ?? '', maskedResponse.baseUrl);\n if (response.request?.params && Object.keys(response.request.params).length > 0) {\n url.search = new URLSearchParams(response.request.params).toString();\n }\n const messageObj = {\n type: 'response',\n requestId,\n url: url.toString(),\n status: maskedResponse.status,\n ...(shouldLogWhenLevelIsAtLeast('debug') && {\n headers: maskedResponse.headers,\n data: maskedResponse.data,\n }),\n } as const;\n\n log.info(server, messageObj, { logger: 'rest-api', requestId });\n}\n\nfunction getUserAgent(server: Server): string {\n const userAgentParts = [userAgent];\n if (server.clientInfo) {\n const { name, version } = server.clientInfo;\n if (name) {\n userAgentParts.push(version ? `(${name} ${version})` : `(${name})`);\n }\n }\n return userAgentParts.join(' ');\n}\n\nfunction getJwtSubClaim(config: Config, authInfo: TableauAuthInfo | undefined): string {\n return config.jwtSubClaim.replaceAll('{OAUTH_USERNAME}', authInfo?.username ?? '');\n}\n\nfunction getJwtAdditionalPayload(\n config: Config,\n authInfo: TableauAuthInfo | undefined,\n): Record<string, unknown> {\n const json = config.jwtAdditionalPayload.replaceAll('{OAUTH_USERNAME}', authInfo?.username ?? '');\n return JSON.parse(json || '{}');\n}\n", "import { z } from 'zod';\n\nimport { requiredString } from '../../utils/requiredString.js';\n\nexport const mcpAuthorizeSchema = z.object({\n client_id: requiredString('client_id'),\n redirect_uri: requiredString('redirect_uri'),\n response_type: requiredString('response_type'),\n code_challenge: requiredString('code_challenge'),\n code_challenge_method: requiredString('code_challenge_method'),\n state: z.string().optional(),\n});\n\nexport const mcpTokenSchema = z\n .discriminatedUnion(\n 'grant_type',\n [\n z.object({\n grant_type: z.literal('authorization_code'),\n code: requiredString('code'),\n redirect_uri: requiredString('redirect_uri'),\n code_verifier: requiredString('code_verifier'),\n }),\n z.object({\n grant_type: z.literal('refresh_token'),\n refresh_token: requiredString('refresh_token'),\n }),\n z.object({\n grant_type: z.literal('client_credentials'),\n }),\n ],\n {\n errorMap: (issue, ctx) => ({\n message:\n issue.code === 'invalid_union_discriminator'\n ? `grant_type must be ${issue.options.map((opt) => `'${String(opt)}'`).join(' | ')}, got '${ctx.data.grant_type}'.`\n : ctx.defaultError,\n }),\n },\n )\n .and(\n z.object({\n // Optional because client/secret pair may be provided in the request body instead of the query string\n client_id: z.string().optional(),\n client_secret: z.string().optional(),\n }),\n )\n .transform((data) => {\n const { client_id, client_secret } = data;\n const clientIdSecretPair = {\n clientId: client_id,\n clientSecret: client_secret,\n };\n\n if (data.grant_type === 'authorization_code') {\n return {\n grantType: data.grant_type,\n code: data.code,\n redirectUri: data.redirect_uri,\n codeVerifier: data.code_verifier,\n ...clientIdSecretPair,\n };\n }\n\n if (data.grant_type === 'refresh_token') {\n return {\n grantType: data.grant_type,\n refreshToken: data.refresh_token,\n ...clientIdSecretPair,\n };\n }\n\n return {\n grantType: data.grant_type,\n ...clientIdSecretPair,\n };\n });\n\nexport const callbackSchema = z.object({\n code: z.string().optional(),\n state: z.string().optional(),\n error: z.string().optional(),\n});\n\nexport const mcpAccessTokenUserOnlySchema = z.object({\n iss: requiredString('iss'),\n aud: requiredString('aud'),\n exp: z.number().int().nonnegative(),\n sub: requiredString('sub'),\n clientId: requiredString('clientId'),\n tableauServer: requiredString('tableauServer'),\n // Optional because there may not be a user associated with the access token, e.g. for client credentials grant type\n tableauUserId: z.string().optional(),\n});\n\nexport const mcpAccessTokenSchema = mcpAccessTokenUserOnlySchema.extend({\n tableauAccessToken: requiredString('tableauAccessToken'),\n tableauRefreshToken: requiredString('tableauRefreshToken'),\n tableauExpiresAt: z.number().int().nonnegative(),\n // Required because it is always available when a user's Tableau access token is available\n tableauUserId: requiredString('tableauUserId'),\n});\n\nexport type McpAccessToken = z.infer<typeof mcpAccessTokenSchema>;\nexport type McpAccessTokenSubOnly = z.infer<typeof mcpAccessTokenUserOnlySchema>;\n\nexport const tableauAuthInfoSchema = z\n .object({\n username: z.string(),\n userId: z.string(),\n server: z.string(),\n accessToken: z.string(),\n refreshToken: z.string(),\n })\n .partial();\n\nexport const cimdMetadataSchema = z.object({\n client_id: z.string(),\n redirect_uris: z.array(z.string().url()).min(1),\n client_name: z.string().optional(),\n logo_uri: z.string().url().optional(),\n client_uri: z.string().url().optional(),\n tos_uri: z.string().url().optional(),\n policy_uri: z.string().url().optional(),\n grant_types: z.array(z.string()).optional(),\n response_types: z.array(z.enum(['code', 'token'])).optional(),\n post_logout_redirect_uris: z.array(z.string().url()).optional(),\n scope: z.string().default('read').optional(),\n token_endpoint_auth_method: z\n .enum(['none', 'client_secret_basic', 'client_secret_post'])\n .optional(),\n});\n\nexport type TableauAuthInfo = z.infer<typeof tableauAuthInfoSchema>;\nexport type McpAuthorizeRequest = z.infer<typeof mcpAuthorizeSchema>;\nexport type ClientMetadata = z.infer<typeof cimdMetadataSchema>;\n", "import { z } from 'zod';\n\nexport const requiredString = (property: string): z.ZodString =>\n z\n .string({ message: `${property} is required` })\n .nonempty({ message: `${property} must be non-empty` });\n", "import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\n\nimport { TableauAuthInfo, tableauAuthInfoSchema } from './schemas.js';\n\nexport const getTableauAuthInfo = (authInfo: AuthInfo | undefined): TableauAuthInfo | undefined => {\n if (!authInfo) {\n return;\n }\n\n const tableauAuthInfo = tableauAuthInfoSchema.safeParse(authInfo.extra);\n if (!tableauAuthInfo.success) {\n return;\n }\n\n return tableauAuthInfo.data;\n};\n", "import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { CallToolResult, RequestId, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Result } from 'ts-results-es';\nimport { z, ZodRawShape, ZodTypeAny } from 'zod';\nimport { fromError, isZodErrorLike } from 'zod-validation-error';\n\nimport { getToolLogMessage, log } from '../logging/log.js';\nimport { Server } from '../server.js';\nimport { tableauAuthInfoSchema } from '../server/oauth/schemas.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport { Provider, TypeOrProvider } from '../utils/provider.js';\nimport { ToolName } from './toolName.js';\n\ntype ArgsValidator<Args extends ZodRawShape | undefined = undefined> = Args extends ZodRawShape\n ? (args: z.objectOutputType<Args, ZodTypeAny>) => void\n : never;\n\nexport type ConstrainedResult<T> =\n | {\n type: 'success';\n result: T;\n }\n | {\n type: 'empty';\n message: string;\n }\n | {\n type: 'error';\n message: string;\n };\n\n/**\n * The parameters for creating a tool instance\n *\n * @typeParam Args - The schema of the tool's parameters\n */\nexport type ToolParams<Args extends ZodRawShape | undefined = undefined> = {\n // The MCP server instance\n server: Server;\n\n // The name of the tool\n name: ToolName;\n\n // The description of the tool\n description: TypeOrProvider<string>;\n\n // The schema of the tool's parameters\n paramsSchema: TypeOrProvider<Args>;\n\n // The annotations of the tool\n annotations: TypeOrProvider<ToolAnnotations>;\n\n // A function that validates the tool's arguments provided by the client\n argsValidator?: TypeOrProvider<ArgsValidator<Args>>;\n\n // The implementation of the tool itself\n callback: TypeOrProvider<ToolCallback<Args>>;\n};\n\n/**\n * The parameters the logAndExecute method\n *\n * @typeParam T - The type of the result the tool's implementation returns\n * @typeParam E - The type of the error the tool's implementation can return\n * @typeParam Args - The schema of the tool's parameters\n */\ntype LogAndExecuteParams<T, E, Args extends ZodRawShape | undefined = undefined> = {\n // The request ID of the tool call\n requestId: RequestId;\n\n // The Authentication info provided when OAuth is enabled\n authInfo: AuthInfo | undefined;\n\n // The arguments of the tool call\n args: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;\n\n // A function that contains the business logic of the tool to be logged and executed\n callback: () => Promise<Result<T, E | ZodiosError>>;\n\n // A function that can transform a successful result of the callback into a CallToolResult\n getSuccessResult?: (result: T) => CallToolResult;\n\n // A function that can transform an error result of the callback into a string.\n // Required if the callback can return an error result.\n getErrorText?: (error: E) => string;\n\n // A function that constrains the success result of the tool\n constrainSuccessResult: (result: T) => ConstrainedResult<T> | Promise<ConstrainedResult<T>>;\n};\n\n/**\n * Represents an MCP tool\n *\n * @template Args - The schema of the tool's parameters or undefined if the tool has no parameters\n */\nexport class Tool<Args extends ZodRawShape | undefined = undefined> {\n server: Server;\n name: ToolName;\n description: TypeOrProvider<string>;\n paramsSchema: TypeOrProvider<Args>;\n annotations: TypeOrProvider<ToolAnnotations>;\n argsValidator?: TypeOrProvider<ArgsValidator<Args>>;\n callback: TypeOrProvider<ToolCallback<Args>>;\n\n constructor({\n server,\n name,\n description,\n paramsSchema,\n annotations,\n argsValidator,\n callback,\n }: ToolParams<Args>) {\n this.server = server;\n this.name = name;\n this.description = description;\n this.paramsSchema = paramsSchema;\n this.annotations = annotations;\n this.argsValidator = argsValidator;\n this.callback = callback;\n }\n\n logInvocation({\n requestId,\n args,\n username,\n }: {\n requestId: RequestId;\n args: unknown;\n username?: string;\n }): void {\n log.debug(\n this.server,\n getToolLogMessage({\n requestId,\n toolName: this.name,\n args,\n username,\n }),\n );\n }\n\n // Overload for E = undefined (getErrorText omitted)\n async logAndExecute<T>(\n params: Omit<LogAndExecuteParams<T, undefined, Args>, 'getErrorText'>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getSuccessResult omitted)\n async logAndExecute<T, E>(\n params: Required<Omit<LogAndExecuteParams<T, E, Args>, 'getSuccessResult'>>,\n ): Promise<CallToolResult>;\n\n // Overload for E != undefined (getErrorText required)\n async logAndExecute<T, E>(\n params: Required<LogAndExecuteParams<T, E, Args>>,\n ): Promise<CallToolResult>;\n\n // Implementation\n async logAndExecute<T, E>({\n requestId,\n args,\n authInfo,\n callback,\n getSuccessResult,\n getErrorText,\n constrainSuccessResult,\n }: LogAndExecuteParams<T, E, Args>): Promise<CallToolResult> {\n const username = authInfo?.extra\n ? tableauAuthInfoSchema.safeParse(authInfo.extra).data?.username\n : undefined;\n\n this.logInvocation({ requestId, args, username });\n\n if (args) {\n try {\n (await Provider.from(this.argsValidator))?.(args);\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n\n try {\n const result = await callback();\n\n if (result.isOk()) {\n const constrainedResult = await constrainSuccessResult(result.value);\n\n if (constrainedResult.type !== 'success') {\n return {\n isError: constrainedResult.type === 'error',\n content: [{ type: 'text', text: constrainedResult.message }],\n };\n }\n\n if (getSuccessResult) {\n return getSuccessResult(constrainedResult.result);\n }\n\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify(constrainedResult.result),\n },\n ],\n };\n }\n\n if (result.error instanceof ZodiosError) {\n return getErrorResult(requestId, result.error);\n }\n\n if (getErrorText) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: getErrorText(result.error),\n },\n ],\n };\n } else {\n return getErrorResult(requestId, result.error);\n }\n } catch (error) {\n return getErrorResult(requestId, error);\n }\n }\n}\n\nfunction getErrorResult(requestId: RequestId, error: unknown): CallToolResult {\n if (error instanceof ZodiosError && isZodErrorLike(error.cause)) {\n // Schema validation errors on otherwise successful API calls will not return an \"error\" result to the MCP client.\n // We instead return the full response from the API with a data quality warning message\n // that mentions why the schema validation failed.\n // This should make it so users don't get \"stuck\" when our schemas are too strict or wrong.\n // The only con is that the full response from the API might be larger than normal\n // since a successful schema validation \"trims\" the response down to the shape of the schema.\n const validationError = fromError(error.cause);\n return {\n isError: false,\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n data: error.data,\n warning: validationError.toString(),\n }),\n },\n ],\n };\n }\n\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `requestId: ${requestId}, error: ${getExceptionMessage(error)}`,\n },\n ],\n };\n}\n", "export type TypeOrProvider<T> = T | Provider<T>;\n\nexport class Provider<T> {\n private readonly _provider: () => T | Promise<T>;\n\n constructor(provider: () => T | Promise<T>) {\n this._provider = provider;\n }\n\n private get(): T | Promise<T> {\n return this._provider();\n }\n\n static async from(typeOrProvider: undefined): Promise<undefined>;\n static async from<T>(typeOrProvider: TypeOrProvider<T>): Promise<T>;\n static async from<T>(typeOrProvider: TypeOrProvider<T> | undefined): Promise<T | undefined> {\n if (typeOrProvider === undefined) {\n return undefined;\n }\n\n if (typeOrProvider instanceof Provider) {\n const provider = typeOrProvider;\n return await provider.get();\n }\n\n const type = typeOrProvider;\n return type;\n }\n}\n", "import { BoundedContext } from '../../config.js';\nimport {\n OrderBy,\n SearchContentFilter,\n SearchContentResponse,\n} from '../../sdks/tableau/types/contentExploration.js';\nimport { ConstrainedResult } from '../tool.js';\n\nexport type ReducedSearchContentResponse = Partial<Record<SearchItemContent, unknown>>;\n\nexport function buildOrderByString(orderBy: OrderBy): string {\n const methodsUsed = new Set<string>();\n return orderBy\n .flatMap((ordering) => {\n if (methodsUsed.has(ordering.method)) {\n return []; // skip duplicate methods\n }\n methodsUsed.add(ordering.method);\n return ordering.method + (ordering.sortDirection ? `:${ordering.sortDirection}` : '');\n })\n .join(',');\n}\n\nexport function buildFilterString(filter: SearchContentFilter): string {\n const filterExpressions: Array<string> = [];\n if (filter.contentTypes) {\n if (filter.contentTypes.length === 1) {\n filterExpressions.push(`type:eq:${filter.contentTypes[0]}`);\n } else {\n const typesUsed = new Set<string>();\n for (const type of filter.contentTypes) {\n typesUsed.add(type);\n }\n filterExpressions.push(`type:in:[${Array.from(typesUsed).join(',')}]`);\n }\n }\n if (filter.ownerIds) {\n if (filter.ownerIds.length === 1) {\n filterExpressions.push(`ownerId:eq:${filter.ownerIds[0]}`);\n } else {\n const idsUsed = new Set<number>();\n for (const id of filter.ownerIds) {\n idsUsed.add(id);\n }\n filterExpressions.push(`ownerId:in:[${Array.from(idsUsed).join(',')}]`);\n }\n }\n if (filter.modifiedTime) {\n if (Array.isArray(filter.modifiedTime)) {\n if (filter.modifiedTime.length === 1) {\n filterExpressions.push(`modifiedTime:eq:${filter.modifiedTime[0]}`);\n } else {\n const modifiedTimesUsed = new Set<string>();\n for (const modifiedTime of filter.modifiedTime) {\n modifiedTimesUsed.add(modifiedTime);\n }\n filterExpressions.push(`modifiedTime:in:[${Array.from(modifiedTimesUsed).join(',')}]`);\n }\n } else if (filter.modifiedTime.startDate && filter.modifiedTime.endDate) {\n let startDate = filter.modifiedTime.startDate;\n let endDate = filter.modifiedTime.endDate;\n // if the client provides startDate and endDate in the wrong order, we swap them\n if (startDate > endDate) {\n startDate = filter.modifiedTime.endDate;\n endDate = filter.modifiedTime.startDate;\n }\n filterExpressions.push(`modifiedTime:gte:${startDate}`);\n filterExpressions.push(`modifiedTime:lte:${endDate}`);\n } else if (filter.modifiedTime.startDate) {\n filterExpressions.push(`modifiedTime:gte:${filter.modifiedTime.startDate}`);\n } else if (filter.modifiedTime.endDate) {\n filterExpressions.push(`modifiedTime:lte:${filter.modifiedTime.endDate}`);\n }\n }\n\n return filterExpressions.join(',');\n}\n\nexport function reduceSearchContentResponse(\n response: SearchContentResponse,\n): Array<ReducedSearchContentResponse> {\n let searchResults: Array<ReducedSearchContentResponse> = [];\n if (response.items) {\n for (const item of response.items) {\n searchResults.push(getReducedSearchItemContent(item.content));\n }\n }\n\n // Remove duplicate datasources with luid matching a unifieddatasource's datasourceLuid\n const unifiedDatasourceLuids = new Set(\n searchResults\n .filter((item) => item.type === 'unifieddatasource')\n .map((item) => item.datasourceLuid)\n .filter((datasourceLuid): datasourceLuid is string => typeof datasourceLuid === 'string'),\n );\n\n searchResults = searchResults.filter((item) => {\n if (item.type === 'datasource') {\n return typeof item.luid === 'string' && !unifiedDatasourceLuids.has(item.luid);\n }\n\n return true;\n });\n\n // Normalize unifieddatasource entries to datasource entries\n for (const item of searchResults) {\n if (item.type === 'unifieddatasource') {\n item.type = 'datasource';\n item.luid = item.datasourceLuid;\n delete item.datasourceLuid;\n }\n }\n\n return searchResults;\n}\n\ntype SearchItemContent =\n | 'caption'\n | 'comments'\n | 'connectedWorkbooksCount'\n | 'connectionType'\n | 'containerName'\n | 'datasourceIsPublished'\n | 'datasourceLuid'\n | 'downstreamWorkbookCount'\n | 'extractCreationPending'\n | 'extractRefreshedAt'\n | 'extractUpdatedAt'\n | 'favoritesTotal'\n | 'hasActiveDataQualityWarning'\n | 'hasExtracts'\n | 'hasSevereDataQualityWarning'\n | 'hitsSmallSpanTotal'\n | 'hitsTotal'\n | 'isCertified'\n | 'isConnectable'\n | 'locationName'\n | 'luid'\n | 'modifiedTime'\n | 'ownerId'\n | 'ownerName'\n | 'parentWorkbookName'\n | 'projectId'\n | 'projectName'\n | 'sheetType'\n | 'tags'\n | 'title'\n | 'totalViewCount'\n | 'viewCountLastMonth'\n | 'type'\n | 'workbookDescription';\n\nfunction getReducedSearchItemContent(\n content: Record<any, any>,\n): Partial<Record<SearchItemContent, unknown>> {\n const reducedContent: ReducedSearchContentResponse = {};\n if (content.modifiedTime) {\n reducedContent.modifiedTime = content.modifiedTime;\n }\n if (content.sheetType) {\n reducedContent.sheetType = content.sheetType;\n }\n if (content.caption) {\n reducedContent.caption = content.caption;\n }\n if (content.workbookDescription) {\n reducedContent.workbookDescription = content.workbookDescription;\n }\n if (content.type) {\n reducedContent.type = content.type;\n }\n if (content.ownerId) {\n reducedContent.ownerId = content.ownerId;\n }\n if (content.title) {\n reducedContent.title = content.title;\n }\n if (content.ownerName) {\n reducedContent.ownerName = content.ownerName;\n }\n if (content.containerName) {\n if (content.type === 'view') {\n reducedContent.parentWorkbookName = content.containerName;\n } else {\n reducedContent.containerName = content.containerName;\n }\n }\n if (content.luid) {\n reducedContent.luid = content.luid;\n }\n if (content.locationName) {\n reducedContent.locationName = content.locationName;\n }\n if (content.comments?.length) {\n reducedContent.comments = content.comments;\n }\n if (content.hitsTotal != undefined) {\n reducedContent.totalViewCount = content.hitsTotal;\n }\n if (content.favoritesTotal != undefined) {\n reducedContent.favoritesTotal = content.favoritesTotal;\n }\n if (content.tags?.length) {\n reducedContent.tags = content.tags;\n }\n if (content.projectId) {\n reducedContent.projectId = content.projectId;\n }\n if (content.projectName) {\n reducedContent.projectName = content.projectName;\n }\n if (content.hitsSmallSpanTotal != undefined) {\n reducedContent.viewCountLastMonth = content.hitsSmallSpanTotal;\n }\n if (content.downstreamWorkbookCount != undefined) {\n reducedContent.downstreamWorkbookCount = content.downstreamWorkbookCount;\n }\n if (content.isConnectable != undefined) {\n reducedContent.isConnectable = content.isConnectable;\n }\n if (content.datasourceIsPublished != undefined) {\n reducedContent.datasourceIsPublished = content.datasourceIsPublished;\n }\n if (content.connectionType) {\n reducedContent.connectionType = content.connectionType;\n }\n if (content.isCertified != undefined) {\n reducedContent.isCertified = content.isCertified;\n }\n if (content.hasExtracts != undefined) {\n reducedContent.hasExtracts = content.hasExtracts;\n }\n if (content.extractRefreshedAt) {\n reducedContent.extractRefreshedAt = content.extractRefreshedAt;\n }\n if (content.extractUpdatedAt) {\n reducedContent.extractUpdatedAt = content.extractUpdatedAt;\n }\n if (content.connectedWorkbooksCount != undefined) {\n reducedContent.connectedWorkbooksCount = content.connectedWorkbooksCount;\n }\n if (content.extractCreationPending != undefined) {\n reducedContent.extractCreationPending = content.extractCreationPending;\n }\n if (content.hasSevereDataQualityWarning != undefined) {\n reducedContent.hasSevereDataQualityWarning = content.hasSevereDataQualityWarning;\n }\n if (content.datasourceLuid) {\n reducedContent.datasourceLuid = content.datasourceLuid;\n }\n if (content.hasActiveDataQualityWarning != undefined) {\n reducedContent.hasActiveDataQualityWarning = content.hasActiveDataQualityWarning;\n }\n return reducedContent;\n}\n\nexport function constrainSearchContent({\n items,\n boundedContext,\n}: {\n items: Array<ReducedSearchContentResponse>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<ReducedSearchContentResponse>> {\n if (items.length === 0) {\n return {\n type: 'empty',\n message:\n 'No search results were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, datasourceIds, workbookIds } = boundedContext;\n\n if (projectIds) {\n items = items.filter((item) => {\n if (typeof item.projectId === 'number' && projectIds.has(item.projectId.toString())) {\n // \u26A0\uFE0F The Search API returns the project \"id\" (e.g. 861566)\n // but the Project REST APIs return the project \"LUID\" and there is no good way to look up one from the other.\n // Admins who want to use a project filter here will need to provide both the id and LUID in their bounded context.\n return true;\n }\n\n return false;\n });\n }\n\n if (datasourceIds) {\n items = items.filter((item) => {\n if (\n item.type === 'datasource' &&\n typeof item.luid === 'string' &&\n !datasourceIds.has(item.luid)\n ) {\n return false;\n }\n\n return true;\n });\n }\n\n if (workbookIds) {\n items = items.filter((item) => {\n if (\n item.type === 'workbook' &&\n typeof item.luid === 'string' &&\n !workbookIds.has(item.luid)\n ) {\n return false;\n }\n\n return true;\n });\n }\n\n if (items.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed content that can be queried is limited by the server configuration.',\n 'While search results were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: items,\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport {\n combineFields,\n FieldsResult,\n simplifyReadMetadataResult,\n} from './datasourceMetadataUtils.js';\n\nexport const getGraphqlQuery = (datasourceLuid: string): string => `\n query datasourceFieldInfo {\n publishedDatasources(filter: { luid: \"${datasourceLuid}\" }) {\n name\n description\n owner {\n name\n }\n fields {\n name\n isHidden\n description\n descriptionInherited {\n attribute\n value\n }\n fullyQualifiedName\n __typename\n ... on AnalyticsField {\n __typename\n }\n ... on ColumnField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n }\n ... on CalculatedField {\n dataCategory\n role\n dataType\n defaultFormat\n semanticRole\n aggregation\n aggregationParam\n formula\n isAutoGenerated\n hasUserReference\n }\n ... on BinField {\n dataCategory\n role\n dataType\n formula\n binSize\n }\n ... on GroupField {\n dataCategory\n role\n dataType\n hasOther\n }\n ... on CombinedSetField {\n delimiter\n combinationType\n }\n }\n }\n }`;\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n};\n\nexport type GetDatasourceMetadataError =\n | {\n type: 'feature-disabled';\n }\n | {\n type: 'datasource-not-allowed';\n message: string;\n };\n\nexport const getGetDatasourceMetadataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getDatasourceMetadataTool = new Tool({\n server,\n name: 'get-datasource-metadata',\n description: `\n This tool retrieves metadata for a specified datasource by taking the basic, high level, metadata results from Tableau's VizQL Data Service and enriches them with additional context provided by Tableau's Metadata API.\n The metadata provided by this tool consists of the fields and parameters that belong to the datasource.\n Fields will contain properties such as name and dataType, but may also expose richer context such as descriptions, dataCategories, roles, etc.\n This tool should be used for getting the metadata to ground the use of a tool that queries Tableau published data sources.\n `,\n paramsSchema,\n annotations: {\n title: 'Get Datasource Metadata',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateDatasourceLuid,\n callback: async ({ datasourceLuid }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n const query = getGraphqlQuery(datasourceLuid);\n\n return await getDatasourceMetadataTool.logAndExecute<\n FieldsResult,\n GetDatasourceMetadataError\n >({\n requestId,\n authInfo,\n args: { datasourceLuid },\n callback: async () => {\n const isDatasourceAllowedResult = await resourceAccessChecker.isDatasourceAllowed({\n datasourceLuid,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isDatasourceAllowedResult.allowed) {\n return new Err({\n type: 'datasource-not-allowed',\n message: isDatasourceAllowedResult.message,\n });\n }\n\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read', 'tableau:viz_data_service:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n // Fetching metadata from VizQL Data Service API.\n const readMetadataResult = await restApi.vizqlDataServiceMethods.readMetadata({\n datasource: {\n datasourceLuid,\n },\n });\n\n if (readMetadataResult.isErr()) {\n return Err({ type: 'feature-disabled' });\n }\n\n if (config.disableMetadataApiRequests) {\n // Exit early since requests to the Tableau Metadata API are disabled.\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n let listFieldsResult: GraphQLResponse;\n\n try {\n // Fetching metadata from Tableau Metadata API.\n // Using try-catch here since requests could fail if the service is not enabled.\n listFieldsResult = await restApi.metadataMethods.graphql(query);\n } catch {\n return Ok(simplifyReadMetadataResult(readMetadataResult.value));\n }\n\n // Combine the results from the VizQL Data Service API and the Tableau Metadata API.\n return Ok(combineFields(readMetadataResult.value, listFieldsResult));\n },\n });\n },\n constrainSuccessResult: (fields) => {\n return {\n type: 'success',\n result: fields,\n };\n },\n getErrorText: (error: GetDatasourceMetadataError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n case 'datasource-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getDatasourceMetadataTool;\n};\n", "export function getVizqlDataServiceDisabledError(): string {\n return [\n 'The VizQL Data Service is disabled on this Tableau Server.',\n 'To enable it, use TSM using the instructions at https://help.tableau.com/current/server-linux/en-us/cli_configuration-set_tsm.htm#featuresvizqldataservicedeploywithtsm.',\n ].join(' ');\n}\n", "import { RequestId } from '@modelcontextprotocol/sdk/types.js';\n\nimport { BoundedContext, Config, getConfig } from '../config.js';\nimport { useRestApi } from '../restApiInstance.js';\nimport { Workbook } from '../sdks/tableau/types/workbook.js';\nimport { Server } from '../server.js';\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\n\ntype AllowedResult<T = unknown> =\n | { allowed: true; content?: T }\n | { allowed: false; message: string };\n\nexport type RestApiArgs = {\n config: Config;\n requestId: RequestId;\n server: Server;\n};\n\nclass ResourceAccessChecker {\n private _allowedProjectIds: Set<string> | null | undefined;\n private _allowedDatasourceIds: Set<string> | null | undefined;\n private _allowedWorkbookIds: Set<string> | null | undefined;\n\n private readonly _cachedDatasourceIds: Map<string, AllowedResult>;\n private readonly _cachedWorkbookIds: Map<string, AllowedResult<Workbook>>;\n private readonly _cachedViewIds: Map<string, AllowedResult>;\n\n static create(): ResourceAccessChecker {\n return new ResourceAccessChecker();\n }\n\n static createForTesting(boundedContext: BoundedContext): ResourceAccessChecker {\n return new ResourceAccessChecker(boundedContext);\n }\n\n // Optional bounded context to use for testing.\n private constructor(boundedContext?: BoundedContext) {\n // The methods assume these sets are non-empty.\n this._allowedProjectIds = boundedContext?.projectIds;\n this._allowedDatasourceIds = boundedContext?.datasourceIds;\n this._allowedWorkbookIds = boundedContext?.workbookIds;\n\n this._cachedDatasourceIds = new Map();\n this._cachedWorkbookIds = new Map();\n this._cachedViewIds = new Map();\n }\n\n private get allowedProjectIds(): Set<string> | null {\n if (this._allowedProjectIds === undefined) {\n this._allowedProjectIds = getConfig().boundedContext.projectIds;\n }\n\n return this._allowedProjectIds;\n }\n\n private get allowedDatasourceIds(): Set<string> | null {\n if (this._allowedDatasourceIds === undefined) {\n this._allowedDatasourceIds = getConfig().boundedContext.datasourceIds;\n }\n\n return this._allowedDatasourceIds;\n }\n\n private get allowedWorkbookIds(): Set<string> | null {\n if (this._allowedWorkbookIds === undefined) {\n this._allowedWorkbookIds = getConfig().boundedContext.workbookIds;\n }\n\n return this._allowedWorkbookIds;\n }\n\n async isDatasourceAllowed({\n datasourceLuid,\n restApiArgs,\n }: {\n datasourceLuid: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const result = await this._isDatasourceAllowed({\n datasourceLuid,\n restApiArgs,\n });\n\n if (!this.allowedProjectIds) {\n // If project filtering is enabled, we cannot cache the result since the datasource may be moved between projects.\n this._cachedDatasourceIds.set(datasourceLuid, result);\n }\n\n return result;\n }\n\n async isWorkbookAllowed({\n workbookId,\n restApiArgs,\n }: {\n workbookId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult<Workbook>> {\n const result = await this._isWorkbookAllowed({\n workbookId,\n restApiArgs,\n });\n\n if (!this.allowedProjectIds) {\n // If project filtering is enabled, we cannot cache the result since the workbook may be moved between projects.\n this._cachedWorkbookIds.set(workbookId, result);\n }\n\n return result;\n }\n\n async isViewAllowed({\n viewId,\n restApiArgs,\n }: {\n viewId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const result = await this._isViewAllowed({\n viewId,\n restApiArgs,\n });\n\n if (!this.allowedProjectIds) {\n // If project filtering is enabled, we cannot cache the result since the workbook containing the view may be moved between projects.\n this._cachedViewIds.set(viewId, result);\n }\n\n return result;\n }\n\n private async _isDatasourceAllowed({\n datasourceLuid,\n restApiArgs: { config, requestId, server },\n }: {\n datasourceLuid: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const cachedResult = this._cachedDatasourceIds.get(datasourceLuid);\n if (cachedResult) {\n return cachedResult;\n }\n\n if (this.allowedDatasourceIds && !this.allowedDatasourceIds.has(datasourceLuid)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n `Querying the datasource with LUID ${datasourceLuid} is not allowed.`,\n ].join(' '),\n };\n }\n\n if (this.allowedProjectIds) {\n try {\n const datasourceProjectId = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const datasource = await restApi.datasourcesMethods.queryDatasource({\n siteId: restApi.siteId,\n datasourceId: datasourceLuid,\n });\n\n return datasource.project.id;\n },\n });\n\n if (!this.allowedProjectIds.has(datasourceProjectId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n `The datasource with LUID ${datasourceLuid} cannot be queried because it does not belong to an allowed project.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n `An error occurred while checking if the datasource with LUID ${datasourceLuid} is in an allowed project:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n return { allowed: true };\n }\n\n private async _isWorkbookAllowed({\n workbookId,\n restApiArgs: { config, requestId, server },\n }: {\n workbookId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult<Workbook>> {\n const cachedResult = this._cachedWorkbookIds.get(workbookId);\n if (cachedResult) {\n return cachedResult;\n }\n\n if (this.allowedWorkbookIds && !this.allowedWorkbookIds.has(workbookId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `Querying the workbook with LUID ${workbookId} is not allowed.`,\n ].join(' '),\n };\n }\n\n let workbook: Workbook | undefined;\n if (this.allowedProjectIds) {\n try {\n workbook = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const workbook = await restApi.workbooksMethods.getWorkbook({\n siteId: restApi.siteId,\n workbookId,\n });\n\n return workbook;\n },\n });\n\n if (!this.allowedProjectIds.has(workbook.project?.id ?? '')) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `The workbook with LUID ${workbookId} cannot be queried because it does not belong to an allowed project.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `An error occurred while checking if the workbook with LUID ${workbookId} is in an allowed project:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n return { allowed: true, content: workbook };\n }\n\n private async _isViewAllowed({\n viewId,\n restApiArgs: { config, requestId, server },\n }: {\n viewId: string;\n restApiArgs: RestApiArgs;\n }): Promise<AllowedResult> {\n const cachedResult = this._cachedViewIds.get(viewId);\n if (cachedResult) {\n return cachedResult;\n }\n\n let viewWorkbookId = '';\n let viewProjectId = '';\n\n if (this.allowedWorkbookIds) {\n try {\n const view = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n return await restApi.viewsMethods.getView({\n siteId: restApi.siteId,\n viewId,\n });\n },\n });\n\n viewWorkbookId = view.workbook?.id ?? '';\n viewProjectId = view.project?.id ?? '';\n\n if (!this.allowedWorkbookIds.has(viewWorkbookId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `The view with LUID ${viewId} cannot be queried because it does not belong to an allowed workbook.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n `An error occurred while checking if the workbook containing the view with LUID ${viewId} is in an allowed workbook:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n if (this.allowedProjectIds) {\n try {\n viewProjectId =\n viewProjectId ||\n (await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n callback: async (restApi) => {\n const view = await restApi.viewsMethods.getView({\n siteId: restApi.siteId,\n viewId,\n });\n\n return view.project?.id ?? '';\n },\n }));\n\n if (!this.allowedProjectIds.has(viewProjectId)) {\n return {\n allowed: false,\n message: [\n 'The set of allowed views that can be queried is limited by the server configuration.',\n `The view with LUID ${viewId} cannot be queried because it does not belong to an allowed project.`,\n ].join(' '),\n };\n }\n } catch (error) {\n return {\n allowed: false,\n message: [\n 'The set of allowed views that can be queried is limited by the server configuration.',\n `An error occurred while checking if the workbook containing the view with LUID ${viewId} is in an allowed project:`,\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n }\n\n return { allowed: true };\n }\n}\n\nlet resourceAccessChecker = ResourceAccessChecker.create();\nconst exportedForTesting = {\n createResourceAccessChecker: ResourceAccessChecker.createForTesting,\n resetResourceAccessCheckerSingleton: () => {\n resourceAccessChecker = ResourceAccessChecker.create();\n },\n};\n\nexport { exportedForTesting, resourceAccessChecker };\n", "export function validateDatasourceLuid({ datasourceLuid }: { datasourceLuid: string }): void {\n if (!datasourceLuid) {\n throw new Error('datasourceLuid must be a non-empty string.');\n }\n}\n", "import { z } from 'zod';\n\nimport { GraphQLResponse } from '../../sdks/tableau/apis/metadataApi.js';\nimport { MetadataResponse } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\nexport const fieldSchema = z\n .object({\n name: z.string(),\n columnClass: z.string(),\n dataType: z.string().nullable(),\n defaultAggregation: z.string().nullable(),\n description: z.string().nullable(),\n descriptionInherited: z\n .array(z.object({ attribute: z.string(), value: z.string().nullable() }).nullable())\n .nullable(),\n dataCategory: z.string().nullable(),\n role: z.string().nullable(),\n defaultFormat: z.string().nullable(),\n semanticRole: z.string().nullable(),\n aggregation: z.string().nullable(),\n aggregationParam: z.string().nullable(),\n formula: z.string().nullable(),\n isAutoGenerated: z.boolean().nullable(),\n hasUserReference: z.boolean().nullable(),\n binSize: z.number().nullable(),\n })\n .partial();\n\nexport const parameterSchema = z\n .object({\n name: z.string(),\n parameterType: z.string(),\n dataType: z.string().nullable(),\n value: z.union([z.number(), z.string(), z.boolean(), z.null()]),\n members: z.array(z.union([z.number(), z.string(), z.boolean(), z.null()])),\n min: z.number().nullable(),\n max: z.number().nullable(),\n step: z.number().nullable(),\n minDate: z.string().nullable(),\n maxDate: z.string().nullable(),\n periodValue: z.number().nullable(),\n periodType: z.string().nullable(),\n })\n .partial();\n\nexport const fieldsResultSchema = z.object({\n fields: z.array(fieldSchema),\n parameters: z.array(parameterSchema),\n});\n\ntype Parameter = z.infer<typeof parameterSchema>;\ntype Field = z.infer<typeof fieldSchema>;\nexport type FieldsResult = z.infer<typeof fieldsResultSchema>;\n\nexport function simplifyReadMetadataResult(readMetadataResult: MetadataResponse): FieldsResult {\n const simplifiedResponse: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n return simplifiedResponse;\n }\n\n // This is a simplified response that attempts to reduce tokens by\n // only including essential fields and renaming properties.\n for (const field of readMetadataResult.data) {\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n simplifiedResponse.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n simplifiedResponse.parameters.push(toPush);\n }\n }\n\n return simplifiedResponse;\n}\n\nexport function combineFields(\n readMetadataResult: MetadataResponse,\n listFieldsResult: GraphQLResponse,\n): FieldsResult {\n // Create a response object that combines field data from\n // readMetadata (VizQL Data Service API) and listFields (GraphQL Metadata API) results\n // to optimize for LLM accuracy and reduce tokens in response.\n const combinedFields: FieldsResult = {\n fields: [],\n parameters: [],\n };\n\n if (!readMetadataResult.data) {\n if (listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n // fallback to returning listFields results if we don't have any fields from readMetadata.\n for (const field of listFieldsResult.data.publishedDatasources[0].fields) {\n const toPush: Field = { name: field.name };\n if (field.dataType) {\n toPush.dataType = field.dataType;\n }\n if (field.aggregation) {\n toPush.defaultAggregation = field.aggregation;\n }\n populateFieldWithAdditionalProperties(field, toPush);\n combinedFields.fields.push(toPush);\n }\n }\n\n return combinedFields;\n }\n\n // Only include fields from readMetadata results in our response object since only those can be used in queries.\n for (const field of readMetadataResult.data) {\n // only keeping essential field properties.\n const toPush: Field = {\n name: field.fieldCaption,\n dataType: field.dataType,\n columnClass: field.columnClass,\n };\n\n if (field.defaultAggregation) {\n toPush.defaultAggregation = field.defaultAggregation;\n }\n\n if (field.formula) {\n toPush.formula = field.formula;\n }\n\n combinedFields.fields.push(toPush);\n }\n\n // Populate parameters from readMetadata results.\n if (readMetadataResult.extraData?.parameters) {\n for (const parameter of readMetadataResult.extraData.parameters) {\n const toPush: Parameter = {\n name: parameter.parameterCaption,\n parameterType: parameter.parameterType,\n dataType: parameter.dataType,\n value: parameter.value,\n };\n\n if (parameter.parameterType === 'LIST' && parameter.members) {\n toPush.members = parameter.members;\n } else if (parameter.parameterType === 'QUANTITATIVE_DATE') {\n toPush.minDate = parameter.minDate;\n toPush.maxDate = parameter.maxDate;\n toPush.periodValue = parameter.periodValue;\n toPush.periodType = parameter.periodType;\n } else if (parameter.parameterType === 'QUANTITATIVE_RANGE') {\n toPush.min = parameter.min;\n toPush.max = parameter.max;\n toPush.step = parameter.step;\n }\n\n combinedFields.parameters.push(toPush);\n }\n }\n\n if (!listFieldsResult.data.publishedDatasources[0]?.fields.length) {\n return combinedFields;\n }\n\n // Of the fields in our response object, populate them with additional properties we get from listFields results.\n for (const field of combinedFields.fields) {\n const matchingListField = listFieldsResult.data.publishedDatasources[0].fields.find(\n (f) => f.name === field.name,\n );\n if (matchingListField) {\n populateFieldWithAdditionalProperties(matchingListField, field);\n }\n }\n\n return combinedFields;\n}\n\nfunction populateFieldWithAdditionalProperties(sourceField: Field, targetField: Field): void {\n if (sourceField.description) {\n targetField.description = sourceField.description;\n }\n if (sourceField.descriptionInherited?.length) {\n targetField.descriptionInherited = sourceField.descriptionInherited;\n }\n if (sourceField.dataCategory) {\n targetField.dataCategory = sourceField.dataCategory;\n }\n if (sourceField.role) {\n targetField.role = sourceField.role;\n }\n if (sourceField.defaultFormat) {\n targetField.defaultFormat = sourceField.defaultFormat;\n }\n if (sourceField.formula) {\n targetField.formula = sourceField.formula;\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.isAutoGenerated != undefined) {\n targetField.isAutoGenerated = sourceField.isAutoGenerated;\n }\n // Possibly null or undefined, only populate if true or false.\n if (sourceField.hasUserReference != undefined) {\n targetField.hasUserReference = sourceField.hasUserReference;\n }\n }\n // Possibly null or undefined, only populate if defined.\n if (sourceField.binSize != undefined) {\n targetField.binSize = sourceField.binSize;\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { BoundedContext, getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { DataSource } from '../../sdks/tableau/types/dataSource.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { ConstrainedResult, Tool } from '../tool.js';\nimport { parseAndValidateDatasourcesFilterString } from './datasourcesFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListDatasourcesTool = (server: Server): Tool<typeof paramsSchema> => {\n const listDatasourcesTool = new Tool({\n server,\n name: 'list-datasources',\n description: `\n Retrieves a list of published data sources from a specified Tableau site using the Tableau REST API. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Views) for precise and flexible data source discovery. Use this tool when a user requests to list, search, or filter Tableau data sources on a site.\n \n **Supported Filter Fields and Operators**\n | Field | Operators |\n |------------------------|-------------------------------------------|\n | authenticationType | eq, in |\n | connectedWorkbookType | eq, gt, gte, lt, lte |\n | connectionTo | eq, in |\n | connectionType | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | databaseName | eq, in |\n | databaseUserName | eq, in |\n | description | eq, in |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlert | eq |\n | hasEmbeddedPassword | eq |\n | hasExtracts | eq |\n | isCertified | eq |\n | isConnectable | eq |\n | isDefaultPort | eq |\n | isHierarchical | eq |\n | isPublished | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq |\n | ownerName | eq, in |\n | projectName* | eq, in |\n | serverName | eq, in |\n | serverPort | eq |\n | size | eq, gt, gte, lt, lte |\n | tableName | eq, in |\n | tags | eq, in |\n | type | eq |\n | updatedAt | eq, gt, gte, lt, lte |\n \n ${genericFilterDescription}\n \n **Example Usage:**\n - List all data sources on a site\n - List data sources with the name \"Project Views\":\n filter: \"name:eq:Project Views\"\n - List data sources in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List data sources created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List data sources with the name \"Project Views\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Project Views,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"\n `,\n paramsSchema,\n annotations: {\n title: 'List Datasources',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { filter, pageSize, limit },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateDatasourcesFilterString(filter) : undefined;\n return await listDatasourcesTool.logAndExecute({\n requestId,\n authInfo,\n args: { filter, pageSize, limit },\n callback: async () => {\n const datasources = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const datasources = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, datasources: data } =\n await restApi.datasourcesMethods.listDatasources({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return datasources;\n },\n });\n\n return new Ok(datasources);\n },\n constrainSuccessResult: (datasources) =>\n constrainDatasources({ datasources, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return listDatasourcesTool;\n};\n\nexport function constrainDatasources({\n datasources,\n boundedContext,\n}: {\n datasources: Array<DataSource>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<DataSource>> {\n if (datasources.length === 0) {\n return {\n type: 'empty',\n message:\n 'No datasources were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, datasourceIds } = boundedContext;\n if (projectIds) {\n datasources = datasources.filter((datasource) => projectIds.has(datasource.project.id));\n }\n\n if (datasourceIds) {\n datasources = datasources.filter((datasource) => datasourceIds.has(datasource.id));\n }\n\n if (datasources.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed data sources that can be queried is limited by the server configuration.',\n 'While data sources were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: datasources,\n };\n}\n", "import { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { PulseResult } from '../sdks/tableau/methods/pulseMethods.js';\nimport { Pagination, PulsePagination } from '../sdks/tableau/types/pagination.js';\n\nconst pageConfigSchema = z\n .object({\n pageSize: z.coerce.number().gt(0),\n pageNumber: z.coerce.number().gt(0),\n limit: z.coerce.number().gt(0),\n })\n .partial();\n\ntype PageConfig = z.infer<typeof pageConfigSchema>;\n\ntype PaginateArgs<T> = {\n pageConfig: PageConfig;\n getDataFn: (pagination: PageConfig) => Promise<{ pagination: Pagination; data: Array<T> }>;\n};\n\nexport async function paginate<T>({ pageConfig, getDataFn }: PaginateArgs<T>): Promise<Array<T>> {\n const { pageSize, limit } = pageConfigSchema.parse(pageConfig);\n const { pagination, data } = await getDataFn(pageConfig);\n const result = [...data];\n\n let { totalAvailable, pageNumber } = pagination;\n while (totalAvailable > result.length && (!limit || limit > result.length)) {\n const { pagination: nextPagination, data: nextData } = await getDataFn({\n pageSize,\n pageNumber: pageNumber + 1,\n limit,\n });\n\n if (nextData.length === 0) {\n throw new Error(\n `No more data available. Last fetched page number: ${pageNumber}, Total available: ${totalAvailable}, Total fetched: ${result.length}`,\n );\n }\n\n ({ totalAvailable, pageNumber } = nextPagination);\n result.push(...nextData);\n }\n\n if (limit && limit < result.length) {\n result.length = limit;\n }\n\n return result;\n}\n\nconst pulsePaginateConfigSchema = z\n .object({\n limit: z.coerce.number().gt(0).optional(),\n pageSize: z.coerce.number().gt(0).optional(),\n })\n .optional();\n\ntype PulsePaginateConfig = z.infer<typeof pulsePaginateConfigSchema>;\n\ntype PulsePaginateArgs<T> = {\n config: PulsePaginateConfig;\n getDataFn: (\n pageToken?: string,\n pageSize?: number,\n ) => Promise<PulseResult<{ pagination: PulsePagination; data: Array<T> }>>;\n};\n\nexport async function pulsePaginate<T>({\n config,\n getDataFn,\n}: PulsePaginateArgs<T>): Promise<PulseResult<Array<T>>> {\n const validatedConfig = pulsePaginateConfigSchema.parse(config);\n const limit = validatedConfig?.limit;\n let pageSize = validatedConfig?.pageSize;\n\n const result = await getDataFn(undefined, pageSize);\n if (result.isErr()) {\n return result;\n }\n const { pagination, data } = result.value;\n const resultArray = [...data];\n const total_available = pagination.total_available;\n\n let next_page_token = pagination.next_page_token;\n\n // If pageSize is not provided, set it to the minimum of the total available data and the remaining limit\n if (!pageSize && total_available) {\n pageSize = Math.min(\n total_available - resultArray.length,\n limit ? limit - resultArray.length : Number.MAX_SAFE_INTEGER,\n );\n }\n\n while (next_page_token && (!limit || limit > resultArray.length)) {\n const result = await getDataFn(next_page_token, pageSize);\n if (result.isErr()) {\n return result;\n }\n const { pagination: nextPagination, data: nextData } = result.value;\n\n if (nextData.length === 0) {\n throw new Error(`No more data available. Total fetched: ${resultArray.length}`);\n }\n\n ({ next_page_token } = nextPagination);\n resultArray.push(...nextData);\n }\n\n if (limit && limit < resultArray.length) {\n resultArray.length = limit;\n }\n\n return new Ok(resultArray);\n}\n", "export const genericFilterDescription = `**Supported Operators**\n - \\`eq\\`: equals\n - \\`gt\\`: greater than\n - \\`gte\\`: greater than or equal\n - \\`in\\`: any of [list] (for searching tags)\n - \\`lt\\`: less than\n - \\`lte\\`: less than or equal\n \n **Filter Expression Notes**\n - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded.\n - Operators are delimited with colons (:). For example: \\`filter=name:eq:Project Views\\`\n - Field names, operator names, and values are case-sensitive.\n - To filter on multiple fields, combine expressions using a comma: \\`filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher\\`\n - Multiple expressions are combined using a logical AND.\n - If you include the same field multiple times, only the last reference is used.\n - For date-time values, use ISO 8601 format (e.g., \\`2016-05-04T21:24:49Z\\`).\n - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions:\n - Starts with: \\`?filter=name:eq:mark*\\`\n - Ends with: \\`?filter=name:eq:*-ample\\`\n - Contains: \\`?filter=name:eq:mark*ex*\\``;\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\n// === Field and Operator Definitions ===\n// [Tableau REST API Data Sources filter fields](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_filtering_and_sorting.htm#datasources)\n\nconst FilterFieldSchema = z.enum([\n 'authenticationType',\n 'connectedWorkbookType',\n 'connectionTo',\n 'connectionType',\n 'contentUrl',\n 'createdAt',\n 'databaseName',\n 'databaseUserName',\n 'description',\n 'favoritesTotal',\n 'hasAlert',\n 'hasEmbeddedPassword',\n 'hasExtracts',\n 'isCertified',\n 'isConnectable',\n 'isDefaultPort',\n 'isHierarchical',\n 'isPublished',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'serverName',\n 'serverPort',\n 'size',\n 'tableName',\n 'tags',\n 'type',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n authenticationType: ['eq', 'in'],\n connectedWorkbookType: ['eq', 'gt', 'gte', 'lt', 'lte'],\n connectionTo: ['eq', 'in'],\n connectionType: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n databaseName: ['eq', 'in'],\n databaseUserName: ['eq', 'in'],\n description: ['eq', 'in'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlert: ['eq'],\n hasEmbeddedPassword: ['eq'],\n hasExtracts: ['eq'],\n isCertified: ['eq'],\n isConnectable: ['eq'],\n isDefaultPort: ['eq'],\n isHierarchical: ['eq'],\n isPublished: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n serverName: ['eq', 'in'],\n serverPort: ['eq'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tableName: ['eq', 'in'],\n tags: ['eq', 'in'],\n type: ['eq'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateDatasourcesFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import z from 'zod';\n\nexport const FilterOperatorSchema = z.enum(['eq', 'in', 'gt', 'gte', 'lt', 'lte']);\nexport type FilterOperator = z.infer<typeof FilterOperatorSchema>;\n\nexport function isISO8601DateTime(value: string): boolean {\n // Basic ISO 8601 regex (covers most common cases)\n // Example: 2016-05-04T21:24:49Z\n return /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/.test(value);\n}\n\nconst dateTimeFields = ['createdAt', 'updatedAt'];\n\n/**\n * Parses and validates a Tableau-style filter string\n * @param filterString e.g. 'name:eq:Project Views,type:eq:Workbook'\n * @param allowedOperatorsByField - A map of filter fields to allowed operators\n * @param filterFieldSchema - A schema for the filter field\n * @returns validated filter string\n * @throws ZodError or custom error for invalid operators\n */\nexport function parseAndValidateFilterString<\n TFilterField extends string,\n TFilterExpression extends { field: TFilterField; operator: FilterOperator; value: string } = {\n field: TFilterField;\n operator: FilterOperator;\n value: string;\n },\n>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema,\n}: {\n filterString: string;\n allowedOperatorsByField: Record<TFilterField, FilterOperator[]>;\n filterFieldSchema: z.ZodSchema<TFilterField>;\n}): string {\n function isOperatorAllowed(field: TFilterField, operator: FilterOperator): boolean {\n const allowed = allowedOperatorsByField[field];\n return allowed.includes(operator);\n }\n\n const expressions = filterString\n .split(',')\n .map((f) => f.trim())\n .filter(Boolean);\n\n const parsedFilters: Record<string, TFilterExpression> = {};\n\n for (const expr of expressions) {\n const [fieldRaw, operatorRaw, ...valueParts] = expr.split(':');\n if (!fieldRaw || !operatorRaw || valueParts.length === 0) {\n throw new Error(`Invalid filter expression format: \"${expr}\"`);\n }\n\n const value = valueParts.join(':');\n\n const field = filterFieldSchema.parse(fieldRaw);\n const operator = FilterOperatorSchema.parse(operatorRaw);\n\n if (!isOperatorAllowed(field, operator)) {\n throw new Error(\n `Operator '${operator}' is not allowed for field '${field}'. Allowed operators: ${allowedOperatorsByField[field].join(', ')}`,\n );\n }\n\n // Validate ISO 8601 for date-time fields\n if (dateTimeFields.includes(field) && !isISO8601DateTime(value)) {\n throw new Error(\n `Value for field '${field}' must be a valid ISO 8601 date-time string (e.g., 2016-05-04T21:24:49Z)`,\n );\n }\n\n parsedFilters[field] = { field, operator, value } as TFilterExpression;\n }\n\n // Reconstruct the filter string from validated filters\n return Object.values(parsedFilters)\n .map((f) => `${f.field}:${f.operator}:${f.value}`)\n .join(',');\n}\n\nexport const exportedForTesting = {\n FilterOperatorSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err } from 'ts-results-es';\nimport z from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { PulseDisabledError } from '../../../sdks/tableau/methods/pulseMethods.js';\nimport {\n pulseBundleRequestSchema,\n PulseBundleResponse,\n pulseInsightBundleTypeEnum,\n} from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n bundleRequest: pulseBundleRequestSchema,\n bundleType: z.optional(z.enum(pulseInsightBundleTypeEnum)),\n};\n\nexport type GeneratePulseMetricValueInsightBundleError =\n | {\n type: 'feature-disabled';\n reason: PulseDisabledError;\n }\n | {\n type: 'datasource-not-allowed';\n message: string;\n };\n\nexport const getGeneratePulseMetricValueInsightBundleTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const generatePulseMetricValueInsightBundleTool = new Tool({\n server,\n name: 'generate-pulse-metric-value-insight-bundle',\n description: `\nGenerate an insight bundle for the current aggregated value for Pulse Metric using Tableau REST API. You need the full information of the Pulse Metric and Pulse Metric Definition to use this tool.\n\n**Parameters:**\n- \\`bundleRequest\\` (required): The request to generate a bundle for. Most of the information comes from data returned from other tools that retrieve Pulse Metric and Pulse Metric Definition information. When creating the bundleRequest, you will need to set options using the following values:\n - output_format: 'OUTPUT_FORMAT_HTML'\n - time_zone: 'UTC'\n - language: 'LANGUAGE_EN_US'\n - locale: 'LOCALE_EN_US'\n- \\`bundleType\\` (optional): The type of bundle to generate. The default is 'ban'.\n - 'ban' - Return a basic insight bundle with the current aggregated value for the Pulse Metric, period over period change, and the highest ranked insight for each filterable dimension of the metric.\n - 'springboard' - Return a springboard insight bundle with the current value, period over period change, and the highest ranked insight for the metric.\n - 'basic' - Similar to a springboard insight, but data is focused on the dimensions of a metric that are low bandwidth because they have small value sets. It shows the current value, period over period change, and the highest ranked insight for the metric for that data.\n - 'detail' - Shows insights on performance over time of the metric, a summary visualization of metric highs and lows and trends, breakdowns of top contributors for each filterable dimension of the metric, and followup insights based on the top ranked insights not already presented.\n\n**Example Usage:**\n- Generate the default insight bundle for the Pulse metric:\n bundleRequest: {\n bundle_request: {\n version: 1,\n options: {\n output_format: 'OUTPUT_FORMAT_HTML',\n time_zone: 'UTC',\n language: 'LANGUAGE_EN_US',\n locale: 'LOCALE_EN_US',\n },\n input: {\n metadata: {\n name: 'Pulse Metric',\n metric_id: 'CF32DDCC-362B-4869-9487-37DA4D152552',\n definition_id: 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3',\n },\n metric: {\n definition: {\n datasource: {\n id: 'A6FC3C9F-4F40-4906-8DB0-AC70C5FB5A11',\n },\n basic_specification: {\n measure: {\n field: 'Sales',\n aggregation: 'AGGREGATION_SUM', \n },\n time_dimension: {\n field: 'Order Date',\n },\n filters: [],\n },\n is_running_total: false,\n },\n metric_specification: {\n filters: [],\n measurement_period: {\n granularity: 'GRANULARITY_BY_QUARTER',\n range: 'RANGE_LAST_COMPLETE',\n },\n comparison: {\n comparison: 'TIME_COMPARISON_PREVIOUS_PERIOD',\n },\n },\n extension_options: {\n allowed_dimensions: [],\n allowed_granularities: [],\n offset_from_today: 0,\n },\n representation_options: {\n type: 'NUMBER_FORMAT_TYPE_NUMBER',\n number_units: {\n singular_noun: 'unit',\n plural_noun: 'units',\n },\n row_level_id_field: {\n identifier_col: 'Order ID',\n identifier_label: '',\n },\n row_level_entity_names: {\n entity_name_singular: 'Order',\n },\n row_level_name_field: {\n name_col: 'Order Name',\n },\n currency_code: 'CURRENCY_CODE_USD',\n },\n insights_options: {\n show_insights: true,\n settings: [],\n },\n goals: {\n target: {\n value: 100,\n },\n },\n },\n },\n },\n },\n- Generate the ban insight bundle for the Pulse metric:\n bundleType: 'ban',\n bundleRequest: (See default example above)\n- Generate the springboard insight bundle for the Pulse metric:\n bundleType: 'springboard',\n bundleRequest: (See default example above)\n- Generate the basic insight bundle for the Pulse metric:\n bundleType: 'basic',\n bundleRequest: (See default example above)\n- Generate the detail insight bundle for the Pulse metric:\n bundleType: 'detail',\n bundleRequest: (See default example above)\n`,\n paramsSchema,\n annotations: {\n title: 'Generate Pulse Metric Value Insight Bundle',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { bundleRequest, bundleType },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await generatePulseMetricValueInsightBundleTool.logAndExecute<\n PulseBundleResponse,\n GeneratePulseMetricValueInsightBundleError\n >({\n requestId,\n authInfo,\n args: { bundleRequest, bundleType },\n callback: async () => {\n const { datasourceIds } = config.boundedContext;\n if (datasourceIds) {\n const datasourceLuid =\n bundleRequest.bundle_request.input.metric.definition.datasource.id;\n\n if (!datasourceIds.has(datasourceLuid)) {\n return new Err({\n type: 'datasource-not-allowed',\n message: [\n 'The set of allowed metric insights that can be queried is limited by the server configuration.',\n 'Generating the Pulse Metric Value Insight Bundle is not allowed because the definition is derived',\n `from the data source with LUID ${datasourceLuid}, which is not in the allowed set of data sources.`,\n ].join(' '),\n });\n }\n }\n\n const result = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insights:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) =>\n await restApi.pulseMethods.generatePulseMetricValueInsightBundle(\n bundleRequest,\n bundleType ?? 'ban',\n ),\n });\n\n if (result.isErr()) {\n return new Err({\n type: 'feature-disabled',\n reason: result.error,\n });\n }\n\n return result;\n },\n constrainSuccessResult: (insightBundle) => {\n return {\n type: 'success',\n result: insightBundle,\n };\n },\n getErrorText: (error) => {\n switch (error.type) {\n case 'feature-disabled':\n return getPulseDisabledError(error.reason);\n case 'datasource-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return generatePulseMetricValueInsightBundleTool;\n};\n", "import { PulseDisabledError } from '../../sdks/tableau/methods/pulseMethods.js';\n\nexport function getPulseDisabledError(reason: PulseDisabledError): string {\n switch (reason) {\n case 'tableau-server':\n return [\n 'Pulse is not available on Tableau Server.',\n 'Consider disabling the Pulse MCP tools in your client or removing them using the EXCLUDE_TOOLS environment variable.',\n 'To enable Pulse on your Tableau Cloud site, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n case 'pulse-disabled':\n return [\n 'Pulse is disabled on this Tableau Cloud site.',\n 'To enable Pulse, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm.',\n ].join(' ');\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport {\n PulseMetricDefinition,\n pulseMetricDefinitionViewEnum,\n} from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { pulsePaginate } from '../../../utils/paginate.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseDefinitions } from '../constrainPulseDefinitions.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n limit: z.coerce.number().gt(0).optional(),\n pageSize: z.coerce.number().gt(0).optional(),\n};\n\nexport const getListAllPulseMetricDefinitionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listAllPulseMetricDefinitionsTool = new Tool({\n server,\n name: 'list-all-pulse-metric-definitions',\n description: `\nRetrieves a list of all published Pulse Metric Definitions using the Tableau REST API. Use this tool when a user requests to list all Tableau Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n- \\`limit\\` (optional): Maximum number of metric definitions to return. If not specified, all definitions are returned.\n- \\`pageSize\\` (optional): Number of results per page. Controls how many definitions are fetched in each API request during pagination.\n\n**Example Usage:**\n- List all Pulse Metric Definitions on the current site\n- List all Pulse Metric Definitions on the current site with the default view:\n view: 'DEFINITION_VIEW_DEFAULT'\n- List the first 50 Pulse Metric Definitions:\n limit: 50\n- List all Pulse Metric Definitions on the current site with the full view:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List all Pulse Metric Definitions on the current site with the basic view:\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for my Pulse Metric Definitions:\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List All Pulse Metric Definitions',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { view, limit, pageSize },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await listAllPulseMetricDefinitionsTool.logAndExecute({\n requestId,\n authInfo,\n args: { view, limit, pageSize },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const definitions = await pulsePaginate({\n config: {\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n pageSize,\n },\n getDataFn: async (pageToken, pageSize) => {\n const apiResult = await restApi.pulseMethods.listAllPulseMetricDefinitions(\n view,\n pageToken,\n pageSize,\n );\n\n if (apiResult.isOk()) {\n return new Ok({\n pagination: apiResult.value.pagination,\n data: apiResult.value.definitions,\n });\n }\n\n return apiResult;\n },\n });\n return definitions;\n },\n });\n },\n constrainSuccessResult: (definitions: Array<PulseMetricDefinition>) =>\n constrainPulseDefinitions({ definitions, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listAllPulseMetricDefinitionsTool;\n};\n", "import { BoundedContext } from '../../config.js';\nimport { PulseMetricDefinition } from '../../sdks/tableau/types/pulse.js';\nimport { ConstrainedResult } from '../tool.js';\n\nexport function constrainPulseDefinitions({\n boundedContext,\n definitions,\n}: {\n boundedContext: BoundedContext;\n definitions: Array<PulseMetricDefinition>;\n}): ConstrainedResult<Array<PulseMetricDefinition>> {\n if (definitions.length === 0) {\n return {\n type: 'empty',\n message:\n 'No Pulse Metric Definitions were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { datasourceIds } = boundedContext;\n\n if (datasourceIds) {\n definitions = definitions.filter((definition) =>\n datasourceIds.has(definition.specification.datasource.id),\n );\n }\n\n if (definitions.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed Pulse Metric Definitions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Definitions were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: definitions,\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { pulseMetricDefinitionViewEnum } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseDefinitions } from '../constrainPulseDefinitions.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricDefinitionIds: z.array(z.string().length(36)).min(1),\n view: z.optional(z.enum(pulseMetricDefinitionViewEnum)),\n};\n\nexport const getListPulseMetricDefinitionsFromDefinitionIdsTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricDefinitionsFromDefinitionIdsTool = new Tool({\n server,\n name: 'list-pulse-metric-definitions-from-definition-ids',\n description: `\nRetrieves a list of specific Pulse Metric Definitions using the Tableau REST API from a list of metric definition IDs. Use this tool when a user requests information about specific Pulse Metric Definitions on the current site.\n\n**Parameters:**\n- \\`metricDefinitionIds\\` (required): A list of metric definition IDs to retrieve.\n- \\`view\\` (optional): The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.\n - \\`DEFINITION_VIEW_BASIC\\` - Return only the specified metric definition.\n - \\`DEFINITION_VIEW_FULL\\` - Return the metric definition and the specified number of metrics.\n - \\`DEFINITION_VIEW_DEFAULT\\` - Return the metric definition and the default metric.\n\n**Example Usage:**\n- Can you show me details about Pulse Metric Definition with id 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C3'\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3']\n- List Pulse Metric Definitions from a list of metric definition IDs:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4']\n- List these Pulse Metric Definitions with the default view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_DEFAULT'\n- List these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL',\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n- List these Pulse Metric Definitions with the basic view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_BASIC'\n- See all metrics for these Pulse Metric Definitions with the full view:\n metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],\n view: 'DEFINITION_VIEW_FULL'\n In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Definitions from Metric Definition IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { view, metricDefinitionIds },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricDefinitionsFromDefinitionIdsTool.logAndExecute({\n requestId,\n authInfo,\n args: { metricDefinitionIds, view },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricDefinitionsFromMetricDefinitionIds(\n metricDefinitionIds,\n view,\n );\n },\n });\n },\n constrainSuccessResult: (definitions) =>\n constrainPulseDefinitions({ definitions, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricDefinitionsFromDefinitionIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { PulseDisabledError } from '../../../sdks/tableau/methods/pulseMethods.js';\nimport { PulseMetric } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseMetrics } from '../constrainPulseMetrics.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n pulseMetricDefinitionID: z.string().length(36),\n};\n\nexport const getListPulseMetricsFromMetricDefinitionIdTool = (\n server: Server,\n): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricDefinitionIdTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-definition-id',\n description: `\nRetrieves a list of published Pulse Metrics from a Pulse Metric Definition using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a specific Pulse Metric Definition on the current site.\n\n**Parameters:**\n- \\`pulseMetricDefinitionID\\` (required): The ID of the Pulse Metric Definition to list metrics for. It should be the ID of the Pulse Metric Definition, not the name. Example: BBC908D8-29ED-48AB-A78E-ACF8A424C8C3\n\n**Example Usage:**\n- List all Pulse Metrics for this Pulse Metric Definition\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric Definition ID',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { pulseMetricDefinitionID },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricDefinitionIdTool.logAndExecute<\n Array<PulseMetric>,\n PulseDisabledError\n >({\n requestId,\n authInfo,\n args: { pulseMetricDefinitionID },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_definitions_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricDefinitionId(\n pulseMetricDefinitionID,\n );\n },\n });\n },\n constrainSuccessResult: (metrics) =>\n constrainPulseMetrics({ metrics, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricDefinitionIdTool;\n};\n", "import { BoundedContext } from '../../config.js';\nimport { PulseMetric } from '../../sdks/tableau/types/pulse.js';\nimport { ConstrainedResult } from '../tool.js';\n\nexport function constrainPulseMetrics({\n metrics,\n boundedContext,\n}: {\n boundedContext: BoundedContext;\n metrics: Array<PulseMetric>;\n}): ConstrainedResult<Array<PulseMetric>> {\n if (metrics.length === 0) {\n return {\n type: 'empty',\n message:\n 'No Pulse Metrics were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { datasourceIds } = boundedContext;\n\n if (datasourceIds) {\n metrics = metrics.filter((metric) => datasourceIds.has(metric.datasource_luid));\n }\n\n if (metrics.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed Pulse Metrics that can be queried is limited by the server configuration.',\n 'While Pulse Metrics were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: metrics,\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { Tool } from '../../tool.js';\nimport { constrainPulseMetrics } from '../constrainPulseMetrics.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {\n metricIds: z.array(z.string().length(36)),\n};\n\nexport const getListPulseMetricsFromMetricIdsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricsFromMetricIdsTool = new Tool({\n server,\n name: 'list-pulse-metrics-from-metric-ids',\n description: `\nRetrieves a list of published Pulse Metrics from a list of metric IDs using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a list of metric IDs on the current site.\n\n**Parameters:**\n- \\`metricIds\\` (required): The list of Pulse Metric IDs to list metrics for. It should be the list of metric IDs, not the names or metric definition ids. Example: ['CF32DDCC-362B-4869-9487-37DA4D152552', 'CF32DDCC-362B-4869-9487-37DA4D152553']\n - For data in a Pulse Metric Subscription, use the metric_id field.\n\n**Example Usage:**\n- List all Pulse Metrics from a list of Pulse Metric IDs\n\n**Note:**\n- This tool is recommended for use with data in Pulse Metric Subscriptions.\n- 00000000-0000-0000-0000-000000000000 is not a valid datasource id.\n- If you need a valid datasource id, you may need to retrieve the Pulse Metric Definition for the Pulse Metric which should have a valid datasource information.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metrics from Metric IDs',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ metricIds }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricsFromMetricIdsTool.logAndExecute({\n requestId,\n authInfo,\n args: { metricIds },\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_metrics:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricIds(metricIds);\n },\n });\n },\n constrainSuccessResult: (metrics) =>\n constrainPulseMetrics({ metrics, boundedContext: config.boundedContext }),\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricsFromMetricIdsTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nimport { BoundedContext, getConfig } from '../../../config.js';\nimport { useRestApi } from '../../../restApiInstance.js';\nimport { PulseMetricSubscription } from '../../../sdks/tableau/types/pulse.js';\nimport { Server } from '../../../server.js';\nimport { getTableauAuthInfo } from '../../../server/oauth/getTableauAuthInfo.js';\nimport { getExceptionMessage } from '../../../utils/getExceptionMessage.js';\nimport { RestApiArgs } from '../../resourceAccessChecker.js';\nimport { ConstrainedResult, Tool } from '../../tool.js';\nimport { getPulseDisabledError } from '../getPulseDisabledError.js';\n\nconst paramsSchema = {};\n\nexport const getListPulseMetricSubscriptionsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listPulseMetricSubscriptionsTool = new Tool({\n server,\n name: 'list-pulse-metric-subscriptions',\n description: `\nRetrieves a list of published Pulse Metric Subscriptions for the current user using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metric Subscriptions for the current user.\n\n**Example Usage:** \n- List all Pulse Metric Subscriptions for the current user on the current site\n- List all of my Pulse Metric Subscriptions\n\n**Note:**\n- This tool does not directly provide information about Pulse Metric Definitions. If you need to know information about Pulse Metric Defintiions associated with your subscriptions you need to:\n 1. Retrieve Pulse Metrics from the metric ids returned in the Pulse Metric Subscriptions.\n 2. Retrieve Pulse Metric Definitions from the metric definition id returned in the Pulse Metrics.\n`,\n paramsSchema,\n annotations: {\n title: 'List Pulse Metric Subscriptions for Current User',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (_, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n return await listPulseMetricSubscriptionsTool.logAndExecute({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:metric_subscriptions:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricSubscriptionsForCurrentUser();\n },\n });\n },\n constrainSuccessResult: async (subscriptions) => {\n return await constrainPulseMetricSubscriptions({\n subscriptions,\n boundedContext: config.boundedContext,\n restApiArgs: { config, requestId, server },\n });\n },\n getErrorText: getPulseDisabledError,\n });\n },\n });\n\n return listPulseMetricSubscriptionsTool;\n};\n\nexport async function constrainPulseMetricSubscriptions({\n subscriptions,\n boundedContext,\n restApiArgs,\n}: {\n subscriptions: Array<PulseMetricSubscription>;\n boundedContext: BoundedContext;\n restApiArgs: RestApiArgs;\n}): Promise<ConstrainedResult<Array<PulseMetricSubscription>>> {\n if (subscriptions.length === 0) {\n return {\n type: 'empty',\n message:\n 'No Pulse Metric Subscriptions were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { datasourceIds } = boundedContext;\n\n if (!datasourceIds) {\n // No datasource IDs to filter by, return all subscriptions.\n return {\n type: 'success',\n result: subscriptions,\n };\n }\n\n const { config, requestId, server } = restApiArgs;\n try {\n const metricsResult = await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:insight_metrics:read'],\n callback: async (restApi) => {\n return await restApi.pulseMethods.listPulseMetricsFromMetricIds(\n subscriptions.map((subscription) => subscription.metric_id),\n );\n },\n });\n\n if (metricsResult.isErr()) {\n return {\n type: 'error',\n message: [\n 'The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.',\n getExceptionMessage(metricsResult.error),\n ].join(' '),\n };\n }\n\n const allowedMetricIds = new Set(\n metricsResult.value\n .filter((metric) => datasourceIds.has(metric.datasource_luid))\n .map((metric) => metric.id),\n );\n\n subscriptions = subscriptions.filter((subscription) =>\n allowedMetricIds.has(subscription.metric_id),\n );\n\n if (subscriptions.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Subscriptions were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: subscriptions,\n };\n } catch (error) {\n return {\n type: 'error',\n message: [\n 'The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.',\n 'While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.',\n getExceptionMessage(error),\n ].join(' '),\n };\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ZodiosError } from '@zodios/core';\nimport { Err } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport {\n Datasource,\n QueryOutput,\n querySchema,\n TableauError,\n} from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { TableauAuthInfo } from '../../server/oauth/schemas.js';\nimport { getResultForTableauVersion } from '../../utils/isTableauVersionAtLeast.js';\nimport { Provider } from '../../utils/provider.js';\nimport { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\nimport { getDatasourceCredentials } from './datasourceCredentials.js';\nimport { handleQueryDatasourceError } from './queryDatasourceErrorHandler.js';\nimport { validateQuery } from './queryDatasourceValidator.js';\nimport { queryDatasourceToolDescription20253 } from './queryDescription.2025.3.js';\nimport { queryDatasourceToolDescription } from './queryDescription.js';\nimport { validateFilterValues } from './validators/validateFilterValues.js';\nimport { validateQueryAgainstDatasourceMetadata } from './validators/validateQueryAgainstDatasourceMetadata.js';\n\nconst paramsSchema = {\n datasourceLuid: z.string().nonempty(),\n query: querySchema,\n};\n\nexport type QueryDatasourceError =\n | {\n type: 'feature-disabled';\n }\n | {\n type: 'datasource-not-allowed';\n message: string;\n }\n | {\n type: 'query-validation';\n message: string;\n }\n | {\n type: 'tableau-error';\n error: TableauError;\n };\n\nexport const getQueryDatasourceTool = (\n server: Server,\n authInfo?: TableauAuthInfo,\n): Tool<typeof paramsSchema> => {\n const config = getConfig();\n\n const queryDatasourceTool = new Tool({\n server,\n name: 'query-datasource',\n description: new Provider(\n async () =>\n await getResultForTableauVersion({\n server: config.server || authInfo?.server,\n mappings: {\n '2025.3.0': queryDatasourceToolDescription20253,\n default: queryDatasourceToolDescription,\n },\n }),\n ),\n paramsSchema,\n annotations: {\n title: 'Query Datasource',\n readOnlyHint: true,\n openWorldHint: false,\n },\n argsValidator: validateQuery,\n callback: async (\n { datasourceLuid, query },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n return await queryDatasourceTool.logAndExecute<QueryOutput, QueryDatasourceError>({\n requestId,\n authInfo,\n args: { datasourceLuid, query },\n callback: async () => {\n const isDatasourceAllowedResult = await resourceAccessChecker.isDatasourceAllowed({\n datasourceLuid,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isDatasourceAllowedResult.allowed) {\n return new Err({\n type: 'datasource-not-allowed',\n message: isDatasourceAllowedResult.message,\n });\n }\n\n const datasource: Datasource = { datasourceLuid };\n const options = {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n } as const;\n\n const credentials = getDatasourceCredentials(datasourceLuid);\n if (credentials) {\n datasource.connections = credentials;\n }\n\n const queryRequest = {\n datasource,\n query,\n options,\n };\n\n return await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:viz_data_service:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n if (!config.disableQueryDatasourceValidationRequests) {\n // Validate query against metadata\n const metadataValidationResult = await validateQueryAgainstDatasourceMetadata(\n query,\n restApi.vizqlDataServiceMethods,\n datasource,\n );\n\n if (metadataValidationResult.isErr()) {\n const errors = metadataValidationResult.error;\n const errorMessage = errors.map((error) => error.message).join('\\n\\n');\n return new Err({\n type: 'query-validation',\n message: errorMessage,\n });\n }\n\n // Validate filters values for SET and MATCH filters\n const filterValidationResult = await validateFilterValues(\n server,\n query,\n restApi.vizqlDataServiceMethods,\n datasource,\n );\n\n if (filterValidationResult.isErr()) {\n const errors = filterValidationResult.error;\n const errorMessage = errors.map((error) => error.message).join(', ');\n return new Err({\n type: 'query-validation',\n message: errorMessage,\n });\n }\n }\n\n const result = await restApi.vizqlDataServiceMethods.queryDatasource(queryRequest);\n if (result.isErr()) {\n return new Err(\n result.error instanceof ZodiosError\n ? result.error\n : result.error === 'feature-disabled'\n ? { type: 'feature-disabled' }\n : {\n type: 'tableau-error',\n error: result.error,\n },\n );\n }\n return result;\n },\n });\n },\n constrainSuccessResult: (queryOutput) => {\n return {\n type: 'success',\n result: queryOutput,\n };\n },\n getErrorText: (error: QueryDatasourceError) => {\n switch (error.type) {\n case 'feature-disabled':\n return getVizqlDataServiceDisabledError();\n case 'datasource-not-allowed':\n return error.message;\n case 'query-validation':\n return JSON.stringify({\n requestId,\n errorType: 'validation',\n message: error.message,\n });\n case 'tableau-error':\n return JSON.stringify({\n requestId,\n ...handleQueryDatasourceError(error.error),\n });\n }\n },\n });\n },\n });\n\n return queryDatasourceTool;\n};\n", "import { ZodiosError } from '@zodios/core';\nimport { fromError, isZodErrorLike } from 'zod-validation-error';\n\nimport { getConfig } from './config.js';\nimport { RestApi } from './sdks/tableau/restApi.js';\nimport { ProductVersion } from './sdks/tableau/types/serverInfo.js';\nimport { ExpiringMap } from './utils/expiringMap.js';\nimport { getExceptionMessage } from './utils/getExceptionMessage.js';\n\nlet tableauServerVersions: ExpiringMap<string, ProductVersion> | undefined;\n\n/**\n * Get the version of the Tableau Server or Cloud.\n *\n * @param server - The host name of the Tableau Server or Cloud pod.\n * @returns The version of the Tableau Server or Cloud pod.\n */\nexport const getTableauServerVersion = async (server?: string): Promise<ProductVersion> => {\n if (!server) {\n throw new Error('server cannot be empty');\n }\n\n if (!tableauServerVersions) {\n tableauServerVersions = new ExpiringMap<string, ProductVersion>({\n defaultExpirationTimeMs:\n getConfig().tableauServerVersionCheckIntervalInHours * 60 * 60 * 1000,\n });\n }\n\n const serverVersion = tableauServerVersions.get(server);\n if (serverVersion) {\n return serverVersion;\n }\n\n const restApi = new RestApi(server);\n try {\n const serverVersion = (await restApi.serverMethods.getServerInfo()).productVersion;\n tableauServerVersions.set(server, serverVersion);\n return serverVersion;\n } catch (error) {\n const reason =\n error instanceof ZodiosError && isZodErrorLike(error.cause)\n ? fromError(error.cause).toString()\n : getExceptionMessage(error);\n\n throw new Error(`Failed to get server version: ${reason}`);\n }\n};\n", "export class ExpiringMap<K, V> extends Map<K, V> {\n private timeouts: Map<K, NodeJS.Timeout>;\n private expirationTimeMs: number;\n\n constructor({ defaultExpirationTimeMs }: { defaultExpirationTimeMs: number }) {\n super();\n\n if (defaultExpirationTimeMs <= 0) {\n throw new Error('Expiration time must be greater than 0');\n }\n\n if (defaultExpirationTimeMs > 2 ** 31 - 1) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\n throw new Error(`Expiration time must be at most ${2 ** 31 - 1}`);\n }\n\n this.timeouts = new Map();\n this.expirationTimeMs = defaultExpirationTimeMs;\n }\n\n get defaultExpirationTimeMs(): number {\n return this.expirationTimeMs;\n }\n\n set = (key: K, value: V, expirationTimeMs = this.expirationTimeMs): this => {\n if (expirationTimeMs <= 0) {\n throw new Error('Expiration time must be greater than 0');\n }\n\n if (expirationTimeMs > 2 ** 31 - 1) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\n throw new Error(`Expiration time must be at most ${2 ** 31 - 1}`);\n }\n\n // Clear any existing timeout for this key\n const currentTimeout = this.timeouts.get(key);\n if (currentTimeout) {\n clearTimeout(currentTimeout);\n }\n\n super.set(key, value);\n\n // Set a timeout to delete the key\n const timeout = setTimeout(() => {\n this.delete(key);\n }, expirationTimeMs);\n\n this.timeouts.set(key, timeout);\n\n return this;\n };\n\n delete = (key: K): boolean => {\n // Clear any existing timeout for this key\n const currentTimeout = this.timeouts.get(key);\n if (currentTimeout) {\n clearTimeout(currentTimeout);\n this.timeouts.delete(key);\n }\n\n return super.delete(key);\n };\n\n clear = (): void => {\n this.timeouts.forEach((timeout) => clearTimeout(timeout));\n this.timeouts.clear();\n super.clear();\n };\n\n [Symbol.dispose](): void {\n // Clean up timeouts when the map is garbage collected\n this.clear();\n }\n}\n", "import { getTableauServerVersion } from '../getTableauServerVersion.js';\nimport { ProductVersion } from '../sdks/tableau/types/serverInfo.js';\n\n// Example 2025.3.0\ntype TableauVersion = `${number}.${number}.${number}`;\n\nexport async function getResultForTableauVersion<T>({\n server,\n mappings,\n}: {\n server: string | undefined;\n mappings: { [minVersion: TableauVersion]: T } & { default: T };\n}): Promise<T> {\n const productVersion = await getTableauServerVersion(server);\n for (const [minVersion, value] of Object.entries(mappings) as Array<[TableauVersion, T]>) {\n if (isTableauVersionAtLeast({ productVersion, minVersion })) {\n return value;\n }\n }\n\n return mappings.default;\n}\n\nfunction isTableauVersionAtLeast({\n productVersion,\n minVersion,\n}: {\n productVersion: ProductVersion;\n minVersion: `${number}.${number}.${number}`;\n}): boolean {\n const { value: versionValue } = productVersion;\n\n if (versionValue === 'main') {\n // Build is from the main branch, so the build version is on the \"build\" attribute and looks like \"main.25.0804.1416\"\n // This is likely an internal dev environment, so we'll assume it's a fresh build and pass the check.\n return true;\n }\n\n const [year, major, minor] = versionValue.split('.').map(Number);\n if ([year, major, minor].some(isNaN)) {\n // The version is in some unknown format, so we'll assume it's a fresh build and pass the check.\n return true;\n }\n\n // Build is from a release branch, so the release version is the value and looks like \"2025.3.0\"\n const [minYear, minMajor, minMinor] = minVersion.split('.').map(Number);\n\n if (\n year > minYear ||\n (year === minYear && major > minMajor) ||\n (year === minYear && major === minMajor && minor >= minMinor)\n ) {\n // Tableau version is newer than the minimum required version\n return true;\n }\n\n // Tableau version is older than the minimum required version\n return false;\n}\n\nexport const exportedForTesting = {\n isTableauVersionAtLeast,\n};\n", "import { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\n\nconst schema = z.record(\n z.string().nonempty(),\n z.array(\n z\n .object({ luid: z.string().optional(), u: z.string().nonempty(), p: z.string().nonempty() })\n .transform(({ luid, u, p }) => ({\n connectionLuid: luid,\n connectionUsername: u,\n connectionPassword: p,\n })),\n ),\n);\n\ntype Connection = {\n connectionLuid: string | undefined;\n connectionUsername: string;\n connectionPassword: string;\n};\n\nlet credentialMap: Map<string, Array<Connection>> | undefined;\nlet initialized = false;\n\nexport const getDatasourceCredentials = (datasourceLuid: string): Array<Connection> | undefined => {\n if (!initialized) {\n initialized = true;\n\n const { datasourceCredentials } = getConfig();\n if (!datasourceCredentials) {\n return;\n }\n\n let obj: any;\n try {\n obj = JSON.parse(datasourceCredentials);\n } catch (e) {\n throw new Error(\n `Invalid datasource credentials format. Could not parse JSON string: ${datasourceCredentials}`,\n { cause: e },\n );\n }\n\n const parsed = schema.parse(obj);\n credentialMap = new Map(Object.entries(parsed));\n }\n\n return credentialMap?.get(datasourceLuid);\n};\n\nexport const exportedForTesting = {\n resetDatasourceCredentials: () => {\n initialized = false;\n credentialMap = undefined;\n },\n};\n", "/* v8 ignore start -- Exhaustive tests have limited value for this file */\n\nimport { TableauError } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\ntype TableauErrorDetail = TableauError & Partial<{ condition: string; details: string }>;\n\n/**\n * Adds additional context to the VizQl Data Service errors.\n *\n * @param {TableauError} error - The error object\n * @returns {*} {TableauErrorDetail} - The error object with additional context\n * @see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_error_codes.html\n */\nexport function handleQueryDatasourceError(error: TableauError): TableauErrorDetail {\n const errorDetail: TableauErrorDetail = {\n ...error,\n };\n\n switch (error.errorCode) {\n case '400000':\n errorDetail.condition = 'Bad request';\n errorDetail.details =\n 'The content of the request body is invalid. Check for missing or incomplete JSON.';\n break;\n case '400800':\n errorDetail.condition = 'Invalid formula for calculation';\n errorDetail.details =\n 'Invalid custom calculation syntax. For help, see https://help.tableau.com/current/pro/desktop/en-us/functions_operators.htm';\n break;\n case '400802':\n errorDetail.condition = 'Invalid API request';\n errorDetail.details = \"The incoming request isn't valid per the OpenAPI specification.\";\n break;\n case '400803':\n errorDetail.condition = 'Validation failed';\n errorDetail.details = \"The incoming request isn't valid per the validation rules.\";\n break;\n case '400804':\n errorDetail.condition = 'Response too large';\n errorDetail.details =\n 'The response value exceeds the limit. You must apply a filter in your request.';\n break;\n case '401001':\n errorDetail.condition = 'Login error';\n errorDetail.details = 'The login failed for the given user.';\n break;\n case '401002':\n errorDetail.condition = 'Invalid authorization credentials';\n errorDetail.details = 'The provided auth token is formatted incorrectly.';\n break;\n case '403157':\n errorDetail.condition = 'Feature disabled';\n errorDetail.details = 'The feature is disabled.';\n break;\n case '403800':\n errorDetail.condition = 'API access permission denied';\n errorDetail.details =\n \"The user doesn't have API Access granted on the given data source. Set the API Access capability for the given data source to Allowed. For help, see https://help.tableau.com/current/online/en-us/permissions_capabilities.htm\";\n break;\n case '404934':\n errorDetail.condition = 'Unknown field';\n errorDetail.details = \"The requested field doesn't exist.\";\n break;\n case '404950':\n errorDetail.condition = 'API endpoint not found';\n errorDetail.details = \"The request endpoint doesn't exist.\";\n break;\n case '408000':\n errorDetail.condition = 'Request timeout';\n errorDetail.details = 'The request timed out.';\n break;\n case '409000':\n errorDetail.condition = 'User already on site';\n errorDetail.details = 'HTTP status conflict.';\n break;\n case '429000':\n errorDetail.condition = 'Too many requests';\n errorDetail.details =\n 'Too many requests in the allotted amount of time. For help, see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_limitations.html#licensing-and-data-transfer';\n break;\n case '500000':\n errorDetail.condition = 'Internal server error';\n errorDetail.details = 'The request could not be completed.';\n break;\n case '500810':\n errorDetail.condition = 'VDS empty table response';\n errorDetail.details = 'The underlying data engine returned empty data value response.';\n break;\n case '500811':\n errorDetail.condition = 'VDS missing table';\n errorDetail.details =\n 'The underlying data engine returned empty metadata associated with response.';\n break;\n case '500812':\n errorDetail.condition = 'Error while processing an error';\n errorDetail.details = 'Internal processing error.';\n break;\n case '501000':\n errorDetail.condition = 'Not implemented';\n errorDetail.details = \"Can't find response from upstream server.\";\n break;\n case '503800':\n errorDetail.condition = 'VDS unavailable';\n errorDetail.details = 'The underlying data engine is unavailable.';\n break;\n case '503801':\n errorDetail.condition = 'VDS discovery error';\n errorDetail.details = \"The upstream service can't be found.\";\n break;\n case '504000':\n errorDetail.condition = 'Gateway timeout';\n errorDetail.details = 'The upstream service response timed out.';\n break;\n }\n\n return errorDetail;\n}\n/* v8 ignore stop */\n", "import { Field, FilterField } from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';\n\nexport function validateFields(fields: Field[]): void {\n {\n // You must query at least one field.\n if (fields.length === 0) {\n throw new Error(\n 'The query must include at least one field. The fields property cannot be an empty array.',\n );\n }\n }\n\n {\n // Field caption must be a non-empty string.\n if (fields.some(hasEmptyFieldCaption)) {\n throw new Error('The query must not include any fields with an empty fieldCaption.');\n }\n }\n\n {\n // You can't have duplicate sort priorities.\n const sortPriorities = fields.reduce<Record<number, Array<string>>>((acc, field) => {\n if (field.sortPriority === undefined) {\n return acc;\n }\n\n if (!acc[field.sortPriority]) {\n acc[field.sortPriority] = [];\n }\n\n acc[field.sortPriority].push(field.fieldCaption);\n return acc;\n }, {});\n\n const duplicateSortPriorities = Object.entries(sortPriorities).filter(\n ([_, fields]) => fields.length > 1,\n );\n\n if (duplicateSortPriorities.length > 0) {\n const duplicateSortPrioritiesArr = duplicateSortPriorities.reduce<Array<string>>(\n (acc, [priority, fields]) => {\n acc.push(\n `${fields.map((field) => `\"${field}\"`).join(', ')} with a sort priority of ${priority}`,\n );\n return acc;\n },\n [],\n );\n\n throw new Error(\n `The query must not include duplicate sort priorities. The following fields have sort priorities that are duplicated: ${duplicateSortPrioritiesArr.join('. ')}.`,\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n const fieldsWithBothFunctionAndCalculation = fields\n .filter(hasFunctionAndCalculation)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithBothFunctionAndCalculation.length > 0) {\n throw new Error(\n `The query must not include fields that contain both a function and a calculation. The following fields contain both a function and a calculation: ${fieldsWithBothFunctionAndCalculation.join(', ')}.`,\n );\n }\n }\n\n {\n // The maxDecimalPlaces value must be greater or equal to 0.\n const fieldsWithNegativeMaxDecimalPlace = fields\n .filter(hasNegativeMaxDecimalPlace)\n .map((field) => field.fieldCaption);\n\n if (fieldsWithNegativeMaxDecimalPlace.length > 0) {\n throw new Error(\n `The query must not include fields that have a maxDecimalPlaces value that is less than 0. The following fields have a maxDecimalPlaces value that is less than 0: ${fieldsWithNegativeMaxDecimalPlace.join(', ')}.`,\n );\n }\n }\n}\n\nfunction hasEmptyFieldCaption(field: Field): boolean {\n return !field.fieldCaption;\n}\n\nexport function hasFunctionAndCalculation(field: Field | FilterField): boolean {\n return !!('function' in field && field.function && 'calculation' in field && field.calculation);\n}\n\nexport function hasFieldCaptionAndCalculation(field: Field | FilterField): boolean {\n return !!(\n 'fieldCaption' in field &&\n field.fieldCaption &&\n 'calculation' in field &&\n field.calculation\n );\n}\n\nfunction hasNegativeMaxDecimalPlace(field: Field): boolean {\n return field.maxDecimalPlaces !== undefined && field.maxDecimalPlaces < 0;\n}\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport { Filter, FilterField } from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { hasFieldCaptionAndCalculation, hasFunctionAndCalculation } from './validateFields.js';\n\nexport function validateFilters(filters: Filter[] | undefined): void {\n if (!filters) {\n return;\n }\n\n if (filters.some((filter) => !('field' in filter))) {\n throw new Error(\n 'The query must not include filters with invalid fields. The following field errors occurred: The filter must include a field property.',\n );\n }\n\n {\n // You can't have multiple filters for a single field.\n const fieldCounts = filters.reduce<Record<string, number>>((acc, filter) => {\n if (!('fieldCaption' in filter.field)) {\n return acc;\n }\n\n if (!acc[filter.field.fieldCaption]) {\n acc[filter.field.fieldCaption] = 0;\n }\n\n acc[filter.field.fieldCaption]++;\n return acc;\n }, {});\n\n const fieldsWithMultipleFilters = Object.entries(fieldCounts).filter(([_, count]) => count > 1);\n\n if (fieldsWithMultipleFilters.length > 0) {\n throw new Error(\n `The query must not include multiple filters for the following fields: ${fieldsWithMultipleFilters.map(([field]) => field).join(', ')}.`,\n );\n }\n }\n\n {\n // Fields must be valid.\n const filtersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (!('field' in filter)) {\n return acc;\n }\n\n const result = validateFilterField(filter.field);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (filtersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include filters with invalid fields. The following field errors occurred: ${filtersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n\n {\n // Set, Match, and Relative Date filters can't have functions or calculations.\n const setFiltersWithFunctionsOrCalculations = filters.filter((filter) => {\n return (\n ['SET', 'MATCH', 'DATE'].includes(filter.filterType) &&\n (('function' in filter.field && filter.field.function) ||\n ('calculation' in filter.field && filter.field.calculation))\n );\n });\n\n if (setFiltersWithFunctionsOrCalculations.length > 0) {\n throw new Error(\n 'The query must not include Set Filters, Match Filters, or Relative Date Filters with functions or calculations.',\n );\n }\n }\n\n {\n // Set filters\n {\n // Values array can't be empty.\n const setFiltersWithEmptyValues = filters.filter((filter) => {\n return filter.filterType === 'SET' && filter.values.length === 0;\n });\n\n if (setFiltersWithEmptyValues.length > 0) {\n throw new Error('The query must not include Set Filters with an empty values array.');\n }\n }\n }\n\n {\n // Quantitative filters\n {\n // Dates must be valid RFC 3339.\n const quantitativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n if (filter.filterType !== 'QUANTITATIVE_DATE') {\n return false;\n }\n\n switch (filter.quantitativeFilterType) {\n case 'RANGE':\n return isNaN(Date.parse(filter.minDate)) || isNaN(Date.parse(filter.maxDate));\n case 'MIN':\n return isNaN(Date.parse(filter.minDate));\n case 'MAX':\n return isNaN(Date.parse(filter.maxDate));\n }\n });\n\n if (quantitativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n 'The query must not include Quantitative Date Filters with invalid dates. Dates must use the RFC 3339 standard. Example: 2025-03-14',\n );\n }\n }\n }\n\n {\n // Relative Date Filters\n {\n // Dates must be valid RFC 3339.\n const relativeDateFiltersWithInvalidDates = filters.filter((filter) => {\n return (\n filter.filterType === 'DATE' && filter.anchorDate && isNaN(Date.parse(filter.anchorDate))\n );\n });\n\n if (relativeDateFiltersWithInvalidDates.length > 0) {\n throw new Error(\n 'The query must not include Relative Date Filters with invalid anchor dates. Anchor dates must use the RFC 3339 standard. Example: 2025-03-14',\n );\n }\n }\n }\n\n {\n // Top N Filters\n {\n // Field to measure must be valid.\n const topNFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'TOP') {\n return acc;\n }\n\n const result = validateFilterField(filter.fieldToMeasure);\n if (result.isErr()) {\n acc.push(result.error);\n }\n\n return acc;\n }, []);\n\n if (topNFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Top N filters with invalid fields. The following field errors occurred: ${topNFiltersWithInvalidFields.join(', ')}`,\n );\n }\n }\n }\n\n {\n // Match Filters\n {\n // You must have at least one of startsWith, endsWith, or contains.\n const matchFiltersWithInvalidFields = filters.reduce<Array<string>>((acc, filter) => {\n if (filter.filterType !== 'MATCH') {\n return acc;\n }\n\n if (!filter.startsWith && !filter.endsWith && !filter.contains) {\n acc.push(\n `The match filter for field \"${filter.field.fieldCaption}\" must include at least one of the following properties: startsWith, endsWith, or contains`,\n );\n }\n\n return acc;\n }, []);\n\n if (matchFiltersWithInvalidFields.length > 0) {\n throw new Error(\n `The query must not include Match Filters with invalid fields. The following field errors occurred: ${matchFiltersWithInvalidFields.join(', ')}.`,\n );\n }\n }\n }\n}\n\nfunction validateFilterField(field: FilterField): Result<void, string> {\n {\n // Field caption must be a non-empty string.\n if (hasEmptyFieldCaption(field)) {\n return new Err('The fieldCaption property must be a non-empty string.');\n }\n }\n\n {\n // Field cannot have a fieldCaption and a Calculation.\n if (hasFieldCaptionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a fieldCaption and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n {\n // A Field cannot contain both a Function and a Calculation.\n if (hasFunctionAndCalculation(field)) {\n const fieldCaption = 'fieldCaption' in field ? `\"${field.fieldCaption}\" ` : '';\n return new Err(\n `The field ${fieldCaption} must not contain both a function and a calculation.`.replace(\n ' ',\n ' ',\n ),\n );\n }\n }\n\n return Ok.EMPTY;\n}\n\nfunction hasEmptyFieldCaption(field: FilterField): boolean {\n return 'fieldCaption' in field && !field.fieldCaption;\n}\n", "import { Query, querySchema } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport { validateDatasourceLuid } from '../validateDatasourceLuid.js';\nimport { validateFields } from './validators/validateFields.js';\nimport { validateFilters } from './validators/validateFilters.js';\n\nexport function validateQuery({\n datasourceLuid,\n query,\n}: {\n datasourceLuid: string;\n query: Query;\n}): void {\n validateDatasourceLuid({ datasourceLuid });\n\n const { fields, filters } = query;\n validateFields(fields);\n validateFilters(filters);\n\n const result = querySchema.safeParse(query);\n if (!result.success) {\n throw new Error('The query does not match the expected schema.');\n }\n}\n", "export const queryDatasourceToolDescription20253 = `# Query Tableau Data Source Tool\n\nExecutes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping.\n\n## Prerequisites\nBefore using this tool, you should:\n1. Understand available fields and their types\n2. Understand what parameters are available and their types\n3. Understand the data structure and field relationships\n\n## Best Practices\n\n### Data Volume Management\n- **Always prefer aggregation** - Use aggregated fields (SUM, COUNT, AVG, etc.) instead of raw row-level data to reduce response size\n- **Profile data before querying** - When unsure about data volume, first run a COUNT query to understand the scale:\n \\`\\`\\`json\n {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n }\n \\`\\`\\`\n- **Use TOP filters for rankings** - When users ask for \"top N\" results, use TOP filter type to limit results at the database level\n- **Apply restrictive filters** - Use SET, QUANTITATIVE, or DATE filters to reduce data volume before processing\n- **Avoid row-level queries when possible** - Only retrieve individual records when specifically requested and the business need is clear\n\n### Field Usage Guidelines\n- **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations\n- **Use calculations sparingly** - Only create calculated fields when absolutely necessary and the calculation cannot be achieved through existing fields and aggregations\n- **Use bins for distribution analysis** - Create bins to group continuous data into discrete ranges (e.g., age groups, price ranges)\n- **Validate field availability** - Always check field metadata before constructing queries\n\n### Field Types\n\n#### Dimension Fields\nBasic fields without aggregation:\n\\`\\`\\`json\n{\n \"fieldCaption\": \"Category\",\n \"fieldAlias\": \"Product Category\"\n}\n\\`\\`\\`\n\n#### Measure Fields\nFields with aggregation functions (SUM, AVG, COUNT, etc.):\n\\`\\`\\`json\n{\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\",\n \"maxDecimalPlaces\": 2\n}\n\\`\\`\\`\n\n#### Calculated Fields\nCustom fields defined using Tableau calculation syntax:\n\\`\\`\\`json\n{\n \"fieldCaption\": \"Profit Margin\",\n \"calculation\": \"SUM([Profit]) / SUM([Sales])\",\n \"fieldAlias\": \"Margin %\"\n}\n\\`\\`\\`\n\n#### Bin Fields\nGroup continuous data into discrete ranges:\n\\`\\`\\`json\n{\n \"fieldCaption\": \"Sales\",\n \"binSize\": 1000,\n \"fieldAlias\": \"Sales Range\"\n}\n\\`\\`\\`\nThis creates bins of $1,000 intervals (0-1000, 1000-2000, etc.)\n\n### Query Construction\n- **Group by meaningful dimensions** - Ensure grouping supports the business question being asked\n- **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way\n- **Use appropriate date functions** - Choose the right date aggregation (YEAR, QUARTER, MONTH, WEEK, DAY, or TRUNC_* variants)\n- **Leverage filter capabilities** - Use the extensive filter options to narrow results\n\n## Data Profiling Strategy\n\nWhen a query might return large amounts of data, follow this profiling approach:\n\n**Step 1: Count total records**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Primary_Key_Field\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 2: Count by key dimensions**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Category\",\n \"fieldAlias\": \"Category\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Record Count\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 3: Apply appropriate aggregation or filtering based on counts**\n\n## Parameters\n\nParameters are dynamic values defined in the Tableau datasource that can be used to control calculations, filters, and query behavior. They allow for interactive, user-controlled queries without modifying the query structure.\n\n### When to Use Parameters\n- **Dynamic filtering** - Let users control date ranges, regions, or categories\n- **What-if analysis** - Adjust values like growth rates, targets, or thresholds\n- **Calculation control** - Switch between different metrics or calculation methods\n- **User preferences** - Currency selection, display units, or other settings\n\n### Parameter Types\n- **LIST** - Predefined values (e.g., regions, categories)\n- **ANY_VALUE** - Free-form values matching data type\n- **QUANTITATIVE_RANGE** - Numeric values with optional min/max/step\n- **QUANTITATIVE_DATE** - Date values with optional range constraints\n\n### Usage Example\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [...],\n \"filters\": [...],\n \"parameters\": [\n {\n \"name\": \"Selected Year\",\n \"value\": 2024\n },\n {\n \"name\": \"Currency\",\n \"value\": \"USD\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n- Parameters affect entire query; filters restrict returned data\n\n## Bins\n\nBins group continuous numerical data into discrete ranges, enabling distribution analysis and histogram creation. Unlike parameters and filters, bins are created dynamically in the query.\n\n### Creating Bin Fields\n\nTo create a bin field in a query, you **must** include:\n1. A **measure field** with the base field and aggregation function\n2. A **bin field** with the same fieldCaption and a binSize property\n\n**Example:**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"binSize\": 1000,\n \"fieldAlias\": \"Sales Range\"\n }\n ]\n}\n\\`\\`\\`\n\nThis creates bins of $1,000 intervals (0-1000, 1000-2000, etc.)\n\n### When to Use Bins\n- Analyzing distribution patterns (age groups, price ranges, score brackets)\n- Creating histograms or frequency distributions\n- Grouping continuous numerical data into meaningful categories\n- User asks questions like \"How many customers in each age range?\" or \"What's the distribution of order sizes?\"\n\n### Bin Restrictions\n- **Cannot override existing bin fields** - If a bin field already exists in the datasource, query it without binSize\n- **binSize must be positive** - Only values > 0 are allowed\n- **Measure fields only** - Can only bin numeric/quantitative fields\n- **Choose appropriate bin sizes** - Consider your data range (e.g., bin size 100 for values 0-10,000)\n\n### Querying Existing Bin Fields\n\nIf a bin field already exists in the datasource (e.g., \"Profit (bin)\"), query it as a regular dimension field:\n\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Profit (bin)\"\n },\n {\n \"fieldCaption\": \"Profit\",\n \"function\": \"SUM\"\n }\n ]\n}\n\\`\\`\\`\n\nTo control existing bin field behavior, use parameters if available (e.g., \"Profit Bin Size\").\n\n## Filter Types and Usage\n\n### SET Filters\nFilter by specific values:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Region\"},\n \"filterType\": \"SET\",\n \"values\": [\"North\", \"South\", \"East\"],\n \"exclude\": false\n}\n\\`\\`\\`\n\n### TOP Filters \nGet top/bottom N records by a measure:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n}\n\\`\\`\\`\n\n### QUANTITATIVE Filters\nFilter numeric ranges:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"RANGE\",\n \"min\": 1000,\n \"max\": 50000,\n \"includeNulls\": false\n}\n\\`\\`\\`\n\n### DATE Filters\nFilter relative date periods:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"MONTHS\",\n \"dateRangeType\": \"LAST\"\n}\n\\`\\`\\`\n\n## Example Queries\n\n### Example 1: Data Profiling Before Large Query\n**Question:** \"Show me all customer orders this year\"\n\n**Step 1 - Profile the data volume:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Orders This Year\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n**If count is manageable (< 10,000), proceed with detail query. If large, suggest aggregation:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 2: Top Customers Query (Using TOP Filter)\n**Question:** \"Who are our top 10 customers by revenue?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Revenue\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 3: Time Series with Aggregation\n**Question:** \"What are our monthly sales trends?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"fieldAlias\": \"Month\",\n \"sortDirection\": \"ASC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 4: Filtered Category Analysis\n**Question:** \"What's the performance by product category for high-value orders?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Category\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"AVG\",\n \"fieldAlias\": \"Average Order Value\",\n \"maxDecimalPlaces\": 2\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"MIN\",\n \"min\": 500\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 5: Distribution Analysis Using Bins\n**Question:** \"How are our sales distributed across different price ranges?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Sales\",\n \"binSize\": 1000,\n \"fieldAlias\": \"Sales Range\",\n \"sortDirection\": \"ASC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Number of Orders\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales in Range\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 6: Using Parameters for Dynamic Analysis\n**Question:** \"Show me sales for the selected region and year\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Category\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n }\n ],\n \"parameters\": [\n {\n \"name\": \"Selected Region\",\n \"value\": \"West\"\n },\n {\n \"name\": \"Analysis Year\",\n \"value\": 2024\n }\n ]\n }\n}\n\\`\\`\\`\n\n## Error Prevention and Data Management\n\n**When to profile data first:**\n- User asks for \"all records\" or similar broad requests\n- Query involves high-cardinality fields without filters\n- Request could potentially return row-level data for large tables\n\n**Suggest aggregation when:**\n- Profile queries return very high counts (> 10,000 records)\n- User asks questions that can be answered with summaries\n- Performance or response size might be an issue\n\n**Don't call this tool if:**\n- The requested fields are not available in the data source\n- The question requires data not present in the current data source\n- Field validation shows incompatible field types for the requested operation\n\n**Instead:**\n- Use metadata tools to understand available fields\n- Suggest alternative questions that can be answered with available data\n- Recommend appropriate aggregation levels for the business question`;\n", "export const queryDatasourceToolDescription = `# Query Tableau Data Source Tool\n\nExecutes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping.\n\n## Prerequisites\nBefore using this tool, you should:\n1. Understand available fields and their types\n3. Understand the data structure and field relationships\n\n## Best Practices\n\n### Data Volume Management\n- **Always prefer aggregation** - Use aggregated fields (SUM, COUNT, AVG, etc.) instead of raw row-level data to reduce response size\n- **Profile data before querying** - When unsure about data volume, first run a COUNT query to understand the scale:\n \\`\\`\\`json\n {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n }\n \\`\\`\\`\n- **Use TOP filters for rankings** - When users ask for \"top N\" results, use TOP filter type to limit results at the database level\n- **Apply restrictive filters** - Use SET, QUANTITATIVE, or DATE filters to reduce data volume before processing\n- **Avoid row-level queries when possible** - Only retrieve individual records when specifically requested and the business need is clear\n\n### Field Usage Guidelines\n- **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations\n- **Use calculations sparingly** - Only create calculated fields when absolutely necessary and the calculation cannot be achieved through existing fields and aggregations\n- **Validate field availability** - Always check field metadata before constructing queries\n\n### Query Construction\n- **Group by meaningful dimensions** - Ensure grouping supports the business question being asked\n- **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way\n- **Use appropriate date functions** - Choose the right date aggregation (YEAR, QUARTER, MONTH, WEEK, DAY, or TRUNC_* variants)\n- **Leverage filter capabilities** - Use the extensive filter options to narrow results\n\n## Data Profiling Strategy\n\nWhen a query might return large amounts of data, follow this profiling approach:\n\n**Step 1: Count total records**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Primary_Key_Field\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Records\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 2: Count by key dimensions**\n\\`\\`\\`json\n{\n \"fields\": [\n {\n \"fieldCaption\": \"Category\",\n \"fieldAlias\": \"Category\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Record Count\"\n }\n ]\n}\n\\`\\`\\`\n\n**Step 3: Apply appropriate aggregation or filtering based on counts**\n\n## Filter Types and Usage\n\n### SET Filters\nFilter by specific values:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Region\"},\n \"filterType\": \"SET\",\n \"values\": [\"North\", \"South\", \"East\"],\n \"exclude\": false\n}\n\\`\\`\\`\n\n### TOP Filters \nGet top/bottom N records by a measure:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n}\n\\`\\`\\`\n\n### QUANTITATIVE Filters\nFilter numeric ranges:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"RANGE\",\n \"min\": 1000,\n \"max\": 50000,\n \"includeNulls\": false\n}\n\\`\\`\\`\n\n### DATE Filters\nFilter relative date periods:\n\\`\\`\\`json\n{\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"MONTHS\",\n \"dateRangeType\": \"LAST\"\n}\n\\`\\`\\`\n\n## Example Queries\n\n### Example 1: Data Profiling Before Large Query\n**Question:** \"Show me all customer orders this year\"\n\n**Step 1 - Profile the data volume:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Total Orders This Year\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n**If count is manageable (< 10,000), proceed with detail query. If large, suggest aggregation:**\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Order Date\"},\n \"filterType\": \"DATE\",\n \"periodType\": \"YEARS\",\n \"dateRangeType\": \"CURRENT\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 2: Top Customers Query (Using TOP Filter)\n**Question:** \"Who are our top 10 customers by revenue?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Customer Name\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Revenue\",\n \"sortDirection\": \"DESC\",\n \"sortPriority\": 1\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Customer Name\"},\n \"filterType\": \"TOP\",\n \"howMany\": 10,\n \"direction\": \"TOP\",\n \"fieldToMeasure\": {\"fieldCaption\": \"Sales\", \"function\": \"SUM\"}\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 3: Time Series with Aggregation\n**Question:** \"What are our monthly sales trends?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Order Date\",\n \"function\": \"TRUNC_MONTH\",\n \"fieldAlias\": \"Month\",\n \"sortDirection\": \"ASC\",\n \"sortPriority\": 1\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Monthly Sales\"\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ]\n }\n}\n\\`\\`\\`\n\n### Example 4: Filtered Category Analysis\n**Question:** \"What's the performance by product category for high-value orders?\"\n\n\\`\\`\\`json\n{\n \"datasourceLuid\": \"abc123\",\n \"query\": {\n \"fields\": [\n {\n \"fieldCaption\": \"Category\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"SUM\",\n \"fieldAlias\": \"Total Sales\"\n },\n {\n \"fieldCaption\": \"Sales\",\n \"function\": \"AVG\",\n \"fieldAlias\": \"Average Order Value\",\n \"maxDecimalPlaces\": 2\n },\n {\n \"fieldCaption\": \"Order ID\",\n \"function\": \"COUNT\",\n \"fieldAlias\": \"Order Count\"\n }\n ],\n \"filters\": [\n {\n \"field\": {\"fieldCaption\": \"Sales\"},\n \"filterType\": \"QUANTITATIVE_NUMERICAL\",\n \"quantitativeFilterType\": \"MIN\",\n \"min\": 500\n }\n ]\n }\n}\n\\`\\`\\`\n\n## Error Prevention and Data Management\n\n**When to profile data first:**\n- User asks for \"all records\" or similar broad requests\n- Query involves high-cardinality fields without filters\n- Request could potentially return row-level data for large tables\n\n**Suggest aggregation when:**\n- Profile queries return very high counts (> 10,000 records)\n- User asks questions that can be answered with summaries\n- Performance or response size might be an issue\n\n**Don't call this tool if:**\n- The requested fields are not available in the data source\n- The question requires data not present in the current data source\n- Field validation shows incompatible field types for the requested operation\n\n**Instead:**\n- Use metadata tools to understand available fields\n- Suggest alternative questions that can be answered with available data\n- Recommend appropriate aggregation levels for the business question`;\n", "import levenshtein from 'fast-levenshtein';\nimport { Err, Ok, Result } from 'ts-results-es';\n\nimport { log } from '../../../logging/log.js';\nimport {\n Datasource,\n MatchFilter,\n Query,\n QueryRequest,\n SetFilter,\n} from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport VizqlDataServiceMethods from '../../../sdks/tableau/methods/vizqlDataServiceMethods.js';\nimport { Server } from '../../../server.js';\n\ninterface FilterValidationError {\n field: string;\n invalidValues: string[];\n sampleValues: string[];\n message: string;\n}\n\n/**\n * Validates SET and MATCH filter values by querying the VDS to check if they exist in the target field.\n * Returns fuzzy matched sample values from the field if validation fails.\n */\nexport async function validateFilterValues(\n server: Server,\n query: Query,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: Datasource,\n): Promise<Result<void, FilterValidationError[]>> {\n if (!query.filters) {\n return Ok.EMPTY;\n }\n\n const validationErrors: FilterValidationError[] = [];\n\n // Filter for SET and MATCH filters that need validation\n const filtersToValidate = query.filters.filter(\n (filter) =>\n (filter.filterType === 'SET' || filter.filterType === 'MATCH') &&\n 'fieldCaption' in filter.field &&\n filter.field.fieldCaption,\n ) as Array<MatchFilter | SetFilter>;\n\n if (filtersToValidate.length === 0) {\n return Ok.EMPTY;\n }\n\n // Validate each filter\n for (const filter of filtersToValidate) {\n const fieldCaption = filter.field.fieldCaption;\n\n try {\n if (filter.filterType === 'SET') {\n const result = await validateSetFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n } else if (filter.filterType === 'MATCH') {\n const result = await validateMatchFilter(filter, vizqlDataServiceMethods, datasource);\n if (result.isErr()) {\n validationErrors.push(result.error);\n }\n }\n } catch (error) {\n log.warning(server, `Filter value validation failed for field ${fieldCaption}: ${error}`);\n }\n }\n\n if (validationErrors.length > 0) {\n return new Err(validationErrors);\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a SET filter by checking if all values exist in the target field\n */\nasync function validateSetFilter(\n filter: SetFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: Datasource,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n const filterValues = filter.values.map((v) => String(v));\n\n // Query to get distinct values from the field\n const distinctValuesQuery: Query = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'DistinctValues',\n },\n ],\n };\n\n const queryRequest: QueryRequest = {\n datasource,\n query: distinctValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const existingValues = new Set(\n (data as Record<string, unknown>[]).map((row) =>\n String(row.DistinctValues || row[fieldCaption] || ''),\n ),\n );\n\n // Check which filter values don't exist in the field\n const invalidValues = filterValues.filter((value) => !existingValues.has(value));\n\n if (invalidValues.length > 0) {\n // Use fuzzy matching to find similar values\n const suggestedValues = getFuzzyMatches(\n invalidValues,\n Array.from(existingValues),\n 3, // max edit distance\n 5, // max suggestions\n );\n\n let message = `Filter validation failed for field \"${fieldCaption}\". The following values were not found: ${invalidValues.join(', ')}.`;\n if (suggestedValues.length > 0) {\n message += ` Did you mean: ${suggestedValues.join(', ')}?`;\n }\n message +=\n ' Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.';\n\n return new Err({\n field: fieldCaption,\n invalidValues,\n sampleValues: suggestedValues,\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Validates a MATCH filter by checking if the pattern matches any values in the target field\n */\nasync function validateMatchFilter(\n filter: MatchFilter,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: Datasource,\n): Promise<Result<void, FilterValidationError>> {\n const fieldCaption = filter.field.fieldCaption;\n\n // Query to get a sample of values from the field\n const sampleValuesQuery: Query = {\n fields: [\n {\n fieldCaption: fieldCaption,\n fieldAlias: 'SampleValues',\n },\n ],\n };\n\n const queryRequest: QueryRequest = {\n datasource,\n query: sampleValuesQuery,\n options: {\n returnFormat: 'OBJECTS',\n debug: true,\n disaggregate: false,\n },\n };\n\n const result = await vizqlDataServiceMethods.queryDatasource(queryRequest);\n\n if (result.isErr()) {\n // If we can't query the field, let the original query proceed\n return Ok.EMPTY;\n }\n\n const data = result.value.data || [];\n const fieldValues = (data as Record<string, unknown>[]).map((row: any) =>\n String(row.SampleValues || row[fieldCaption] || ''),\n );\n\n // Check if any values match the pattern\n const hasMatch = fieldValues.some((value) => {\n if (filter.startsWith && !value.startsWith(filter.startsWith)) return false;\n if (filter.endsWith && !value.endsWith(filter.endsWith)) return false;\n if (filter.contains && !value.includes(filter.contains)) return false;\n return true;\n });\n\n if (!hasMatch) {\n const similarValues = new Set<string>();\n\n // Find up to 5 similar values to avoid processing all field values\n for (const value of fieldValues) {\n if (similarValues.size >= 5) break;\n\n const lowerValue = value.toLowerCase();\n\n const fuzzyStartMatch = filter.startsWith\n ? (() => {\n const pattern = filter.startsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const startSlice = lowerValue.slice(0, len);\n return levenshtein.get(pattern, startSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyEndMatch = filter.endsWith\n ? (() => {\n const pattern = filter.endsWith!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n const endSlice = lowerValue.slice(-len);\n return levenshtein.get(pattern, endSlice) <= dynamicDistance;\n })()\n : true;\n\n const fuzzyContainsMatch = filter.contains\n ? (() => {\n const pattern = filter.contains!.toLowerCase();\n const len = pattern.length;\n const dynamicDistance = Math.min(2, Math.floor(len / 2));\n if (lowerValue.length >= len) {\n return Array.from({ length: lowerValue.length - len + 1 }, (_, i) =>\n levenshtein.get(pattern, lowerValue.slice(i, i + len)),\n ).some((dist) => dist <= dynamicDistance);\n } else {\n return levenshtein.get(pattern, lowerValue) <= dynamicDistance;\n }\n })()\n : true;\n\n if (fuzzyStartMatch && fuzzyEndMatch && fuzzyContainsMatch) {\n similarValues.add(value);\n }\n }\n\n const patternDescriptions: Array<string> = [];\n if (filter.startsWith) patternDescriptions.push(`starts with \"${filter.startsWith}\"`);\n if (filter.endsWith) patternDescriptions.push(`ends with \"${filter.endsWith}\"`);\n if (filter.contains) patternDescriptions.push(`contains \"${filter.contains}\"`);\n const similarValuesString =\n similarValues.size > 0\n ? `Similar values in this field: ${Array.from(similarValues).join(', ')}.`\n : '';\n\n const message =\n `Filter validation failed for field \"${fieldCaption}\". ` +\n `No values found that ${patternDescriptions.join(' and ')}. ` +\n `${similarValuesString} ` +\n 'Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.';\n\n return new Err({\n field: fieldCaption,\n invalidValues: patternDescriptions,\n sampleValues: Array.from(similarValues),\n message,\n });\n }\n\n return Ok.EMPTY;\n}\n\n/**\n * Finds the closest matches to invalid filter values using fuzzy matching\n */\nexport function getFuzzyMatches(\n invalidValues: string[],\n existingValues: string[],\n maxDistance: number = 3,\n maxSuggestions: number = 5,\n): string[] {\n const suggestions: Array<{\n invalidValue: string;\n suggestionForInvalidValue: string;\n distance: number;\n }> = [];\n\n for (const existingValue of existingValues) {\n const matches = invalidValues\n .map((invalidValue) => ({\n value: invalidValue,\n distance: levenshtein.get(invalidValue.toLowerCase(), existingValue.toLowerCase()),\n }))\n .filter((match) => match.distance <= maxDistance)\n .sort((a, b) => a.distance - b.distance);\n if (matches.length > 0) {\n const bestMatch = matches[0];\n suggestions.push({\n invalidValue: bestMatch.value,\n suggestionForInvalidValue: existingValue,\n distance: bestMatch.distance,\n });\n }\n }\n\n // now that we have all the suggestions, sort them by distance.\n suggestions.sort((a, b) => a.distance - b.distance);\n\n // pick the best suggestions, but prevent having too many suggestions for the same invalid value.\n const toReturn: Array<string> = [];\n const suggestionLimitPerInvalidValue = Math.ceil(maxSuggestions / invalidValues.length);\n // create and initialize a suggestion counter for each invalid value.\n const invalidValueSuggestionCounter: Map<string, number> = new Map();\n for (const invalidValue of invalidValues) {\n invalidValueSuggestionCounter.set(invalidValue, 0);\n }\n\n for (const { invalidValue, suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n }\n\n if (invalidValueSuggestionCounter.get(invalidValue) === suggestionLimitPerInvalidValue) {\n continue;\n }\n\n toReturn.push(suggestionForInvalidValue);\n invalidValueSuggestionCounter.set(\n invalidValue,\n invalidValueSuggestionCounter.get(invalidValue)! + 1,\n );\n }\n\n // If we don't have enough suggestions, include more suggestions (ignoring the suggestion limit per invalid value).\n for (const { suggestionForInvalidValue } of suggestions) {\n if (toReturn.length === maxSuggestions) {\n break;\n } else if (toReturn.includes(suggestionForInvalidValue)) {\n continue;\n }\n toReturn.push(suggestionForInvalidValue);\n }\n\n return toReturn;\n}\n", "import { Err, Ok, Result } from 'ts-results-es';\n\nimport {\n Datasource,\n DataType,\n MetadataResponse,\n Query,\n QueryParameter,\n} from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';\nimport VizqlDataServiceMethods from '../../../sdks/tableau/methods/vizqlDataServiceMethods.js';\n\nexport type FieldValidationError = {\n field: string;\n message: string;\n};\n\nexport type ParameterValidationError = {\n parameter: string;\n message: string;\n};\n\nexport type QueryValidationError = FieldValidationError | ParameterValidationError;\n\nexport async function validateQueryAgainstDatasourceMetadata(\n query: Query,\n vizqlDataServiceMethods: VizqlDataServiceMethods,\n datasource: Datasource,\n): Promise<Result<void, QueryValidationError[]>> {\n const validationErrors: QueryValidationError[] = [];\n\n try {\n const readMetadataResult = await vizqlDataServiceMethods.readMetadata({\n datasource: {\n datasourceLuid: datasource.datasourceLuid,\n },\n });\n\n if (readMetadataResult.isErr() || !readMetadataResult.value.data) {\n // Failed requests should not block the query from being executed.\n return Ok.EMPTY;\n }\n\n validateFieldsAgainstDatasourceMetadata(\n query.fields,\n readMetadataResult.value,\n validationErrors,\n );\n\n if (query.parameters) {\n validateParametersAgainstDatasourceMetadata(\n query.parameters,\n readMetadataResult.value,\n validationErrors,\n );\n }\n } catch {\n // Failed requests should not block the query from being executed.\n return Ok.EMPTY;\n }\n\n if (validationErrors.length > 0) {\n return new Err(validationErrors);\n }\n\n return Ok.EMPTY;\n}\n\nexport function validateFieldsAgainstDatasourceMetadata(\n fields: Query['fields'],\n datasourceMetadata: MetadataResponse,\n validationErrors: QueryValidationError[],\n): void {\n for (const field of fields) {\n // Validate bin fields.\n if ('binSize' in field) {\n // The bin size property is only for new bin fields created as part of the query, it can not be used to override preexisting bin fields.\n const preexistingBinField = datasourceMetadata.data?.find(\n (f) => f.fieldCaption === field.fieldCaption && f.columnClass === 'BIN',\n );\n\n if (preexistingBinField) {\n validationErrors.push({\n field: field.fieldCaption,\n message: `The bin field '${field.fieldCaption}' has a fixed bin size defined in the datasource and can not be modified. To create a new bin on a field, use the field caption of the measure field you want to group. To use this bin, omit the binSize property.`,\n });\n continue;\n }\n\n // In order to create a new bin field, the query must also have the corresponding measure field.\n const measureField = fields.find(\n (f) => f.fieldCaption === field.fieldCaption && 'function' in f && f.function,\n );\n\n if (!measureField) {\n validationErrors.push({\n field: field.fieldCaption,\n message: `The bin field '${field.fieldCaption}' was provided in the query, but no corresponding measure field was found. To create a new bin on a field, use the field caption of the measure field you want to group.`,\n });\n }\n\n continue;\n }\n\n const matchingField = datasourceMetadata.data?.find(\n (f) => f.fieldCaption === field.fieldCaption,\n );\n\n // Field must exist in the datasource metadata, unless it's a custom calculation.\n if (!matchingField) {\n if (!('calculation' in field)) {\n validationErrors.push({\n field: field.fieldCaption,\n message: `Field '${field.fieldCaption}' was not found in the datasource. Fields must either belong to the datasource or provide a custom calculation.`,\n });\n }\n\n continue;\n } else if ('calculation' in field) {\n if ('formula' in matchingField) {\n validationErrors.push({\n field: field.fieldCaption,\n message: `A custom calculation was provided for field '${field.fieldCaption}', but this field already has a calculation and can not be overwritten. To query this field, omit the calculation property. To create a new calculation, provide a new field caption.`,\n });\n } else {\n validationErrors.push({\n field: field.fieldCaption,\n message: `A custom calculation was provided for field '${field.fieldCaption}', but this field already exists in the datasource. To create a new calculation, provide a new field caption. To query this field, omit the calculation property.`,\n });\n }\n continue;\n }\n\n // For measure fields, validate that the function applied is valid given the field's data type.\n if ('function' in field) {\n switch (matchingField.dataType) {\n case 'INTEGER':\n case 'REAL':\n if (\n !['SUM', 'AVG', 'MEDIAN', 'COUNT', 'COUNTD', 'MIN', 'MAX', 'STDEV', 'VAR'].includes(\n field.function,\n )\n ) {\n validationErrors.push({\n field: field.fieldCaption,\n message: `The '${field.fieldCaption}' field is of type '${matchingField.dataType}'. The '${field.function}' function can not be applied to fields of this data type.`,\n });\n }\n continue;\n case 'STRING':\n case 'BOOLEAN':\n if (!['MIN', 'MAX', 'COUNT', 'COUNTD'].includes(field.function)) {\n validationErrors.push({\n field: field.fieldCaption,\n message: `The '${field.fieldCaption}' field is of type '${matchingField.dataType}'. The '${field.function}' function can not be applied to fields of this data type.`,\n });\n }\n continue;\n case 'DATE':\n case 'DATETIME':\n if (\n ![\n 'MIN',\n 'MAX',\n 'COUNT',\n 'COUNTD',\n 'YEAR',\n 'QUARTER',\n 'MONTH',\n 'WEEK',\n 'DAY',\n 'TRUNC_YEAR',\n 'TRUNC_QUARTER',\n 'TRUNC_MONTH',\n 'TRUNC_WEEK',\n 'TRUNC_DAY',\n ].includes(field.function)\n ) {\n validationErrors.push({\n field: field.fieldCaption,\n message: `The '${field.fieldCaption}' field is of type '${matchingField.dataType}'. The '${field.function}' function can not be applied to fields of this data type.`,\n });\n }\n continue;\n default:\n // Ignore SPATIAL and UNKNOWN data types.\n continue;\n }\n }\n }\n}\n\nexport function validateParametersAgainstDatasourceMetadata(\n parameters: QueryParameter[],\n datasourceMetadata: MetadataResponse,\n validationErrors: QueryValidationError[],\n): void {\n for (const parameter of parameters) {\n const matchingParameter = datasourceMetadata.extraData?.parameters?.find(\n (p) => p.parameterCaption === parameter.parameterCaption,\n );\n\n // Parameters used in the query must exist in the datasource metadata.\n if (!matchingParameter) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' was not found in the datasource. Only parameters that are defined in the datasource can be used in a query.`,\n });\n continue;\n }\n\n // Do validation based on the parameter type.\n switch (matchingParameter.parameterType) {\n case 'ANY_VALUE':\n if (!parameterValueMatchesDataType(parameter.value, matchingParameter.dataType)) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' has '${matchingParameter.dataType}' data type but was provided a value that does not match the data type: ${parameter.value}.`,\n });\n }\n continue;\n case 'LIST':\n if (!matchingParameter.members.includes(parameter.value)) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' has a value that is not in the list of allowed values for the parameter. The list of allowed values is [${matchingParameter.members.join(', ')}].`,\n });\n }\n continue;\n case 'QUANTITATIVE_DATE':\n if (typeof parameter.value !== 'string' || isNaN(Date.parse(parameter.value))) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' was provided a value that is not a valid date. Dates must use the RFC 3339 standard. Example: 2025-03-14`,\n });\n continue;\n }\n if (\n matchingParameter.minDate &&\n new Date(parameter.value) < new Date(matchingParameter.minDate)\n ) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' was provided a value that is less than the minimum allowed date of ${matchingParameter.minDate}.`,\n });\n continue;\n }\n if (\n matchingParameter.maxDate &&\n new Date(parameter.value) > new Date(matchingParameter.maxDate)\n ) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' was provided a value that is greater than the maximum allowed date of ${matchingParameter.maxDate}.`,\n });\n continue;\n }\n continue;\n case 'QUANTITATIVE_RANGE':\n if (typeof parameter.value !== 'number') {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' is a quantitative range parameter, and can only be assigned numerical values.`,\n });\n continue;\n }\n if (matchingParameter.min != undefined && parameter.value < matchingParameter.min) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' was provided a value that is less than the minimum allowed value of ${matchingParameter.min}.`,\n });\n continue;\n }\n if (matchingParameter.max != undefined && parameter.value > matchingParameter.max) {\n validationErrors.push({\n parameter: parameter.parameterCaption,\n message: `Parameter '${parameter.parameterCaption}' was provided a value that is greater than the maximum allowed value of ${matchingParameter.max}.`,\n });\n continue;\n }\n continue;\n default:\n // if more parameter types are added, this method will continue without throwing an error.\n continue;\n }\n }\n}\n\nfunction parameterValueMatchesDataType(\n value: QueryParameter['value'],\n dataType: DataType,\n): boolean {\n if (value === null) {\n return true;\n }\n switch (dataType) {\n case 'INTEGER':\n return typeof value === 'number' && Number.isInteger(value);\n case 'REAL':\n return typeof value === 'number';\n case 'STRING':\n return typeof value === 'string';\n case 'BOOLEAN':\n return typeof value === 'boolean';\n case 'DATE':\n return typeof value === 'string' && !isNaN(Date.parse(value));\n default:\n // unsupported data type\n return false;\n }\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n};\n\nexport type GetViewDataError = {\n type: 'view-not-allowed';\n message: string;\n};\n\nexport const getGetViewDataTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewDataTool = new Tool({\n server,\n name: 'get-view-data',\n description:\n 'Retrieves data in comma separated value (CSV) format for the specified view in a Tableau workbook.',\n paramsSchema,\n annotations: {\n title: 'Get View Data',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ viewId }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewDataTool.logAndExecute<string, GetViewDataError>({\n requestId,\n authInfo,\n args: { viewId },\n callback: async () => {\n const isViewAllowedResult = await resourceAccessChecker.isViewAllowed({\n viewId,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isViewAllowedResult.allowed) {\n return new Err({\n type: 'view-not-allowed',\n message: isViewAllowedResult.message,\n });\n }\n\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewData({\n viewId,\n siteId: restApi.siteId,\n });\n },\n }),\n );\n },\n constrainSuccessResult: (viewData) => {\n return {\n type: 'success',\n result: viewData,\n };\n },\n getErrorText: (error: GetViewDataError) => {\n switch (error.type) {\n case 'view-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getViewDataTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { convertPngDataToToolResult } from '../convertPngDataToToolResult.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n viewId: z.string(),\n width: z.number().gt(0).optional(),\n height: z.number().gt(0).optional(),\n};\n\nexport type GetViewImageError = {\n type: 'view-not-allowed';\n message: string;\n};\n\nexport const getGetViewImageTool = (server: Server): Tool<typeof paramsSchema> => {\n const getViewImageTool = new Tool({\n server,\n name: 'get-view-image',\n description:\n 'Retrieves an image of the specified view in a Tableau workbook. The width and height in pixels can be provided. The default width and height are both 800 pixels.',\n paramsSchema,\n annotations: {\n title: 'Get View Image',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { viewId, width, height },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getViewImageTool.logAndExecute<string, GetViewImageError>({\n requestId,\n authInfo,\n args: { viewId },\n callback: async () => {\n const isViewAllowedResult = await resourceAccessChecker.isViewAllowed({\n viewId,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isViewAllowedResult.allowed) {\n return new Err({\n type: 'view-not-allowed',\n message: isViewAllowedResult.message,\n });\n }\n\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:views:download'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n return await restApi.viewsMethods.queryViewImage({\n viewId,\n siteId: restApi.siteId,\n width,\n height,\n resolution: 'high',\n });\n },\n }),\n );\n },\n constrainSuccessResult: (viewImage) => {\n return {\n type: 'success',\n result: viewImage,\n };\n },\n getSuccessResult: convertPngDataToToolResult,\n getErrorText: (error: GetViewImageError) => {\n switch (error.type) {\n case 'view-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getViewImageTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport function convertPngDataToToolResult(pngData: string): CallToolResult {\n const base64Data = Buffer.from(pngData).toString('base64');\n\n return {\n isError: false,\n content: [\n {\n type: 'image',\n data: base64Data,\n mimeType: 'image/png',\n },\n ],\n };\n}\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { BoundedContext, getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { View } from '../../sdks/tableau/types/view.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { ConstrainedResult, Tool } from '../tool.js';\nimport { parseAndValidateViewsFilterString } from './viewsFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListViewsTool = (server: Server): Tool<typeof paramsSchema> => {\n const listViewsTool = new Tool({\n server,\n name: 'list-views',\n description: `\n Retrieves a list of views on a Tableau site including their metadata such as name, owner, and the workbook they are found in. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Overview) for precise and flexible view discovery. Use this tool when a user requests to list, search, or filter Tableau views on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |---------------------|----------------------|\n | caption | eq, in |\n | contentUrl | eq, in |\n | createdAt | eq, gt, gte, lt, lte |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | fields | eq, in |\n | hitsTotal | eq, gt, gte, lt, lte |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetNumber | eq, gt, gte, lt, lte |\n | sheetType | eq, in |\n | tags | eq, in |\n | title | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n | viewUrlname | eq, in |\n | workbookDescription | eq, in |\n | workbookName | eq, in |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all views on a site\n - List views with the name \"Overview\":\n filter: \"name:eq:Overview\"\n - List views in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List views created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List views with the name \"Overview\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Overview,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Views',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { filter, pageSize, limit },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateViewsFilterString(filter) : undefined;\n\n return await listViewsTool.logAndExecute({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const views = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, views: data } =\n await restApi.viewsMethods.queryViewsForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n includeUsageStatistics: true,\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return views;\n },\n }),\n );\n },\n constrainSuccessResult: (views) =>\n constrainViews({ views, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return listViewsTool;\n};\n\nexport function constrainViews({\n views,\n boundedContext,\n}: {\n views: Array<View>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<View>> {\n if (views.length === 0) {\n return {\n type: 'empty',\n message: 'No views were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, workbookIds } = boundedContext;\n if (projectIds) {\n views = views.filter((view) => (view.project?.id ? projectIds.has(view.project.id) : false));\n }\n\n if (workbookIds) {\n views = views.filter((view) => (view.workbook?.id ? workbookIds.has(view.workbook.id) : false));\n }\n\n if (views.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed views that can be queried is limited by the server configuration.',\n 'While views were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: views,\n };\n}\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'caption',\n 'contentUrl',\n 'createdAt',\n 'favoritesTotal',\n 'fields',\n 'hitsTotal',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetNumber',\n 'sheetType',\n 'tags',\n 'title',\n 'updatedAt',\n 'viewUrlname',\n 'workbookDescription',\n 'workbookName',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n caption: ['eq', 'in'],\n contentUrl: ['eq', 'in'],\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n fields: ['eq', 'in'],\n hitsTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetNumber: ['eq', 'gt', 'gte', 'lt', 'lte'],\n sheetType: ['eq', 'in'],\n tags: ['eq', 'in'],\n title: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n viewUrlname: ['eq', 'in'],\n workbookDescription: ['eq', 'in'],\n workbookName: ['eq', 'in'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateViewsFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Err, Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Workbook } from '../../sdks/tableau/types/workbook.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { resourceAccessChecker } from '../resourceAccessChecker.js';\nimport { Tool } from '../tool.js';\n\nconst paramsSchema = {\n workbookId: z.string(),\n};\n\nexport type GetWorkbookError = {\n type: 'workbook-not-allowed';\n message: string;\n};\n\nexport const getGetWorkbookTool = (server: Server): Tool<typeof paramsSchema> => {\n const getWorkbookTool = new Tool({\n server,\n name: 'get-workbook',\n description:\n 'Retrieves information about the specified workbook, including information about the views contained in the workbook.',\n paramsSchema,\n annotations: {\n title: 'Get Workbook',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async ({ workbookId }, { requestId, authInfo }): Promise<CallToolResult> => {\n const config = getConfig();\n\n return await getWorkbookTool.logAndExecute<Workbook, GetWorkbookError>({\n requestId,\n authInfo,\n args: { workbookId },\n callback: async () => {\n const isWorkbookAllowedResult = await resourceAccessChecker.isWorkbookAllowed({\n workbookId,\n restApiArgs: { config, requestId, server },\n });\n\n if (!isWorkbookAllowedResult.allowed) {\n return new Err({\n type: 'workbook-not-allowed',\n message: isWorkbookAllowedResult.message,\n });\n }\n\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n // Notice that we already have the workbook if it had been allowed by a project scope.\n const workbook =\n isWorkbookAllowedResult.content ??\n (await restApi.workbooksMethods.getWorkbook({\n workbookId,\n siteId: restApi.siteId,\n }));\n\n // The views returned by the getWorkbook API do not include usage statistics.\n // Query the views for the workbook to get each view's usage statistics.\n if (workbook.views) {\n const views = await restApi.viewsMethods.queryViewsForWorkbook({\n workbookId,\n siteId: restApi.siteId,\n includeUsageStatistics: true,\n });\n\n workbook.views.view = views;\n }\n\n return workbook;\n },\n }),\n );\n },\n constrainSuccessResult: (workbook) => {\n return {\n type: 'success',\n result: workbook,\n };\n },\n getErrorText: (error: GetWorkbookError) => {\n switch (error.type) {\n case 'workbook-not-allowed':\n return error.message;\n }\n },\n });\n },\n });\n\n return getWorkbookTool;\n};\n", "import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { Ok } from 'ts-results-es';\nimport { z } from 'zod';\n\nimport { BoundedContext, getConfig } from '../../config.js';\nimport { useRestApi } from '../../restApiInstance.js';\nimport { Workbook } from '../../sdks/tableau/types/workbook.js';\nimport { Server } from '../../server.js';\nimport { getTableauAuthInfo } from '../../server/oauth/getTableauAuthInfo.js';\nimport { paginate } from '../../utils/paginate.js';\nimport { genericFilterDescription } from '../genericFilterDescription.js';\nimport { ConstrainedResult, Tool } from '../tool.js';\nimport { parseAndValidateWorkbooksFilterString } from './workbooksFilterUtils.js';\n\nconst paramsSchema = {\n filter: z.string().optional(),\n pageSize: z.number().gt(0).optional(),\n limit: z.number().gt(0).optional(),\n};\n\nexport const getListWorkbooksTool = (server: Server): Tool<typeof paramsSchema> => {\n const listWorkbooksTool = new Tool({\n server,\n name: 'list-workbooks',\n description: `\n Retrieves a list of workbooks on a Tableau site including their metadata such as name, description, and information about the views contained in the workbook. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Superstore) for precise and flexible workbook discovery. Use this tool when a user requests to list, search, or filter Tableau workbooks on a site.\n\n **Supported Filter Fields and Operators**\n | Field | Operators |\n |-------------------|----------------------|\n | createdAt | eq, gt, gte, lt, lte |\n | contentUrl | eq, in |\n | displayTabs | eq |\n | favoritesTotal | eq, gt, gte, lt, lte |\n | hasAlerts | eq |\n | hasExtracts | eq |\n | name | eq, in |\n | ownerDomain | eq, in |\n | ownerEmail | eq, in |\n | ownerName | eq, in |\n | projectName | eq, in |\n | sheetCount | eq, gt, gte, lt, lte |\n | size | eq, gt, gte, lt, lte |\n | subscriptionTotal | eq, gt, gte, lt, lte |\n | tags | eq, in |\n | updatedAt | eq, gt, gte, lt, lte |\n\n ${genericFilterDescription}\n \n **Example Usage:**\n - List all workbooks on a site\n - List workbooks with the name \"Superstore\":\n filter: \"name:eq:Superstore\"\n - List workbooks in the \"Finance\" project:\n filter: \"projectName:eq:Finance\"\n - List workbooks created after January 1, 2023:\n filter: \"createdAt:gt:2023-01-01T00:00:00Z\"\n - List workbooks with the name \"Superstore\" in the \"Finance\" project and created after January 1, 2023:\n filter: \"name:eq:Superstore,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z\"`,\n paramsSchema,\n annotations: {\n title: 'List Workbooks',\n readOnlyHint: true,\n openWorldHint: false,\n },\n callback: async (\n { filter, pageSize, limit },\n { requestId, authInfo },\n ): Promise<CallToolResult> => {\n const config = getConfig();\n const validatedFilter = filter ? parseAndValidateWorkbooksFilterString(filter) : undefined;\n\n return await listWorkbooksTool.logAndExecute({\n requestId,\n authInfo,\n args: {},\n callback: async () => {\n return new Ok(\n await useRestApi({\n config,\n requestId,\n server,\n jwtScopes: ['tableau:content:read'],\n authInfo: getTableauAuthInfo(authInfo),\n callback: async (restApi) => {\n const workbooks = await paginate({\n pageConfig: {\n pageSize,\n limit: config.maxResultLimit\n ? Math.min(config.maxResultLimit, limit ?? Number.MAX_SAFE_INTEGER)\n : limit,\n },\n getDataFn: async (pageConfig) => {\n const { pagination, workbooks: data } =\n await restApi.workbooksMethods.queryWorkbooksForSite({\n siteId: restApi.siteId,\n filter: validatedFilter ?? '',\n pageSize: pageConfig.pageSize,\n pageNumber: pageConfig.pageNumber,\n });\n\n return { pagination, data };\n },\n });\n\n return workbooks;\n },\n }),\n );\n },\n constrainSuccessResult: (workbooks) =>\n constrainWorkbooks({ workbooks, boundedContext: config.boundedContext }),\n });\n },\n });\n\n return listWorkbooksTool;\n};\n\nexport function constrainWorkbooks({\n workbooks,\n boundedContext,\n}: {\n workbooks: Array<Workbook>;\n boundedContext: BoundedContext;\n}): ConstrainedResult<Array<Workbook>> {\n if (workbooks.length === 0) {\n return {\n type: 'empty',\n message:\n 'No workbooks were found. Either none exist or you do not have permission to view them.',\n };\n }\n\n const { projectIds, workbookIds } = boundedContext;\n if (projectIds) {\n workbooks = workbooks.filter((workbook) =>\n workbook.project?.id ? projectIds.has(workbook.project.id) : false,\n );\n }\n\n if (workbookIds) {\n workbooks = workbooks.filter((workbook) => workbookIds.has(workbook.id));\n }\n\n if (workbooks.length === 0) {\n return {\n type: 'empty',\n message: [\n 'The set of allowed workbooks that can be queried is limited by the server configuration.',\n 'While workbooks were found, they were all filtered out by the server configuration.',\n ].join(' '),\n };\n }\n\n return {\n type: 'success',\n result: workbooks,\n };\n}\n", "import { z } from 'zod';\n\nimport {\n FilterOperator,\n FilterOperatorSchema,\n parseAndValidateFilterString,\n} from '../../utils/parseAndValidateFilterString.js';\n\nconst FilterFieldSchema = z.enum([\n 'createdAt',\n 'contentUrl',\n 'displayTabs',\n 'favoritesTotal',\n 'hasAlerts',\n 'hasExtracts',\n 'name',\n 'ownerDomain',\n 'ownerEmail',\n 'ownerName',\n 'projectName',\n 'sheetCount',\n 'size',\n 'subscriptionTotal',\n 'tags',\n 'updatedAt',\n]);\n\ntype FilterField = z.infer<typeof FilterFieldSchema>;\n\nconst allowedOperatorsByField: Record<FilterField, FilterOperator[]> = {\n createdAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n contentUrl: ['eq', 'in'],\n displayTabs: ['eq'],\n favoritesTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n hasAlerts: ['eq'],\n hasExtracts: ['eq'],\n name: ['eq', 'in'],\n ownerDomain: ['eq', 'in'],\n ownerEmail: ['eq', 'in'],\n ownerName: ['eq', 'in'],\n projectName: ['eq', 'in'],\n sheetCount: ['eq', 'gt', 'gte', 'lt', 'lte'],\n size: ['eq', 'gt', 'gte', 'lt', 'lte'],\n subscriptionTotal: ['eq', 'gt', 'gte', 'lt', 'lte'],\n tags: ['eq', 'in'],\n updatedAt: ['eq', 'gt', 'gte', 'lt', 'lte'],\n};\n\nconst _FilterExpressionSchema = z.object({\n field: FilterFieldSchema,\n operator: FilterOperatorSchema,\n value: z.string(),\n});\n\ntype FilterExpression = z.infer<typeof _FilterExpressionSchema>;\n\nexport function parseAndValidateWorkbooksFilterString(filterString: string): string {\n return parseAndValidateFilterString<FilterField, FilterExpression>({\n filterString,\n allowedOperatorsByField,\n filterFieldSchema: FilterFieldSchema,\n });\n}\n\nexport const exportedForTesting = {\n FilterFieldSchema,\n};\n", "import { getSearchContentTool } from './contentExploration/searchContent.js';\nimport { getGetDatasourceMetadataTool } from './getDatasourceMetadata/getDatasourceMetadata.js';\nimport { getListDatasourcesTool } from './listDatasources/listDatasources.js';\nimport { getGeneratePulseMetricValueInsightBundleTool } from './pulse/generateMetricValueInsightBundle/generatePulseMetricValueInsightBundleTool.js';\nimport { getListAllPulseMetricDefinitionsTool } from './pulse/listAllMetricDefinitions/listAllPulseMetricDefinitions.js';\nimport { getListPulseMetricDefinitionsFromDefinitionIdsTool } from './pulse/listMetricDefinitionsFromDefinitionIds/listPulseMetricDefinitionsFromDefinitionIds.js';\nimport { getListPulseMetricsFromMetricDefinitionIdTool } from './pulse/listMetricsFromMetricDefinitionId/listPulseMetricsFromMetricDefinitionId.js';\nimport { getListPulseMetricsFromMetricIdsTool } from './pulse/listMetricsFromMetricIds/listPulseMetricsFromMetricIds.js';\nimport { getListPulseMetricSubscriptionsTool } from './pulse/listMetricSubscriptions/listPulseMetricSubscriptions.js';\nimport { getQueryDatasourceTool } from './queryDatasource/queryDatasource.js';\nimport { getGetViewDataTool } from './views/getViewData.js';\nimport { getGetViewImageTool } from './views/getViewImage.js';\nimport { getListViewsTool } from './views/listViews.js';\nimport { getGetWorkbookTool } from './workbooks/getWorkbook.js';\nimport { getListWorkbooksTool } from './workbooks/listWorkbooks.js';\n\nexport const toolFactories = [\n getGetDatasourceMetadataTool,\n getListDatasourcesTool,\n getQueryDatasourceTool,\n getListAllPulseMetricDefinitionsTool,\n getListPulseMetricDefinitionsFromDefinitionIdsTool,\n getListPulseMetricsFromMetricDefinitionIdTool,\n getListPulseMetricsFromMetricIdsTool,\n getListPulseMetricSubscriptionsTool,\n getGeneratePulseMetricValueInsightBundleTool,\n getGetWorkbookTool,\n getGetViewDataTool,\n getGetViewImageTool,\n getListWorkbooksTool,\n getListViewsTool,\n getSearchContentTool,\n];\n", "import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { isInitializeRequest, LoggingLevel } from '@modelcontextprotocol/sdk/types.js';\nimport cors from 'cors';\nimport express, { Request, RequestHandler, Response } from 'express';\nimport fs, { existsSync } from 'fs';\nimport http from 'http';\nimport https from 'https';\n\nimport { Config } from '../config.js';\nimport { setLogLevel } from '../logging/log.js';\nimport { Server } from '../server.js';\nimport { createSession, getSession, Session } from '../sessions.js';\nimport { validateProtocolVersion } from './middleware.js';\nimport { getTableauAuthInfo } from './oauth/getTableauAuthInfo.js';\nimport { OAuthProvider } from './oauth/provider.js';\nimport { TableauAuthInfo } from './oauth/schemas.js';\nimport { AuthenticatedRequest } from './oauth/types.js';\n\nconst SESSION_ID_HEADER = 'mcp-session-id';\n\nexport async function startExpressServer({\n basePath,\n config,\n logLevel,\n}: {\n basePath: string;\n config: Config;\n logLevel: LoggingLevel;\n}): Promise<{ url: string; app: express.Application; server: http.Server }> {\n const app = express();\n\n app.use(express.json());\n app.use(express.urlencoded());\n\n app.use(\n cors({\n origin: config.corsOriginConfig,\n credentials: true,\n allowedHeaders: [\n 'Content-Type',\n 'Authorization',\n 'Cache-Control',\n 'Accept',\n 'MCP-Protocol-Version',\n ],\n exposedHeaders: [SESSION_ID_HEADER, 'x-session-id'],\n }),\n );\n\n if (config.trustProxyConfig !== null) {\n // https://expressjs.com/en/guide/behind-proxies.html\n app.set('trust proxy', config.trustProxyConfig);\n }\n\n const middleware: Array<RequestHandler> = [];\n if (config.oauth.enabled) {\n const oauthProvider = new OAuthProvider();\n oauthProvider.setupRoutes(app);\n middleware.push(oauthProvider.authMiddleware);\n middleware.push(validateProtocolVersion);\n }\n\n const path = `/${basePath}`;\n app.post(path, ...middleware, createMcpServer);\n app.get(\n path,\n ...middleware,\n config.disableSessionManagement ? methodNotAllowed : handleSessionRequest,\n );\n app.delete(\n path,\n ...middleware,\n config.disableSessionManagement ? methodNotAllowed : handleSessionRequest,\n );\n\n const useSsl = !!(config.sslKey && config.sslCert);\n if (!useSsl) {\n return new Promise((resolve) => {\n const server = http\n .createServer(app)\n .listen(config.httpPort, () =>\n resolve({ url: `http://localhost:${config.httpPort}/${basePath}`, app, server }),\n );\n });\n }\n\n if (!existsSync(config.sslKey)) {\n throw new Error('SSL key file does not exist');\n }\n\n if (!existsSync(config.sslCert)) {\n throw new Error('SSL cert file does not exist');\n }\n\n const options = {\n key: fs.readFileSync(config.sslKey),\n cert: fs.readFileSync(config.sslCert),\n };\n\n return new Promise((resolve) => {\n const server = https\n .createServer(options, app)\n .listen(config.httpPort, () =>\n resolve({ url: `https://localhost:${config.httpPort}/${basePath}`, app, server }),\n );\n });\n\n async function createMcpServer(req: AuthenticatedRequest, res: Response): Promise<void> {\n try {\n let transport: StreamableHTTPServerTransport;\n\n if (config.disableSessionManagement) {\n const server = new Server();\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n });\n\n res.on('close', () => {\n transport.close();\n server.close();\n });\n\n await connect(server, transport, logLevel, getTableauAuthInfo(req.auth));\n } else {\n const sessionId = req.headers[SESSION_ID_HEADER] as string | undefined;\n\n let session: Session | undefined;\n if (sessionId && (session = getSession(sessionId))) {\n transport = session.transport;\n } else if (!sessionId && isInitializeRequest(req.body)) {\n const clientInfo = req.body.params.clientInfo;\n transport = createSession({ clientInfo });\n\n const server = new Server({ clientInfo });\n await connect(server, transport, logLevel, getTableauAuthInfo(req.auth));\n } else {\n // Invalid request\n res.status(400).json({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Bad Request: No valid session ID provided',\n },\n id: null,\n });\n return;\n }\n }\n\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n console.error('Error handling MCP request:', error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: 'Internal server error',\n },\n id: null,\n });\n }\n }\n }\n}\n\nasync function connect(\n server: Server,\n transport: StreamableHTTPServerTransport,\n logLevel: LoggingLevel,\n authInfo: TableauAuthInfo | undefined,\n): Promise<void> {\n await server.registerTools(authInfo);\n server.registerRequestHandlers();\n\n await server.connect(transport);\n setLogLevel(server, logLevel);\n}\n\nasync function methodNotAllowed(_req: Request, res: Response): Promise<void> {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: {\n code: -32000,\n message: 'Method not allowed.',\n },\n id: null,\n }),\n );\n}\n\nasync function handleSessionRequest(req: express.Request, res: express.Response): Promise<void> {\n const sessionId = req.headers[SESSION_ID_HEADER] as string | undefined;\n\n let session: Session | undefined;\n if (!sessionId || !(session = getSession(sessionId))) {\n res.status(400).send('Invalid or missing session ID');\n return;\n }\n\n await session.transport.handleRequest(req, res);\n}\n", "import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { randomUUID } from 'crypto';\n\nimport { ClientInfo } from './server.js';\n\nexport type Session = {\n transport: StreamableHTTPServerTransport;\n clientInfo: ClientInfo;\n};\n\nconst sessions: { [sessionId: string]: Session } = {};\n\nexport const createSession = ({\n clientInfo,\n}: {\n clientInfo: ClientInfo;\n}): StreamableHTTPServerTransport => {\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sessionId) => {\n sessions[sessionId] = { transport, clientInfo };\n },\n });\n\n transport.onclose = () => {\n if (transport.sessionId) {\n deleteSession(transport.sessionId);\n }\n };\n\n return transport;\n};\n\nexport const getSession = (sessionId: string): Session | undefined => {\n return sessions[sessionId];\n};\n\nconst deleteSession = (sessionId: string): void => {\n delete sessions[sessionId];\n};\n", "import { NextFunction, Request, Response } from 'express';\n\n/**\n * Validate MCP protocol version\n */\nexport function validateProtocolVersion(req: Request, res: Response, next: NextFunction): void {\n const version = req.headers['mcp-protocol-version'];\n\n // If no version header, continue (backwards compatibility)\n if (!version) {\n next();\n return;\n }\n\n // Check supported versions\n const supportedVersions = ['2025-06-18', '2025-03-26', '2024-11-05'];\n if (!supportedVersions.includes(version as string)) {\n res.status(400).json({\n jsonrpc: '2.0',\n error: {\n code: -32600,\n message: 'Unsupported protocol version',\n data: { supported: supportedVersions, requested: version },\n },\n id: null,\n });\n return;\n }\n\n next();\n}\n", "import { createPrivateKey, createPublicKey, KeyObject } from 'crypto';\nimport express, { RequestHandler } from 'express';\nimport { readFileSync } from 'fs';\n\nimport { getConfig } from '../../config.js';\nimport { oauthAuthorizationServer } from './.well-known/oauth-authorization-server.js';\nimport { oauthProtectedResource } from './.well-known/oauth-protected-resource.js';\nimport { authMiddleware } from './authMiddleware.js';\nimport { authorize } from './authorize.js';\nimport { callback } from './callback.js';\nimport { register } from './register.js';\nimport { token } from './token.js';\nimport { AuthorizationCode, PendingAuthorization, RefreshTokenData } from './types.js';\n\nexport const TABLEAU_CLOUD_SERVER_URL = 'https://online.tableau.com';\nexport const AUDIENCE = 'tableau-mcp-server';\n\n/**\n * OAuth 2.1 Provider\n *\n * Implements the complete MCP OAuth 2.1 flow with PKCE\n * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization\n *\n */\nexport class OAuthProvider {\n private readonly config = getConfig();\n\n private readonly pendingAuthorizations = new Map<string, PendingAuthorization>();\n private readonly authorizationCodes = new Map<string, AuthorizationCode>();\n private readonly refreshTokens = new Map<string, RefreshTokenData>();\n\n private readonly privateKey: KeyObject;\n private readonly publicKey: KeyObject;\n\n constructor() {\n this.privateKey = this.getPrivateKey();\n this.publicKey = createPublicKey(this.privateKey);\n }\n\n get authMiddleware(): RequestHandler {\n return authMiddleware(this.privateKey);\n }\n\n setupRoutes(app: express.Application): void {\n // .well-known/oauth-authorization-server\n oauthAuthorizationServer(app);\n\n // .well-known/oauth-protected-resource\n oauthProtectedResource(app);\n\n // oauth/register\n register(app);\n\n // oauth/authorize\n authorize(app, this.pendingAuthorizations);\n\n // /Callback\n callback(app, this.pendingAuthorizations, this.authorizationCodes);\n\n // oauth/token\n token(app, this.authorizationCodes, this.refreshTokens, this.publicKey);\n }\n\n private getPrivateKey(): KeyObject {\n let privateKeyContents = this.config.oauth.jwePrivateKey.replace(/\\\\n/g, '\\n');\n if (!privateKeyContents) {\n try {\n privateKeyContents = readFileSync(this.config.oauth.jwePrivateKeyPath, 'utf8');\n } catch {\n throw new Error('Failed to read private key file');\n }\n }\n\n try {\n return createPrivateKey({\n key: privateKeyContents,\n format: 'pem',\n passphrase: this.config.oauth.jwePrivateKeyPassphrase,\n });\n } catch {\n throw new Error('Failed to create private key');\n }\n }\n}\n", "import express from 'express';\n\nimport { getConfig } from '../../../config.js';\n\n/**\n * OAuth 2.0 Authorization Server Metadata\n *\n * Returns metadata about the authorization server including\n * available endpoints, supported flows, and capabilities.\n */\nexport function oauthAuthorizationServer(app: express.Application): void {\n app.get('/.well-known/oauth-authorization-server', (_req, res) => {\n const origin = getConfig().oauth.issuer;\n res.json({\n issuer: origin,\n authorization_endpoint: `${origin}/oauth/authorize`,\n token_endpoint: `${origin}/oauth/token`,\n registration_endpoint: `${origin}/oauth/register`,\n response_types_supported: ['code'],\n grant_types_supported: ['authorization_code', 'refresh_token', 'client_credentials'],\n code_challenge_methods_supported: ['S256'],\n scopes_supported: [],\n token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post'],\n subject_types_supported: ['public'],\n client_id_metadata_document_supported: true,\n });\n });\n}\n", "import express from 'express';\n\nimport { getConfig } from '../../../config.js';\nimport { serverName } from '../../../server.js';\n\n/**\n * OAuth 2.0 Protected Resource Metadata\n *\n * Returns metadata about the protected resource and its\n * authorization servers. Client discovers this URL from\n * WWW-Authenticate header in 401 response.\n */\nexport function oauthProtectedResource(app: express.Application): void {\n app.get('/.well-known/oauth-protected-resource', (_req, res) => {\n const issuer = getConfig().oauth.issuer;\n res.json({\n resource: `${issuer}/${serverName}`,\n authorization_servers: [issuer],\n bearer_methods_supported: ['header'],\n });\n });\n}\n", "import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { KeyObject } from 'crypto';\nimport express, { RequestHandler } from 'express';\nimport { compactDecrypt } from 'jose';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig } from '../../config.js';\nimport { AUDIENCE } from './provider.js';\nimport { mcpAccessTokenSchema, mcpAccessTokenUserOnlySchema, TableauAuthInfo } from './schemas.js';\nimport { AuthenticatedRequest } from './types.js';\n\n/**\n * Express middleware for OAuth authentication\n *\n * This middleware checks for Bearer token authorization.\n * If no token is present, returns 401 with WWW-Authenticate header\n * pointing to resource metadata endpoint.\n *\n * @returns Express middleware function\n */\nexport function authMiddleware(privateKey: KeyObject): RequestHandler {\n return async (\n req: AuthenticatedRequest,\n res: express.Response,\n next: express.NextFunction,\n ): Promise<void> => {\n const authHeader = req.headers.authorization;\n\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n // For SSE requests (GET), provide proper SSE error response\n if (req.method === 'GET' && req.headers.accept?.includes('text/event-stream')) {\n res.writeHead(401, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n res.write('event: error\\n');\n res.write(\n 'data: {\"error\": \"unauthorized\", \"error_description\": \"Authorization required\"}\\n\\n',\n );\n res.end();\n return;\n }\n\n const baseUrl = `${req.protocol}://${req.get('host')}`;\n res\n .status(401)\n .header(\n 'WWW-Authenticate',\n `Bearer realm=\"MCP\", resource_metadata=\"${baseUrl}/.well-known/oauth-protected-resource\"`,\n )\n .json({\n error: 'unauthorized',\n error_description: 'Authorization required. Use OAuth 2.1 flow.',\n });\n return;\n }\n\n const token = authHeader.slice(7);\n const result = await verifyAccessToken(token, privateKey);\n\n if (result.isErr()) {\n // For SSE requests (GET), provide proper SSE error response\n if (req.method === 'GET' && req.headers.accept?.includes('text/event-stream')) {\n res.writeHead(401, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n res.write('event: error\\n');\n res.write(`data: {\"error\": \"invalid_token\", \"error_description\": \"${result.error}\"}\\n\\n`);\n res.end();\n return;\n }\n\n res.status(401).json({\n error: 'invalid_token',\n error_description: result.error,\n });\n return;\n }\n req.auth = result.value;\n next();\n };\n}\n\n/**\n * Verifies JWE access token and extracts credentials\n *\n * Decrypts and validates JWE signature and expiration.\n * Extracts access/refresh tokens for API calls.\n *\n * @param token - JWT access token from Authorization header\n * @param jwePrivateKey - Private key for decrypting the token\n *\n * @returns AuthInfo with user details and tokens\n */\nasync function verifyAccessToken(\n token: string,\n jwePrivateKey: KeyObject,\n): Promise<Result<AuthInfo, string>> {\n const config = getConfig();\n\n try {\n const { plaintext } = await compactDecrypt(token, jwePrivateKey);\n const payload = JSON.parse(new TextDecoder().decode(plaintext));\n\n const mcpAccessToken = mcpAccessTokenUserOnlySchema.safeParse(payload);\n if (!mcpAccessToken.success) {\n return Err(`Invalid access token: ${fromError(mcpAccessToken.error).toString()}`);\n }\n\n const { iss, aud, exp, clientId } = mcpAccessToken.data;\n if (iss !== config.oauth.issuer || aud !== AUDIENCE || exp < Math.floor(Date.now() / 1000)) {\n // https://github.com/modelcontextprotocol/inspector/issues/608\n // MCP Inspector Not Using Refresh Token for Token Validation\n return new Err('Invalid or expired access token');\n }\n\n let tableauAuthInfo: TableauAuthInfo;\n if (config.auth === 'oauth') {\n const mcpAccessToken = mcpAccessTokenSchema.safeParse(payload);\n if (!mcpAccessToken.success) {\n return Err(`Invalid access token: ${fromError(mcpAccessToken.error).toString()}`);\n }\n\n const {\n tableauAccessToken,\n tableauRefreshToken,\n tableauExpiresAt,\n tableauUserId,\n tableauServer,\n sub,\n } = mcpAccessToken.data;\n\n if (tableauExpiresAt < Math.floor(Date.now() / 1000)) {\n return new Err('Invalid or expired access token');\n }\n\n tableauAuthInfo = {\n username: sub,\n userId: tableauUserId,\n server: tableauServer,\n accessToken: tableauAccessToken,\n refreshToken: tableauRefreshToken,\n };\n } else {\n const { tableauUserId, tableauServer, sub } = mcpAccessToken.data;\n tableauAuthInfo = {\n username: sub,\n server: tableauServer,\n ...(tableauUserId ? { userId: tableauUserId } : {}),\n };\n }\n\n return Ok({\n token,\n clientId,\n scopes: [],\n expiresAt: payload.exp,\n extra: tableauAuthInfo,\n });\n } catch {\n return new Err('Invalid or expired access token');\n }\n}\n", "import axiosRetry from 'axios-retry';\nimport { randomBytes, randomUUID } from 'crypto';\nimport express from 'express';\nimport { isIP } from 'net';\nimport { isSSRFSafeURL } from 'ssrfcheck';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig, ONE_DAY_IN_MS } from '../../config.js';\nimport { axios, AxiosResponse, getStringResponseHeader } from '../../utils/axios.js';\nimport { parseUrl } from '../../utils/parseUrl.js';\nimport { setLongTimeout } from '../../utils/setLongTimeout.js';\nimport { clientMetadataCache } from './clientMetadataCache.js';\nimport { getDnsResolver } from './dnsResolver.js';\nimport { generateCodeChallenge } from './generateCodeChallenge.js';\nimport { isValidRedirectUri } from './isValidRedirectUri.js';\nimport { TABLEAU_CLOUD_SERVER_URL } from './provider.js';\nimport { cimdMetadataSchema, ClientMetadata, mcpAuthorizeSchema } from './schemas.js';\nimport { PendingAuthorization } from './types.js';\n\n/**\n * OAuth 2.1 Authorization Endpoint\n *\n * Handles authorization requests with PKCE parameters.\n * Validates request, stores pending authorization, and\n * redirects to Tableau OAuth.\n */\nexport function authorize(\n app: express.Application,\n pendingAuthorizations: Map<string, PendingAuthorization>,\n): void {\n const config = getConfig();\n\n app.get('/oauth/authorize', async (req, res) => {\n const result = mcpAuthorizeSchema.safeParse(req.query);\n\n if (!result.success) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: fromError(result.error).toString(),\n });\n return;\n }\n\n const { client_id, redirect_uri, response_type, code_challenge, code_challenge_method, state } =\n result.data;\n\n const clientIdUrl = parseUrl(client_id);\n if (clientIdUrl) {\n // Client ID is a URL, so we need to attempt to fetch the client metadata from the URL\n const clientResult = await getClientFromMetadataDoc(clientIdUrl);\n if (clientResult.isErr()) {\n res.status(400).json(clientResult.error);\n return;\n }\n\n const { redirect_uris, response_types } = clientResult.value;\n\n if (response_types && !response_types.find((type) => type === response_type)) {\n res.status(400).json({\n error: 'unsupported_response_type',\n error_description: `Unsupported response type: ${response_type}`,\n });\n return;\n }\n\n if (redirect_uris && !redirect_uris.includes(redirect_uri)) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: `Invalid redirect URI: ${redirect_uri}`,\n });\n return;\n }\n }\n\n if (response_type !== 'code') {\n res.status(400).json({\n error: 'unsupported_response_type',\n error_description: 'Only authorization code flow is supported',\n });\n return;\n }\n\n if (code_challenge_method !== 'S256') {\n res.status(400).json({\n error: 'invalid_request',\n error_description: 'Only S256 code challenge method is supported',\n });\n return;\n }\n\n if (!isValidRedirectUri(redirect_uri)) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: `Invalid redirect URI: ${redirect_uri}`,\n });\n return;\n }\n\n // Generate Tableau state and store pending authorization\n const tableauState = randomBytes(32).toString('hex');\n const authKey = randomBytes(32).toString('hex');\n\n const tableauClientId = randomUUID();\n // 22-64 bytes (44-128 chars) is the recommended length for code verifiers\n const numCodeVerifierBytes = Math.floor(Math.random() * (64 - 22 + 1)) + 22;\n const tableauCodeVerifier = randomBytes(numCodeVerifierBytes).toString('hex');\n const tableauCodeChallenge = generateCodeChallenge(tableauCodeVerifier);\n pendingAuthorizations.set(authKey, {\n clientId: client_id,\n redirectUri: redirect_uri,\n codeChallenge: code_challenge,\n state: state ?? '',\n tableauState,\n tableauClientId,\n tableauCodeVerifier,\n });\n\n // Clean up expired authorizations\n setLongTimeout(() => pendingAuthorizations.delete(authKey), config.oauth.authzCodeTimeoutMs);\n\n // Redirect to Tableau OAuth\n const server = config.server || TABLEAU_CLOUD_SERVER_URL;\n const oauthUrl = new URL(`${server}/oauth2/v1/auth`);\n oauthUrl.searchParams.set('client_id', tableauClientId);\n oauthUrl.searchParams.set('code_challenge', tableauCodeChallenge);\n oauthUrl.searchParams.set('code_challenge_method', 'S256');\n oauthUrl.searchParams.set('response_type', 'code');\n oauthUrl.searchParams.set('redirect_uri', config.oauth.redirectUri);\n oauthUrl.searchParams.set('state', `${authKey}:${tableauState}`);\n oauthUrl.searchParams.set('device_id', randomUUID());\n oauthUrl.searchParams.set('target_site', config.siteName);\n oauthUrl.searchParams.set('device_name', getDeviceName(redirect_uri, state ?? ''));\n oauthUrl.searchParams.set('client_type', 'tableau-mcp');\n\n res.redirect(oauthUrl.toString());\n });\n}\n\n// https://client.dev/servers\nasync function getClientFromMetadataDoc(\n clientMetadataUrl: URL,\n): Promise<Result<ClientMetadata, { error: string; error_description: string }>> {\n const originalUrl = clientMetadataUrl.toString();\n const cache = clientMetadataCache.get(originalUrl);\n if (cache) {\n return Ok(cache);\n }\n\n const originalHostname = clientMetadataUrl.hostname;\n if (!isIP(clientMetadataUrl.hostname)) {\n try {\n // Resolve the IP from DNS\n const dnsResolver = getDnsResolver();\n const resolvedIps = await dnsResolver.resolve4(clientMetadataUrl.hostname);\n let ipAddress = resolvedIps.find(Boolean);\n if (!ipAddress) {\n const resolvedIps = await dnsResolver.resolve6(clientMetadataUrl.hostname);\n ipAddress = resolvedIps.find(Boolean);\n if (!ipAddress) {\n return Err({\n error: 'invalid_request',\n error_description: 'IP address of Client Metadata URL could not be resolved',\n });\n }\n }\n // Replace the hostname with the resolved IP Address\n clientMetadataUrl.hostname = ipAddress;\n } catch {\n return Err({\n error: 'invalid_request',\n error_description: 'IP address of Client Metadata URL could not be resolved',\n });\n }\n }\n\n const isSafe = isSSRFSafeURL(clientMetadataUrl.toString(), {\n allowedProtocols: ['https'],\n autoPrependProtocol: false,\n });\n\n if (!isSafe) {\n return Err({\n error: 'invalid_request',\n error_description: 'Client Metadata URL is not allowed',\n });\n }\n\n let response: AxiosResponse;\n try {\n const client = axios.create();\n axiosRetry(client, { retries: 3, retryDelay: axiosRetry.exponentialDelay });\n\n response = await client.get(clientMetadataUrl.toString(), {\n timeout: 5000,\n maxContentLength: 5 * 1024, // 5 KB\n maxRedirects: 3,\n headers: {\n Accept: 'application/json',\n Host: originalHostname,\n },\n });\n } catch {\n return Err({\n error: 'invalid_request',\n error_description: 'Unable to fetch client metadata',\n });\n }\n\n const contentType = getStringResponseHeader(response.headers, 'content-type');\n if (!contentType) {\n return Err({\n error: 'invalid_client_metadata',\n error_description: 'Client Metadata URL must return a valid Content-Type header',\n });\n }\n\n const contentTypes = contentType.split(';').map((s) => s.trim());\n if (!contentTypes.includes('application/json')) {\n return Err({\n error: 'invalid_client_metadata',\n error_description: 'Client Metadata URL must return a JSON response',\n });\n }\n\n const clientMetadataResult = cimdMetadataSchema.safeParse(response.data);\n if (!clientMetadataResult.success) {\n return Err({\n error: 'invalid_client_metadata',\n error_description: `Client metadata is invalid: ${fromError(clientMetadataResult.error).toString()}`,\n });\n }\n\n if (clientMetadataResult.data.client_id !== originalUrl) {\n return Err({\n error: 'invalid_client_metadata',\n error_description: 'Client ID mismatch',\n });\n }\n\n const cacheControl = getStringResponseHeader(response.headers, 'cache-control');\n let cacheControlMaxAge: string | undefined;\n if (cacheControl) {\n const maxAgeDirective = cacheControl\n .split(',')\n .map((s) => s.trim())\n .find((s) => /^max-age\\s*=\\s*\\d+$/i.test(s));\n\n if (maxAgeDirective) {\n cacheControlMaxAge = maxAgeDirective.split('=')[1].trim();\n }\n }\n\n let cacheExpiryMs = clientMetadataCache.defaultExpirationTimeMs;\n if (cacheControlMaxAge) {\n const cacheControlMaxAgeSeconds = parseInt(cacheControlMaxAge);\n if (!isNaN(cacheControlMaxAgeSeconds) && cacheControlMaxAgeSeconds >= 0) {\n cacheExpiryMs = Math.min(ONE_DAY_IN_MS, cacheControlMaxAgeSeconds * 1000);\n }\n }\n\n if (cacheExpiryMs > 0) {\n clientMetadataCache.set(originalUrl, clientMetadataResult.data, cacheExpiryMs);\n }\n\n return Ok(clientMetadataResult.data);\n}\n\nfunction getDeviceName(redirectUri: string, state: string): string {\n const defaultDeviceName = 'tableau-mcp (Unknown agent)';\n\n try {\n const url = new URL(redirectUri);\n if (url.protocol === 'https:' || url.protocol === 'http:') {\n if (redirectUri === 'https://vscode.dev/redirect' && new URL(state).protocol === 'vscode:') {\n // VS Code normally authenticates in a way that doesn't give any clues about who it is.\n // It has a backup authentication method they call \"URL Handler\" that does though.\n return 'tableau-mcp (VS Code)';\n }\n\n return defaultDeviceName;\n } else if (url.protocol === 'cursor:') {\n return 'tableau-mcp (Cursor)';\n } else {\n return `tableau-mcp (${url.protocol.slice(0, -1)})`;\n }\n } catch {\n return defaultDeviceName;\n }\n}\n", "export function parseUrl(url: string): URL | undefined {\n try {\n return new URL(url);\n } catch {\n return undefined;\n }\n}\n", "/* v8 ignore file -- @preserve */\n\nconst MAX_SIGNED_INT32 = 2 ** 31 - 1;\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\nexport function setLongTimeout<TArgs extends any[]>(\n callback: (...args: TArgs) => void,\n delay: number,\n ...args: TArgs\n): NodeJS.Timeout {\n const MAX_DELAY = MAX_SIGNED_INT32;\n\n if (delay > MAX_DELAY) {\n return setTimeout(() => {\n setLongTimeout(callback, delay - MAX_DELAY, ...args);\n }, MAX_DELAY);\n }\n\n return setTimeout(callback, delay, ...args);\n}\n", "import { TEN_MINUTES_IN_MS } from '../../config.js';\nimport { ExpiringMap } from '../../utils/expiringMap.js';\nimport { ClientMetadata } from './schemas.js';\n\nexport const clientMetadataCache = new ExpiringMap<string, ClientMetadata>({\n defaultExpirationTimeMs: TEN_MINUTES_IN_MS,\n});\n", "import { Resolver } from 'dns/promises';\n\nimport { getConfig } from '../../config.js';\n\nlet dnsResolver: Resolver | null = null;\n\nexport function getDnsResolver(): Resolver {\n if (!dnsResolver) {\n dnsResolver = new Resolver();\n dnsResolver.setServers(getConfig().oauth.dnsServers);\n }\n\n return dnsResolver;\n}\n", "import { createHash } from 'crypto';\n\n/**\n * Generates PKCE code challenge from verifier\n *\n * @param verifier - Random code verifier string\n * @returns Base64url-encoded SHA256 hash of verifier\n */\nexport function generateCodeChallenge(verifier: string): string {\n return createHash('sha256').update(verifier).digest('base64url');\n}\n", "export function isValidRedirectUri(redirectUri: unknown): boolean {\n if (typeof redirectUri !== 'string') {\n return false;\n }\n\n try {\n const url = new URL(redirectUri);\n\n // Allow HTTPS URLs\n if (url.protocol === 'https:') {\n return true;\n }\n\n // Allow HTTP only for localhost\n if (url.protocol === 'http:') {\n return url.hostname === 'localhost' || url.hostname === '127.0.0.1';\n }\n\n // Allow custom schemes (like systemprompt://)\n if (url.protocol.match(/^[a-zA-Z][a-zA-Z0-9+.-]*:$/)) {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n}\n", "import { randomBytes } from 'crypto';\nimport express from 'express';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig } from '../../config.js';\nimport { RestApi } from '../../sdks/tableau/restApi.js';\nimport { getTokenResult } from '../../sdks/tableau-oauth/methods.js';\nimport { TableauAccessToken } from '../../sdks/tableau-oauth/types.js';\nimport { TABLEAU_CLOUD_SERVER_URL } from './provider.js';\nimport { callbackSchema } from './schemas.js';\nimport { AuthorizationCode, PendingAuthorization } from './types.js';\n\n/**\n * OAuth Callback Handler\n *\n * Receives callback from Tableau OAuth after user authorization.\n * Exchanges code for tokens, generates MCP authorization\n * code, and redirects back to client with code.\n */\nexport function callback(\n app: express.Application,\n pendingAuthorizations: Map<string, PendingAuthorization>,\n authorizationCodes: Map<string, AuthorizationCode>,\n): void {\n const config = getConfig();\n\n app.get('/Callback', async (req, res) => {\n const result = callbackSchema.safeParse(req.query);\n\n if (!result.success) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: fromError(result.error).toString(),\n });\n return;\n }\n\n const { error, code, state } = result.data;\n\n if (error) {\n res.status(400).json({\n error: 'access_denied',\n error_description: 'User denied authorization',\n });\n return;\n }\n\n try {\n // Parse state to get auth key and Tableau state\n const [authKey, tableauState] = state?.split(':') ?? [];\n const pendingAuth = pendingAuthorizations.get(authKey);\n\n if (!pendingAuth || pendingAuth.tableauState !== tableauState) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: 'Invalid state parameter',\n });\n return;\n }\n\n const tokensResult = await exchangeAuthorizationCode({\n server: config.server || TABLEAU_CLOUD_SERVER_URL,\n code: code ?? '',\n redirectUri: config.oauth.redirectUri,\n clientId: pendingAuth.tableauClientId,\n codeVerifier: pendingAuth.tableauCodeVerifier,\n });\n\n if (tokensResult.isErr()) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: tokensResult.error,\n });\n return;\n }\n\n const { accessToken, refreshToken, expiresInSeconds, originHost } = tokensResult.value;\n const originHostUrl = new URL(`https://${originHost}`);\n\n if (config.server) {\n const configServerUrl = new URL(config.server);\n if (originHostUrl.hostname !== configServerUrl.hostname) {\n // Not sure if this can actually happen but without returning an error here,\n // this would fail downstream when attempting to authenticate to the REST API.\n res.status(400).json({\n error: 'invalid_request',\n error_description: `Invalid origin host: ${originHost}. Expected: ${new URL(config.server).hostname}`,\n });\n return;\n }\n }\n\n const server = originHostUrl.toString();\n const restApi = new RestApi(server);\n restApi.setCredentials(accessToken, 'unknown user id');\n const sessionResult = await restApi.authenticatedServerMethods.getCurrentServerSession();\n if (sessionResult.isErr()) {\n if (sessionResult.error.type === 'unauthorized') {\n res.status(401).json({\n error: 'unauthorized',\n error_description: `Unable to get the Tableau server session. Error: ${JSON.stringify(sessionResult.error)}`,\n });\n } else {\n res.status(500).json({\n error: 'server_error',\n error_description:\n 'Internal server error during authorization. Unable to get the Tableau server session. Contact your administrator.',\n });\n }\n return;\n }\n\n // Generate authorization code\n const authorizationCode = randomBytes(32).toString('hex');\n authorizationCodes.set(authorizationCode, {\n clientId: pendingAuth.clientId,\n redirectUri: pendingAuth.redirectUri,\n codeChallenge: pendingAuth.codeChallenge,\n user: sessionResult.value.user,\n server,\n tableauClientId: pendingAuth.tableauClientId,\n tokens: {\n accessToken,\n refreshToken,\n expiresInSeconds,\n },\n expiresAt: Math.floor((Date.now() + config.oauth.authzCodeTimeoutMs) / 1000),\n });\n\n // Clean up\n pendingAuthorizations.delete(authKey);\n\n // Redirect back to client with authorization code\n const redirectUrl = new URL(pendingAuth.redirectUri);\n redirectUrl.searchParams.set('code', authorizationCode);\n redirectUrl.searchParams.set('state', pendingAuth.state);\n\n res.redirect(redirectUrl.toString());\n } catch (error) {\n console.error('OAuth callback error:', error);\n res.status(500).json({\n error: 'server_error',\n error_description:\n 'Internal server error during authorization. Contact your administrator.',\n });\n }\n });\n}\n\n/**\n * Exchanges authorization code for Tableau access tokens\n *\n * @param server - Tableau server host\n * @param code - Authorization code\n * @param redirectUri - Redirect URI used in initial request\n * @param clientId - Client ID\n * @param codeVerifier - Code verifier\n * @returns token response with access_token and refresh_token\n */\nasync function exchangeAuthorizationCode({\n server,\n code,\n redirectUri,\n clientId,\n codeVerifier,\n}: {\n server: string;\n code: string;\n redirectUri: string;\n clientId: string;\n codeVerifier: string;\n}): Promise<Result<TableauAccessToken, string>> {\n try {\n const result = await getTokenResult(server, {\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: codeVerifier,\n });\n\n return Ok(result);\n } catch {\n return Err('Failed to exchange authorization code');\n }\n}\n", "import { Zodios, ZodiosInstance } from '@zodios/core';\n\nimport { tableauTokenApi } from './apis.js';\n\nexport const getClient = (basePath: string): ZodiosInstance<typeof tableauTokenApi> => {\n return new Zodios(basePath, tableauTokenApi);\n};\n", "import { makeApi } from '@zodios/core';\n\nimport { tableauAccessTokenRequestSchema, tableauAccessTokenResponseSchema } from './types.js';\n\nexport const tableauTokenApi = makeApi([\n {\n method: 'post',\n path: '/oauth2/v1/token',\n alias: 'token',\n response: tableauAccessTokenResponseSchema,\n parameters: [\n {\n name: 'body',\n type: 'Body',\n schema: tableauAccessTokenRequestSchema,\n },\n ],\n },\n]);\n", "import { z } from 'zod';\n\nimport { requiredString } from '../../utils/requiredString.js';\n\nexport const tableauAccessTokenRequestSchema = z.discriminatedUnion('grant_type', [\n z.object({\n grant_type: z.literal('authorization_code'),\n code: z.string(),\n code_verifier: z.string(),\n redirect_uri: z.string(),\n client_id: z.string(),\n }),\n z.object({\n grant_type: z.literal('refresh_token'),\n client_id: z.string(),\n refresh_token: z.string(),\n site_namespace: z.string(),\n }),\n]);\n\nexport const tableauAccessTokenResponseSchema = z\n .object({\n access_token: requiredString('access_token'),\n expires_in: z.number().int().nonnegative(),\n refresh_token: requiredString('refresh_token'),\n origin_host: requiredString('origin_host'),\n })\n .transform((data) => ({\n accessToken: data.access_token,\n expiresInSeconds: data.expires_in,\n refreshToken: data.refresh_token,\n originHost: data.origin_host,\n }));\n\nexport type TableauAccessTokenRequest = z.infer<typeof tableauAccessTokenRequestSchema>;\nexport type TableauAccessToken = z.infer<typeof tableauAccessTokenResponseSchema>;\n", "import { userAgent } from '../../server.js';\nimport { getClient } from './client.js';\nimport { TableauAccessToken, TableauAccessTokenRequest } from './types.js';\n\nexport async function getTokenResult(\n basePath: string,\n request: TableauAccessTokenRequest,\n): Promise<TableauAccessToken> {\n return await getClient(basePath).token(request, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': userAgent,\n },\n });\n}\n", "import express from 'express';\n\nimport { isValidRedirectUri } from './isValidRedirectUri.js';\n\n/**\n * Dynamic Client Registration Endpoint\n *\n * Allows clients to dynamically register with the authorization\n * server. For public clients (like desktop apps), no client\n * secret is required - security comes from PKCE.\n */\nexport function register(app: express.Application): void {\n app.post('/oauth/register', express.json(), (req, res) => {\n const { redirect_uris } = req.body;\n\n const validatedRedirectUris = [];\n if (redirect_uris && Array.isArray(redirect_uris)) {\n for (const uri of redirect_uris) {\n if (!isValidRedirectUri(uri)) {\n res.status(400).json({\n error: 'invalid_redirect_uri',\n error_description: `Invalid redirect URI: ${uri}`,\n });\n return;\n }\n\n validatedRedirectUris.push(uri);\n }\n }\n\n let { token_endpoint_auth_method } = req.body;\n if (\n !token_endpoint_auth_method ||\n typeof token_endpoint_auth_method !== 'string' ||\n !['client_secret_basic', 'client_secret_post'].includes(token_endpoint_auth_method)\n ) {\n token_endpoint_auth_method = 'client_secret_basic';\n }\n\n // For public clients, we use a fixed client ID since no authentication is required\n // The security comes from PKCE (code challenge/verifier) at authorization time\n res.json({\n client_id: 'mcp-public-client',\n redirect_uris: validatedRedirectUris,\n grant_types: ['authorization_code', 'client_credentials'],\n response_types: ['code'],\n token_endpoint_auth_method,\n application_type: 'native',\n });\n });\n}\n", "import { KeyObject, randomBytes, timingSafeEqual } from 'crypto';\nimport express from 'express';\nimport { CompactEncrypt } from 'jose';\nimport { Err, Ok, Result } from 'ts-results-es';\nimport { fromError } from 'zod-validation-error';\n\nimport { getConfig } from '../../config.js';\nimport { getTokenResult } from '../../sdks/tableau-oauth/methods.js';\nimport { TableauAccessToken } from '../../sdks/tableau-oauth/types.js';\nimport { setLongTimeout } from '../../utils/setLongTimeout.js';\nimport { generateCodeChallenge } from './generateCodeChallenge.js';\nimport { AUDIENCE } from './provider.js';\nimport { mcpTokenSchema } from './schemas.js';\nimport { AuthorizationCode, ClientCredentials, RefreshTokenData, UserAndTokens } from './types.js';\n\n/**\n * OAuth 2.1 Token Endpoint\n *\n * Exchanges authorization code for access token.\n * Verifies PKCE code_verifier matches the original challenge.\n * Returns JWE containing tokens for API access.\n */\nexport function token(\n app: express.Application,\n authorizationCodes: Map<string, AuthorizationCode>,\n refreshTokens: Map<string, RefreshTokenData>,\n publicKey: KeyObject,\n): void {\n const config = getConfig();\n\n app.post('/oauth/token', async (req, res) => {\n const result = mcpTokenSchema.safeParse(req.body);\n\n if (!result.success) {\n res.status(400).json({\n error: 'invalid_request',\n error_description: fromError(result.error).toString(),\n });\n return;\n }\n\n const clientCredentialsResult = verifyClientCredentials({\n required: result.data.grantType === 'client_credentials',\n clientId: result.data.clientId,\n clientSecret: result.data.clientSecret,\n clientIdSecretPairs: getConfig().oauth.clientIdSecretPairs,\n authorizationHeader: req.headers.authorization,\n });\n\n if (clientCredentialsResult.isErr()) {\n res.status(401).json({\n error: 'invalid_client',\n error_description: clientCredentialsResult.error,\n });\n return;\n }\n\n try {\n switch (result.data.grantType) {\n case 'authorization_code': {\n // Handle authorization code exchange\n const { code, codeVerifier } = result.data;\n const authCode = authorizationCodes.get(code);\n if (!authCode || authCode.expiresAt < Math.floor(Date.now() / 1000)) {\n authorizationCodes.delete(code);\n res.status(400).json({\n error: 'invalid_grant',\n error_description: 'Invalid or expired authorization code',\n });\n return;\n }\n\n // Verify PKCE\n const challengeFromVerifier = generateCodeChallenge(codeVerifier);\n if (challengeFromVerifier !== authCode.codeChallenge) {\n res.status(400).json({\n error: 'invalid_grant',\n error_description: 'Invalid code verifier',\n });\n return;\n }\n\n // Generate tokens\n const refreshTokenId = randomBytes(32).toString('hex');\n const accessToken = await createAccessToken(authCode, publicKey);\n refreshTokens.set(refreshTokenId, {\n user: authCode.user,\n server: authCode.server,\n clientId: authCode.clientId,\n tokens: authCode.tokens,\n expiresAt: Math.floor((Date.now() + config.oauth.refreshTokenTimeoutMs) / 1000),\n tableauClientId: authCode.tableauClientId,\n });\n\n setLongTimeout(\n () => refreshTokens.delete(refreshTokenId),\n config.oauth.refreshTokenTimeoutMs,\n );\n\n authorizationCodes.delete(code);\n\n res.json({\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: config.oauth.accessTokenTimeoutMs / 1000,\n refresh_token: refreshTokenId,\n });\n return;\n }\n case 'client_credentials': {\n // Generate access token for client credentials grant type.\n // Refresh token is not supported for client credentials grant type.\n // https://www.rfc-editor.org/rfc/rfc6749#section-4.4.3\n const accessToken = await createClientCredentialsAccessToken(\n {\n clientId: clientCredentialsResult.value.clientId,\n server: config.server,\n },\n publicKey,\n );\n\n res.json({\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: config.oauth.accessTokenTimeoutMs / 1000,\n });\n return;\n }\n case 'refresh_token': {\n // Handle refresh token\n const { refreshToken } = result.data;\n const tokenData = refreshTokens.get(refreshToken);\n if (!tokenData || tokenData.expiresAt < Math.floor(Date.now() / 1000)) {\n // Refresh token is expired\n refreshTokens.delete(refreshToken);\n res.status(400).json({\n error: 'invalid_grant',\n error_description: 'Invalid or expired refresh token',\n });\n return;\n }\n\n let accessToken: string;\n const { refreshToken: tableauRefreshToken } = tokenData.tokens;\n\n const tokensResult = await exchangeRefreshToken(\n tokenData.server,\n tableauRefreshToken,\n tokenData.tableauClientId,\n );\n\n if (tokensResult.isErr()) {\n // If the refresh token exchange fails, reuse the existing Tableau access token\n // which may or may not be expired.\n accessToken = await createAccessToken(\n {\n user: tokenData.user,\n clientId: tokenData.clientId,\n server: tokenData.server,\n tokens: tokenData.tokens,\n },\n publicKey,\n );\n } else {\n const {\n accessToken: newTableauAccessToken,\n refreshToken: newTableauRefreshToken,\n expiresInSeconds,\n } = tokensResult.value;\n\n accessToken = await createAccessToken(\n {\n user: tokenData.user,\n clientId: tokenData.clientId,\n server: tokenData.server,\n tokens: {\n accessToken: newTableauAccessToken,\n refreshToken: newTableauRefreshToken,\n expiresInSeconds,\n },\n },\n publicKey,\n );\n }\n\n // Rotate the refresh token and extend its expiration time\n refreshTokens.delete(refreshToken);\n const refreshTokenId = randomBytes(32).toString('hex');\n\n refreshTokens.set(refreshTokenId, {\n user: tokenData.user,\n server: tokenData.server,\n clientId: tokenData.clientId,\n tokens: tokenData.tokens,\n expiresAt: Math.floor((Date.now() + config.oauth.refreshTokenTimeoutMs) / 1000),\n tableauClientId: tokenData.tableauClientId,\n });\n\n res.json({\n access_token: accessToken,\n token_type: 'Bearer',\n expires_in: config.oauth.accessTokenTimeoutMs / 1000,\n refresh_token: refreshTokenId,\n });\n return;\n }\n }\n } catch (error) {\n console.error('Token endpoint error:', error);\n res.status(500).json({\n error: 'server_error',\n error_description: 'Internal server error',\n });\n return;\n }\n });\n}\n\n/**\n * Creates JWE access token containing credentials\n *\n * @param tokenData - token data\n * @param publicKey - public key for encrypting the token\n * @returns Encrypted JWE token for MCP authentication\n */\nasync function createAccessToken(tokenData: UserAndTokens, publicKey: KeyObject): Promise<string> {\n const config = getConfig();\n\n const payload = JSON.stringify({\n sub: tokenData.user.name,\n clientId: tokenData.clientId,\n tableauServer: tokenData.server,\n tableauUserId: tokenData.user.id,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor((Date.now() + config.oauth.accessTokenTimeoutMs) / 1000),\n aud: AUDIENCE,\n iss: config.oauth.issuer,\n ...(config.auth === 'oauth'\n ? {\n tableauAccessToken: tokenData.tokens.accessToken,\n tableauRefreshToken: tokenData.tokens.refreshToken,\n tableauExpiresAt: Math.floor(Date.now() / 1000) + tokenData.tokens.expiresInSeconds,\n tableauUserId: tokenData.user.id,\n }\n : {}),\n });\n\n const jwe = await new CompactEncrypt(new TextEncoder().encode(payload))\n .setProtectedHeader({ alg: 'RSA-OAEP-256', enc: 'A256GCM' })\n .encrypt(publicKey);\n\n return jwe;\n}\n\nasync function createClientCredentialsAccessToken(\n clientCredentials: ClientCredentials,\n publicKey: KeyObject,\n): Promise<string> {\n const config = getConfig();\n const payload = JSON.stringify({\n sub: clientCredentials.clientId,\n clientId: clientCredentials.clientId,\n tableauServer: clientCredentials.server,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor((Date.now() + config.oauth.accessTokenTimeoutMs) / 1000),\n aud: AUDIENCE,\n iss: config.oauth.issuer,\n });\n\n const jwe = await new CompactEncrypt(new TextEncoder().encode(payload))\n .setProtectedHeader({ alg: 'RSA-OAEP-256', enc: 'A256GCM' })\n .encrypt(publicKey);\n\n return jwe;\n}\n\nasync function exchangeRefreshToken(\n server: string,\n refreshToken: string,\n clientId: string,\n): Promise<Result<TableauAccessToken, string>> {\n try {\n const result = await getTokenResult(server, {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: clientId,\n site_namespace: '',\n });\n\n return Ok(result);\n } catch {\n return Err('Failed to exchange refresh token');\n }\n}\n\nfunction verifyClientCredentials({\n required,\n clientId,\n clientSecret,\n clientIdSecretPairs,\n authorizationHeader,\n}: {\n required: boolean;\n clientId: string | undefined;\n clientSecret: string | undefined;\n clientIdSecretPairs: Record<string, string> | null;\n authorizationHeader: string | undefined;\n}): Result<{ clientId: string }, string> {\n if (!clientId && !clientSecret) {\n if (required) {\n if (!authorizationHeader) {\n return Err('Authorization header is required');\n }\n\n const [type, credentials] = authorizationHeader.split(' ');\n if (type !== 'Basic') {\n return Err('Invalid authorization type');\n }\n\n [clientId, clientSecret] = Buffer.from(credentials, 'base64').toString().split(':');\n if (!clientId || !clientSecret) {\n return Err('Invalid client credentials');\n }\n }\n }\n\n if (!required) {\n return Ok({ clientId: '' });\n }\n\n if (!clientId) {\n return Err('Client ID is required');\n }\n\n if (!clientSecret) {\n return Err('Client secret is required');\n }\n\n const expectedClientSecret = clientIdSecretPairs?.[clientId];\n if (!expectedClientSecret || clientSecret.length !== expectedClientSecret.length) {\n return Err('Invalid client credentials');\n }\n\n const textEncoder = new TextEncoder();\n const clientSecretBuffer = textEncoder.encode(clientSecret);\n const expectedClientSecretBuffer = textEncoder.encode(expectedClientSecret);\n\n if (\n clientSecretBuffer.byteLength !== expectedClientSecretBuffer.byteLength ||\n !timingSafeEqual(clientSecretBuffer, expectedClientSecretBuffer)\n ) {\n return Err('Invalid client credentials');\n }\n\n return Ok({ clientId });\n}\n"],
|
|
5
|
+
"mappings": "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eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,cACF,CAAC,EAGYkB,GAAyBlB,EAAE,KAAK,CAC3C,4BACA,qBACA,oBACF,CAAC,EAGYmB,GAA2BnB,EAAE,OAAO,CAC/C,eAAgBA,EAAE,OAAO,CACvB,QAASA,EAAE,OAAO,EAClB,QAASA,EAAE,OAAO,CAChB,cAAekB,GACf,UAAWlB,EAAE,OAAO,EACpB,SAAUgB,GACV,OAAQC,EACV,CAAC,EACD,MAAOjB,EAAE,OAAO,CACd,SAAUA,EAAE,OAAO,CACjB,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,UAAWA,EAAE,OAAO,EAAE,SAAS,EAC/B,cAAeA,EAAE,OAAO,EAAE,SAAS,CACrC,CAAC,EACD,OAAQA,EAAE,OAAO,CACf,WAAYA,EAAE,OAAO,CACnB,WAAYA,EAAE,OAAO,CACnB,GAAIA,EAAE,OAAO,CACf,CAAC,EACD,oBAAqBI,GACrB,iBAAkBJ,EAAE,QAAQ,CAC9B,CAAC,EACD,qBAAsBO,GACtB,kBAAmBD,GACnB,uBAAwBI,GACxB,iBAAkBC,GAClB,MAAOH,GAAiB,SAAS,CACnC,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,EAEYY,GAA4BpB,EAAE,OAAO,CAChD,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,MACVA,EAAE,OAAO,CACP,OAAQA,EAAE,OAAO,CACf,KAAMA,EAAE,OAAO,EACf,QAASA,EAAE,O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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;sECA5C,IAAMC,GAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;sECA9C,OAAOC,OAAiB,mBACxB,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBAwBhC,eAAsBC,GACpBC,EACAC,EACAC,EACAC,EACgD,CAChD,GAAI,CAACF,EAAM,QACT,OAAOG,GAAG,MAGZ,IAAMC,EAA4C,CAAC,EAG7CC,EAAoBL,EAAM,QAAQ,OACrCM,IACEA,EAAO,aAAe,OAASA,EAAO,aAAe,UACtD,iBAAkBA,EAAO,OACzBA,EAAO,MAAM,YACjB,EAEA,GAAID,EAAkB,SAAW,EAC/B,OAAOF,GAAG,MAIZ,QAAWG,KAAUD,EAAmB,CACtC,IAAME,EAAeD,EAAO,MAAM,aAElC,GAAI,CACF,GAAIA,EAAO,aAAe,MAAO,CAC/B,IAAME,EAAS,MAAMC,GAAkBH,EAAQL,EAAyBC,CAAU,EAC9EM,EAAO,MAAM,GACfJ,EAAiB,KAAKI,EAAO,KAAK,CAEtC,SAAWF,EAAO,aAAe,QAAS,CACxC,IAAME,EAAS,MAAME,GAAoBJ,EAAQL,EAAyBC,CAAU,EAChFM,EAAO,MAAM,GACfJ,EAAiB,KAAKI,EAAO,KAAK,CAEtC,CACF,OAASG,EAAO,CACdC,GAAI,QAAQb,EAAQ,4CAA4CQ,CAAY,KAAKI,CAAK,EAAE,CAC1F,CACF,CAEA,OAAIP,EAAiB,OAAS,EACrB,IAAIS,GAAIT,CAAgB,EAG1BD,GAAG,KACZ,CAKA,eAAeM,GACbH,EACAL,EACAC,EAC8C,CAC9C,IAAMK,EAAeD,EAAO,MAAM,aAC5BQ,EAAeR,EAAO,OAAO,IAAKS,GAAM,OAAOA,CAAC,CAAC,EAYjDC,EAA6B,CACjC,WAAAd,EACA,MAXiC,CACjC,OAAQ,CACN,CACE,aAAcK,EACd,WAAY,gBACd,CACF,CACF,EAKE,QAAS,CACP,aAAc,UACd,MAAO,GACP,aAAc,EAChB,CACF,EAEMC,EAAS,MAAMP,EAAwB,gBAAgBe,CAAY,EAEzE,GAAIR,EAAO,MAAM,EAEf,OAAOL,GAAG,MAGZ,IAAMc,EAAOT,EAAO,MAAM,MAAQ,CAAC,EAC7BU,EAAiB,IAAI,IACxBD,EAAmC,IAAKE,GACvC,OAAOA,EAAI,gBAAkBA,EAAIZ,CAAY,GAAK,EAAE,CACtD,CACF,EAGMa,EAAgBN,EAAa,OAAQO,GAAU,CAACH,EAAe,IAAIG,CAAK,CAAC,EAE/E,GAAID,EAAc,OAAS,EAAG,CAE5B,IAAME,EAAkBC,GACtBH,EACA,MAAM,KAAKF,CAAc,EACzB,EACA,CACF,EAEIM,EAAU,uCAAuCjB,CAAY,2CAA2Ca,EAAc,KAAK,IAAI,CAAC,IACpI,OAAIE,EAAgB,OAAS,IAC3BE,GAAW,kBAAkBF,EAAgB,KAAK,IAAI,CAAC,KAEzDE,GACE,2HAEK,IAAIX,GAAI,CACb,MAAON,EACP,cAAAa,EACA,aAAcE,EACd,QAAAE,CACF,CAAC,CACH,CAEA,OAAOrB,GAAG,KACZ,CAKA,eAAeO,GACbJ,EACAL,EACAC,EAC8C,CAC9C,IAAMK,EAAeD,EAAO,MAAM,aAY5BU,EAA6B,CACjC,WAAAd,EACA,MAX+B,CAC/B,OAAQ,CACN,CACE,aAAcK,EACd,WAAY,cACd,CACF,CACF,EAKE,QAAS,CACP,aAAc,UACd,MAAO,GACP,aAAc,EAChB,CACF,EAEMC,EAAS,MAAMP,EAAwB,gBAAgBe,CAAY,EAEzE,GAAIR,EAAO,MAAM,EAEf,OAAOL,GAAG,MAIZ,IAAMsB,GADOjB,EAAO,MAAM,MAAQ,CAAC,GACqB,IAAKW,GAC3D,OAAOA,EAAI,cAAgBA,EAAIZ,CAAY,GAAK,EAAE,CACpD,EAUA,GAAI,CAPakB,EAAY,KAAMJ,GAC7B,EAAAf,EAAO,YAAc,CAACe,EAAM,WAAWf,EAAO,UAAU,GACxDA,EAAO,UAAY,CAACe,EAAM,SAASf,EAAO,QAAQ,GAClDA,EAAO,UAAY,CAACe,EAAM,SAASf,EAAO,QAAQ,EAEvD,EAEc,CACb,IAAMoB,EAAgB,IAAI,IAG1B,QAAWL,KAASI,EAAa,CAC/B,GAAIC,EAAc,MAAQ,EAAG,MAE7B,IAAMC,EAAaN,EAAM,YAAY,EAE/BO,EAAkBtB,EAAO,YAC1B,IAAM,CACL,IAAMuB,EAAUvB,EAAO,WAAY,YAAY,EACzCwB,EAAMD,EAAQ,OACdE,EAAkB,KAAK,IAAI,EAAG,KAAK,MAAMD,EAAM,CAAC,CAAC,EACjDE,EAAaL,EAAW,MAAM,EAAGG,CAAG,EAC1C,OAAOG,GAAY,IAAIJ,EAASG,CAAU,GAAKD,CACjD,GAAG,EACH,GAEEG,EAAgB5B,EAAO,UACxB,IAAM,CACL,IAAMuB,EAAUvB,EAAO,SAAU,YAAY,EACvCwB,EAAMD,EAAQ,OACdE,EAAkB,KAAK,IAAI,EAAG,KAAK,MAAMD,EAAM,CAAC,CAAC,EACjDK,EAAWR,EAAW,MAAM,CAACG,CAAG,EACtC,OAAOG,GAAY,IAAIJ,EAASM,CAAQ,GAAKJ,CAC/C,GAAG,EACH,GAEEK,EAAqB9B,EAAO,UAC7B,IAAM,CACL,IAAMuB,EAAUvB,EAAO,SAAU,YAAY,EACvCwB,EAAMD,EAAQ,OACdE,EAAkB,KAAK,IAAI,EAAG,KAAK,MAAMD,EAAM,CAAC,CAAC,EACvD,OAAIH,EAAW,QAAUG,EAChB,MAAM,KAAK,CAAE,OAAQH,EAAW,OAASG,EAAM,CAAE,EAAG,CAACO,EAAGC,IAC7DL,GAAY,IAAIJ,EAASF,EAAW,MAAMW,EAAGA,EAAIR,CAAG,CAAC,CACvD,EAAE,KAAMS,GAASA,GAAQR,CAAe,EAEjCE,GAAY,IAAIJ,EAASF,CAAU,GAAKI,CAEnD,GAAG,EACH,GAEAH,GAAmBM,GAAiBE,GACtCV,EAAc,IAAIL,CAAK,CAE3B,CAEA,IAAMmB,EAAqC,CAAC,EACxClC,EAAO,YAAYkC,EAAoB,KAAK,gBAAgBlC,EAAO,UAAU,GAAG,EAChFA,EAAO,UAAUkC,EAAoB,KAAK,cAAclC,EAAO,QAAQ,GAAG,EAC1EA,EAAO,UAAUkC,EAAoB,KAAK,aAAalC,EAAO,QAAQ,GAAG,EAC7E,IAAMmC,EACJf,EAAc,KAAO,EACjB,iCAAiC,MAAM,KAAKA,CAAa,EAAE,KAAK,IAAI,CAAC,IACrE,GAEAF,EACJ,uCAAuCjB,CAAY,2BAC3BiC,EAAoB,KAAK,OAAO,CAAC,KACtDC,CAAmB,2HAGxB,OAAO,IAAI5B,GAAI,CACb,MAAON,EACP,cAAeiC,EACf,aAAc,MAAM,KAAKd,CAAa,EACtC,QAAAF,CACF,CAAC,CACH,CAEA,OAAOrB,GAAG,KACZ,CAKO,SAASoB,GACdH,EACAF,EACAwB,EAAsB,EACtBC,EAAyB,EACf,CACV,IAAMC,EAID,CAAC,EAEN,QAAWC,KAAiB3B,EAAgB,CAC1C,IAAM4B,EAAU1B,EACb,IAAK2B,IAAkB,CACtB,MAAOA,EACP,SAAUd,GAAY,IAAIc,EAAa,YAAY,EAAGF,EAAc,YAAY,CAAC,CACnF,EAAE,EACD,OAAQG,GAAUA,EAAM,UAAYN,CAAW,EAC/C,KAAK,CAACO,EAAGC,IAAMD,EAAE,SAAWC,EAAE,QAAQ,EACzC,GAAIJ,EAAQ,OAAS,EAAG,CACtB,IAAMK,EAAYL,EAAQ,CAAC,EAC3BF,EAAY,KAAK,CACf,aAAcO,EAAU,MACxB,0BAA2BN,EAC3B,SAAUM,EAAU,QACtB,CAAC,CACH,CACF,CAGAP,EAAY,KAAK,CAACK,EAAGC,IAAMD,EAAE,SAAWC,EAAE,QAAQ,EAGlD,IAAME,EAA0B,CAAC,EAC3BC,EAAiC,KAAK,KAAKV,EAAiBvB,EAAc,MAAM,EAEhFkC,EAAqD,IAAI,IAC/D,QAAWP,KAAgB3B,EACzBkC,EAA8B,IAAIP,EAAc,CAAC,EAGnD,OAAW,CAAE,aAAAA,EAAc,0BAAAQ,CAA0B,IAAKX,EAAa,CACrE,GAAIQ,EAAS,SAAWT,EACtB,MAGEW,EAA8B,IAAIP,CAAY,IAAMM,IAIxDD,EAAS,KAAKG,CAAyB,EACvCD,EAA8B,IAC5BP,EACAO,EAA8B,IAAIP,CAAY,EAAK,CACrD,EACF,CAGA,OAAW,CAAE,0BAAAQ,CAA0B,IAAKX,EAAa,CACvD,GAAIQ,EAAS,SAAWT,EACtB,MACK,GAAIS,EAAS,SAASG,CAAyB,EACpD,SAEFH,EAAS,KAAKG,CAAyB,CACzC,CAEA,OAAOH,CACT,CC7VA,OAAS,OAAAI,GAAK,MAAAC,OAAkB,gBAuBhC,eAAsBC,GACpBC,EACAC,EACAC,EAC+C,CAC/C,IAAMC,EAA2C,CAAC,EAElD,GAAI,CACF,IAAMC,EAAqB,MAAMH,EAAwB,aAAa,CACpE,WAAY,CACV,eAAgBC,EAAW,cAC7B,CACF,CAAC,EAED,GAAIE,EAAmB,MAAM,GAAK,CAACA,EAAmB,MAAM,KAE1D,OAAON,GAAG,MAGZO,GACEL,EAAM,OACNI,EAAmB,MACnBD,CACF,EAEIH,EAAM,YACRM,GACEN,EAAM,WACNI,EAAmB,MACnBD,CACF,CAEJ,MAAQ,CAEN,OAAOL,GAAG,KACZ,CAEA,OAAIK,EAAiB,OAAS,EACrB,IAAIN,GAAIM,CAAgB,EAG1BL,GAAG,KACZ,CAEO,SAASO,GACdE,EACAC,EACAL,EACM,CACN,QAAWM,KAASF,EAAQ,CAE1B,GAAI,YAAaE,EAAO,CAMtB,GAJ4BD,EAAmB,MAAM,KAClDE,GAAMA,EAAE,eAAiBD,EAAM,cAAgBC,EAAE,cAAgB,KACpE,EAEyB,CACvBP,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,kBAAkBA,EAAM,YAAY,qNAC/C,CAAC,EACD,QACF,CAGqBF,EAAO,KACzBG,GAAMA,EAAE,eAAiBD,EAAM,cAAgB,aAAcC,GAAKA,EAAE,QACvE,GAGEP,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,kBAAkBA,EAAM,YAAY,0KAC/C,CAAC,EAGH,QACF,CAEA,IAAME,EAAgBH,EAAmB,MAAM,KAC5CE,GAAMA,EAAE,eAAiBD,EAAM,YAClC,EAGA,GAAKE,GASE,GAAI,gBAAiBF,EAAO,CAC7B,YAAaE,EACfR,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,gDAAgDA,EAAM,YAAY,uLAC7E,CAAC,EAEDN,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,gDAAgDA,EAAM,YAAY,mKAC7E,CAAC,EAEH,QACF,MAtBoB,CACZ,gBAAiBA,GACrBN,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,UAAUA,EAAM,YAAY,iHACvC,CAAC,EAGH,QACF,CAgBA,GAAI,aAAcA,EAChB,OAAQE,EAAc,SAAU,CAC9B,IAAK,UACL,IAAK,OAEA,CAAC,MAAO,MAAO,SAAU,QAAS,SAAU,MAAO,MAAO,QAAS,KAAK,EAAE,SACzEF,EAAM,QACR,GAEAN,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,QAAQA,EAAM,YAAY,uBAAuBE,EAAc,QAAQ,WAAWF,EAAM,QAAQ,4DAC3G,CAAC,EAEH,SACF,IAAK,SACL,IAAK,UACE,CAAC,MAAO,MAAO,QAAS,QAAQ,EAAE,SAASA,EAAM,QAAQ,GAC5DN,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,QAAQA,EAAM,YAAY,uBAAuBE,EAAc,QAAQ,WAAWF,EAAM,QAAQ,4DAC3G,CAAC,EAEH,SACF,IAAK,OACL,IAAK,WAEA,CACC,MACA,MACA,QACA,SACA,OACA,UACA,QACA,OACA,MACA,aACA,gBACA,cACA,aACA,WACF,EAAE,SAASA,EAAM,QAAQ,GAEzBN,EAAiB,KAAK,CACpB,MAAOM,EAAM,aACb,QAAS,QAAQA,EAAM,YAAY,uBAAuBE,EAAc,QAAQ,WAAWF,EAAM,QAAQ,4DAC3G,CAAC,EAEH,SACF,QAEE,QACJ,CAEJ,CACF,CAEO,SAASH,GACdM,EACAJ,EACAL,EACM,CACN,QAAWU,KAAaD,EAAY,CAClC,IAAME,EAAoBN,EAAmB,WAAW,YAAY,KACjEO,GAAMA,EAAE,mBAAqBF,EAAU,gBAC1C,EAGA,GAAI,CAACC,EAAmB,CACtBX,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,+GACnD,CAAC,EACD,QACF,CAGA,OAAQC,EAAkB,cAAe,CACvC,IAAK,YACEE,GAA8BH,EAAU,MAAOC,EAAkB,QAAQ,GAC5EX,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,UAAUC,EAAkB,QAAQ,2EAA2ED,EAAU,KAAK,GACjL,CAAC,EAEH,SACF,IAAK,OACEC,EAAkB,QAAQ,SAASD,EAAU,KAAK,GACrDV,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,6GAA6GC,EAAkB,QAAQ,KAAK,IAAI,CAAC,IACpM,CAAC,EAEH,SACF,IAAK,oBACH,GAAI,OAAOD,EAAU,OAAU,UAAY,MAAM,KAAK,MAAMA,EAAU,KAAK,CAAC,EAAG,CAC7EV,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,4GACnD,CAAC,EACD,QACF,CACA,GACEC,EAAkB,SAClB,IAAI,KAAKD,EAAU,KAAK,EAAI,IAAI,KAAKC,EAAkB,OAAO,EAC9D,CACAX,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,wEAAwEC,EAAkB,OAAO,GACpJ,CAAC,EACD,QACF,CACA,GACEA,EAAkB,SAClB,IAAI,KAAKD,EAAU,KAAK,EAAI,IAAI,KAAKC,EAAkB,OAAO,EAC9D,CACAX,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,2EAA2EC,EAAkB,OAAO,GACvJ,CAAC,EACD,QACF,CACA,SACF,IAAK,qBACH,GAAI,OAAOD,EAAU,OAAU,SAAU,CACvCV,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,iFACnD,CAAC,EACD,QACF,CACA,GAAIC,EAAkB,KAAO,MAAaD,EAAU,MAAQC,EAAkB,IAAK,CACjFX,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,yEAAyEC,EAAkB,GAAG,GACjJ,CAAC,EACD,QACF,CACA,GAAIA,EAAkB,KAAO,MAAaD,EAAU,MAAQC,EAAkB,IAAK,CACjFX,EAAiB,KAAK,CACpB,UAAWU,EAAU,iBACrB,QAAS,cAAcA,EAAU,gBAAgB,4EAA4EC,EAAkB,GAAG,GACpJ,CAAC,EACD,QACF,CACA,SACF,QAEE,QACJ,CACF,CACF,CAEA,SAASE,GACPC,EACAC,EACS,CACT,GAAID,IAAU,KACZ,MAAO,GAET,OAAQC,EAAU,CAChB,IAAK,UACH,OAAO,OAAOD,GAAU,UAAY,OAAO,UAAUA,CAAK,EAC5D,IAAK,OACH,OAAO,OAAOA,GAAU,SAC1B,IAAK,SACH,OAAO,OAAOA,GAAU,SAC1B,IAAK,UACH,OAAO,OAAOA,GAAU,UAC1B,IAAK,OACH,OAAO,OAAOA,GAAU,UAAY,CAAC,MAAM,KAAK,MAAMA,CAAK,CAAC,EAC9D,QAEE,MAAO,EACX,CACF,CZxRA,IAAME,GAAe,CACnB,eAAgBC,GAAE,OAAO,EAAE,SAAS,EACpC,MAAOC,EACT,EAmBaC,GAAyB,CACpCC,EACAC,IAC8B,CAC9B,IAAMC,EAASC,EAAU,EAEnBC,EAAsB,IAAIC,EAAK,CACnC,OAAAL,EACA,KAAM,mBACN,YAAa,IAAIM,GACf,SACE,MAAMC,GAA2B,CAC/B,OAAQL,EAAO,QAAUD,GAAU,OACnC,SAAU,CACR,WAAYO,GACZ,QAASC,EACX,CACF,CAAC,CACL,EACA,aAAAb,GACA,YAAa,CACX,MAAO,mBACP,aAAc,GACd,cAAe,EACjB,EACA,cAAec,GACf,SAAU,MACR,CAAE,eAAAC,EAAgB,MAAAC,CAAM,EACxB,CAAE,UAAAC,EAAW,SAAAZ,CAAS,IAEf,MAAMG,EAAoB,cAAiD,CAChF,UAAAS,EACA,SAAAZ,EACA,KAAM,CAAE,eAAAU,EAAgB,MAAAC,CAAM,EAC9B,SAAU,SAAY,CACpB,IAAME,EAA4B,MAAMC,GAAsB,oBAAoB,CAChF,eAAAJ,EACA,YAAa,CAAE,OAAAT,EAAQ,UAAAW,EAAW,OAAAb,CAAO,CAC3C,CAAC,EAED,GAAI,CAACc,EAA0B,QAC7B,OAAO,IAAIE,GAAI,CACb,KAAM,yBACN,QAASF,EAA0B,OACrC,CAAC,EAGH,IAAMG,EAAyB,CAAE,eAAAN,CAAe,EAC1CO,EAAU,CACd,aAAc,UACd,MAAO,GACP,aAAc,EAChB,EAEMC,EAAcC,GAAyBT,CAAc,EACvDQ,IACFF,EAAW,YAAcE,GAG3B,IAAME,EAAe,CACnB,WAAAJ,EACA,MAAAL,EACA,QAAAM,CACF,EAEA,OAAO,MAAMI,EAAW,CACtB,OAAApB,EACA,UAAAW,EACA,OAAAb,EACA,UAAW,CAAC,+BAA+B,EAC3C,SAAUuB,EAAmBtB,CAAQ,EACrC,SAAU,MAAOuB,GAAY,CAC3B,GAAI,CAACtB,EAAO,yCAA0C,CAEpD,IAAMuB,EAA2B,MAAMC,GACrCd,EACAY,EAAQ,wBACRP,CACF,EAEA,GAAIQ,EAAyB,MAAM,EAAG,CAEpC,IAAME,EADSF,EAAyB,MACZ,IAAKG,GAAUA,EAAM,OAAO,EAAE,KAAK;AAAA;AAAA,CAAM,EACrE,OAAO,IAAIZ,GAAI,CACb,KAAM,mBACN,QAASW,CACX,CAAC,CACH,CAGA,IAAME,EAAyB,MAAMC,GACnC9B,EACAY,EACAY,EAAQ,wBACRP,CACF,EAEA,GAAIY,EAAuB,MAAM,EAAG,CAElC,IAAMF,EADSE,EAAuB,MACV,IAAKD,GAAUA,EAAM,OAAO,EAAE,KAAK,IAAI,EACnE,OAAO,IAAIZ,GAAI,CACb,KAAM,mBACN,QAASW,CACX,CAAC,CACH,CACF,CAEA,IAAMI,EAAS,MAAMP,EAAQ,wBAAwB,gBAAgBH,CAAY,EACjF,OAAIU,EAAO,MAAM,EACR,IAAIf,GACTe,EAAO,iBAAiBC,GACpBD,EAAO,MACPA,EAAO,QAAU,mBACf,CAAE,KAAM,kBAAmB,EAC3B,CACE,KAAM,gBACN,MAAOA,EAAO,KAChB,CACR,EAEKA,CACT,CACF,CAAC,CACH,EACA,uBAAyBE,IAChB,CACL,KAAM,UACN,OAAQA,CACV,GAEF,aAAeL,GAAgC,CAC7C,OAAQA,EAAM,KAAM,CAClB,IAAK,mBACH,OAAOM,GAAiC,EAC1C,IAAK,yBACH,OAAON,EAAM,QACf,IAAK,mBACH,OAAO,KAAK,UAAU,CACpB,UAAAf,EACA,UAAW,aACX,QAASe,EAAM,OACjB,CAAC,EACH,IAAK,gBACH,OAAO,KAAK,UAAU,CACpB,UAAAf,EACA,GAAGsB,GAA2BP,EAAM,KAAK,CAC3C,CAAC,CACL,CACF,CACF,CAAC,CAEL,CAAC,EAED,OAAOxB,CACT,Ea5MA,OAAS,OAAAgC,GAAK,MAAAC,OAAU,gBACxB,OAAS,KAAAC,OAAS,MASlB,IAAMC,GAAe,CACnB,OAAQC,GAAE,OAAO,CACnB,EAOaC,GAAsBC,GAA8C,CAC/E,IAAMC,EAAkB,IAAIC,EAAK,CAC/B,OAAAF,EACA,KAAM,gBACN,YACE,qGACF,aAAAH,GACA,YAAa,CACX,MAAO,gBACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MAAO,CAAE,OAAAM,CAAO,EAAG,CAAE,UAAAC,EAAW,SAAAC,CAAS,IAA+B,CAChF,IAAMC,EAASC,EAAU,EAEzB,OAAO,MAAMN,EAAgB,cAAwC,CACnE,UAAAG,EACA,SAAAC,EACA,KAAM,CAAE,OAAAF,CAAO,EACf,SAAU,SAAY,CACpB,IAAMK,EAAsB,MAAMC,GAAsB,cAAc,CACpE,OAAAN,EACA,YAAa,CAAE,OAAAG,EAAQ,UAAAF,EAAW,OAAAJ,CAAO,CAC3C,CAAC,EAED,OAAKQ,EAAoB,QAOlB,IAAIE,GACT,MAAMC,EAAW,CACf,OAAAL,EACA,UAAAF,EACA,OAAAJ,EACA,UAAW,CAAC,wBAAwB,EACpC,SAAUY,EAAmBP,CAAQ,EACrC,SAAU,MAAOQ,GACR,MAAMA,EAAQ,aAAa,cAAc,CAC9C,OAAAV,EACA,OAAQU,EAAQ,MAClB,CAAC,CAEL,CAAC,CACH,EApBS,IAAIC,GAAI,CACb,KAAM,mBACN,QAASN,EAAoB,OAC/B,CAAC,CAkBL,EACA,uBAAyBO,IAChB,CACL,KAAM,UACN,OAAQA,CACV,GAEF,aAAeC,GAA4B,CACzC,OAAQA,EAAM,KAAM,CAClB,IAAK,mBACH,OAAOA,EAAM,OACjB,CACF,CACF,CAAC,CACH,CACF,CAAC,EAED,OAAOf,CACT,ECpFA,OAAS,OAAAgB,GAAK,MAAAC,OAAU,gBACxB,OAAS,KAAAC,OAAS,MCAX,SAASC,GAA2BC,EAAiC,CAG1E,MAAO,CACL,QAAS,GACT,QAAS,CACP,CACE,KAAM,QACN,KAPa,OAAO,KAAKA,CAAO,EAAE,SAAS,QAAQ,EAQnD,SAAU,WACZ,CACF,CACF,CACF,CDHA,IAAMC,GAAe,CACnB,OAAQC,GAAE,OAAO,EACjB,MAAOA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EACjC,OAAQA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,CACpC,EAOaC,GAAuBC,GAA8C,CAChF,IAAMC,EAAmB,IAAIC,EAAK,CAChC,OAAAF,EACA,KAAM,iBACN,YACE,oKACF,aAAAH,GACA,YAAa,CACX,MAAO,iBACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,OAAAM,EAAQ,MAAAC,EAAO,OAAAC,CAAO,EACxB,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EAEzB,OAAO,MAAMR,EAAiB,cAAyC,CACrE,UAAAK,EACA,SAAAC,EACA,KAAM,CAAE,OAAAJ,CAAO,EACf,SAAU,SAAY,CACpB,IAAMO,EAAsB,MAAMC,GAAsB,cAAc,CACpE,OAAAR,EACA,YAAa,CAAE,OAAAK,EAAQ,UAAAF,EAAW,OAAAN,CAAO,CAC3C,CAAC,EAED,OAAKU,EAAoB,QAOlB,IAAIE,GACT,MAAMC,EAAW,CACf,OAAAL,EACA,UAAAF,EACA,OAAAN,EACA,UAAW,CAAC,wBAAwB,EACpC,SAAUc,EAAmBP,CAAQ,EACrC,SAAU,MAAOQ,GACR,MAAMA,EAAQ,aAAa,eAAe,CAC/C,OAAAZ,EACA,OAAQY,EAAQ,OAChB,MAAAX,EACA,OAAAC,EACA,WAAY,MACd,CAAC,CAEL,CAAC,CACH,EAvBS,IAAIW,GAAI,CACb,KAAM,mBACN,QAASN,EAAoB,OAC/B,CAAC,CAqBL,EACA,uBAAyBO,IAChB,CACL,KAAM,UACN,OAAQA,CACV,GAEF,iBAAkBC,GAClB,aAAeC,GAA6B,CAC1C,OAAQA,EAAM,KAAM,CAClB,IAAK,mBACH,OAAOA,EAAM,OACjB,CACF,CACF,CAAC,CACH,CACF,CAAC,EAED,OAAOlB,CACT,EE9FA,OAAS,MAAAmB,OAAU,gBACnB,OAAS,KAAAC,OAAS,MCFlB,OAAS,KAAAC,OAAS,MAQlB,IAAMC,GAAoBC,GAAE,KAAK,CAC/B,UACA,aACA,YACA,iBACA,SACA,YACA,OACA,cACA,aACA,YACA,cACA,cACA,YACA,OACA,QACA,YACA,cACA,sBACA,cACF,CAAC,EAIKC,GAAiE,CACrE,QAAS,CAAC,KAAM,IAAI,EACpB,WAAY,CAAC,KAAM,IAAI,EACvB,UAAW,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC1C,eAAgB,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC/C,OAAQ,CAAC,KAAM,IAAI,EACnB,UAAW,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC1C,KAAM,CAAC,KAAM,IAAI,EACjB,YAAa,CAAC,KAAM,IAAI,EACxB,WAAY,CAAC,KAAM,IAAI,EACvB,UAAW,CAAC,KAAM,IAAI,EACtB,YAAa,CAAC,KAAM,IAAI,EACxB,YAAa,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC5C,UAAW,CAAC,KAAM,IAAI,EACtB,KAAM,CAAC,KAAM,IAAI,EACjB,MAAO,CAAC,KAAM,IAAI,EAClB,UAAW,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC1C,YAAa,CAAC,KAAM,IAAI,EACxB,oBAAqB,CAAC,KAAM,IAAI,EAChC,aAAc,CAAC,KAAM,IAAI,CAC3B,EAEMC,GAA0BF,GAAE,OAAO,CACvC,MAAOD,GACP,SAAUI,GACV,MAAOH,GAAE,OAAO,CAClB,CAAC,EAIM,SAASI,GAAkCC,EAA8B,CAC9E,OAAOC,GAA4D,CACjE,aAAAD,EACA,wBAAAJ,GACA,kBAAmBF,EACrB,CAAC,CACH,CDtDA,IAAMQ,GAAe,CACnB,OAAQC,GAAE,OAAO,EAAE,SAAS,EAC5B,SAAUA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EACpC,MAAOA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,CACnC,EAEaC,GAAoBC,GAA8C,CAC7E,IAAMC,EAAgB,IAAIC,EAAK,CAC7B,OAAAF,EACA,KAAM,aACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA0BbG,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2FAYxB,aAAAN,GACA,YAAa,CACX,MAAO,aACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,OAAAO,EAAQ,SAAAC,EAAU,MAAAC,CAAM,EAC1B,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACnBC,EAAkBP,EAASQ,GAAkCR,CAAM,EAAI,OAE7E,OAAO,MAAMH,EAAc,cAAc,CACvC,UAAAM,EACA,SAAAC,EACA,KAAM,CAAC,EACP,SAAU,SACD,IAAIK,GACT,MAAMC,EAAW,CACf,OAAAL,EACA,UAAAF,EACA,OAAAP,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAUe,EAAmBP,CAAQ,EACrC,SAAU,MAAOQ,GACD,MAAMC,GAAS,CAC3B,WAAY,CACV,SAAAZ,EACA,MAAOI,EAAO,eACV,KAAK,IAAIA,EAAO,eAAgBH,GAAS,OAAO,gBAAgB,EAChEA,CACN,EACA,UAAW,MAAOY,GAAe,CAC/B,GAAM,CAAE,WAAAC,EAAY,MAAOC,CAAK,EAC9B,MAAMJ,EAAQ,aAAa,kBAAkB,CAC3C,OAAQA,EAAQ,OAChB,OAAQL,GAAmB,GAC3B,uBAAwB,GACxB,SAAUO,EAAW,SACrB,WAAYA,EAAW,UACzB,CAAC,EAEH,MAAO,CAAE,WAAAC,EAAY,KAAAC,CAAK,CAC5B,CACF,CAAC,CAIL,CAAC,CACH,EAEF,uBAAyBC,GACvBC,GAAe,CAAE,MAAAD,EAAO,eAAgBZ,EAAO,cAAe,CAAC,CACnE,CAAC,CACH,CACF,CAAC,EAED,OAAOR,CACT,EAEO,SAASqB,GAAe,CAC7B,MAAAD,EACA,eAAAE,CACF,EAGmC,CACjC,GAAIF,EAAM,SAAW,EACnB,MAAO,CACL,KAAM,QACN,QAAS,oFACX,EAGF,GAAM,CAAE,WAAAG,EAAY,YAAAC,CAAY,EAAIF,EASpC,OARIC,IACFH,EAAQA,EAAM,OAAQK,GAAUA,EAAK,SAAS,GAAKF,EAAW,IAAIE,EAAK,QAAQ,EAAE,EAAI,EAAM,GAGzFD,IACFJ,EAAQA,EAAM,OAAQK,GAAUA,EAAK,UAAU,GAAKD,EAAY,IAAIC,EAAK,SAAS,EAAE,EAAI,EAAM,GAG5FL,EAAM,SAAW,EACZ,CACL,KAAM,QACN,QAAS,CACP,uFACA,iFACF,EAAE,KAAK,GAAG,CACZ,EAGK,CACL,KAAM,UACN,OAAQA,CACV,CACF,CE/JA,OAAS,OAAAM,GAAK,MAAAC,OAAU,gBACxB,OAAS,KAAAC,OAAS,MAUlB,IAAMC,GAAe,CACnB,WAAYC,GAAE,OAAO,CACvB,EAOaC,GAAsBC,GAA8C,CAC/E,IAAMC,EAAkB,IAAIC,EAAK,CAC/B,OAAAF,EACA,KAAM,eACN,YACE,uHACF,aAAAH,GACA,YAAa,CACX,MAAO,eACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MAAO,CAAE,WAAAM,CAAW,EAAG,CAAE,UAAAC,EAAW,SAAAC,CAAS,IAA+B,CACpF,IAAMC,EAASC,EAAU,EAEzB,OAAO,MAAMN,EAAgB,cAA0C,CACrE,UAAAG,EACA,SAAAC,EACA,KAAM,CAAE,WAAAF,CAAW,EACnB,SAAU,SAAY,CACpB,IAAMK,EAA0B,MAAMC,GAAsB,kBAAkB,CAC5E,WAAAN,EACA,YAAa,CAAE,OAAAG,EAAQ,UAAAF,EAAW,OAAAJ,CAAO,CAC3C,CAAC,EAED,OAAKQ,EAAwB,QAOtB,IAAIE,GACT,MAAMC,EAAW,CACf,OAAAL,EACA,UAAAF,EACA,OAAAJ,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAUY,EAAmBP,CAAQ,EACrC,SAAU,MAAOQ,GAAY,CAE3B,IAAMC,EACJN,EAAwB,SACvB,MAAMK,EAAQ,iBAAiB,YAAY,CAC1C,WAAAV,EACA,OAAQU,EAAQ,MAClB,CAAC,EAIH,GAAIC,EAAS,MAAO,CAClB,IAAMC,EAAQ,MAAMF,EAAQ,aAAa,sBAAsB,CAC7D,WAAAV,EACA,OAAQU,EAAQ,OAChB,uBAAwB,EAC1B,CAAC,EAEDC,EAAS,MAAM,KAAOC,CACxB,CAEA,OAAOD,CACT,CACF,CAAC,CACH,EArCS,IAAIE,GAAI,CACb,KAAM,uBACN,QAASR,EAAwB,OACnC,CAAC,CAmCL,EACA,uBAAyBM,IAChB,CACL,KAAM,UACN,OAAQA,CACV,GAEF,aAAeG,GAA4B,CACzC,OAAQA,EAAM,KAAM,CAClB,IAAK,uBACH,OAAOA,EAAM,OACjB,CACF,CACF,CAAC,CACH,CACF,CAAC,EAED,OAAOhB,CACT,ECtGA,OAAS,MAAAiB,OAAU,gBACnB,OAAS,KAAAC,OAAS,MCFlB,OAAS,KAAAC,OAAS,MAQlB,IAAMC,GAAoBC,GAAE,KAAK,CAC/B,YACA,aACA,cACA,iBACA,YACA,cACA,OACA,cACA,aACA,YACA,cACA,aACA,OACA,oBACA,OACA,WACF,CAAC,EAIKC,GAAiE,CACrE,UAAW,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC1C,WAAY,CAAC,KAAM,IAAI,EACvB,YAAa,CAAC,IAAI,EAClB,eAAgB,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC/C,UAAW,CAAC,IAAI,EAChB,YAAa,CAAC,IAAI,EAClB,KAAM,CAAC,KAAM,IAAI,EACjB,YAAa,CAAC,KAAM,IAAI,EACxB,WAAY,CAAC,KAAM,IAAI,EACvB,UAAW,CAAC,KAAM,IAAI,EACtB,YAAa,CAAC,KAAM,IAAI,EACxB,WAAY,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAC3C,KAAM,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EACrC,kBAAmB,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,EAClD,KAAM,CAAC,KAAM,IAAI,EACjB,UAAW,CAAC,KAAM,KAAM,MAAO,KAAM,KAAK,CAC5C,EAEMC,GAA0BF,GAAE,OAAO,CACvC,MAAOD,GACP,SAAUI,GACV,MAAOH,GAAE,OAAO,CAClB,CAAC,EAIM,SAASI,GAAsCC,EAA8B,CAClF,OAAOC,GAA4D,CACjE,aAAAD,EACA,wBAAAJ,GACA,kBAAmBF,EACrB,CAAC,CACH,CDhDA,IAAMQ,GAAe,CACnB,OAAQC,GAAE,OAAO,EAAE,SAAS,EAC5B,SAAUA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EACpC,MAAOA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,CACnC,EAEaC,GAAwBC,GAA8C,CACjF,IAAMC,EAAoB,IAAIC,EAAK,CACjC,OAAAF,EACA,KAAM,iBACN,YAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuBbG,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6FAYxB,aAAAN,GACA,YAAa,CACX,MAAO,iBACP,aAAc,GACd,cAAe,EACjB,EACA,SAAU,MACR,CAAE,OAAAO,EAAQ,SAAAC,EAAU,MAAAC,CAAM,EAC1B,CAAE,UAAAC,EAAW,SAAAC,CAAS,IACM,CAC5B,IAAMC,EAASC,EAAU,EACnBC,EAAkBP,EAASQ,GAAsCR,CAAM,EAAI,OAEjF,OAAO,MAAMH,EAAkB,cAAc,CAC3C,UAAAM,EACA,SAAAC,EACA,KAAM,CAAC,EACP,SAAU,SACD,IAAIK,GACT,MAAMC,EAAW,CACf,OAAAL,EACA,UAAAF,EACA,OAAAP,EACA,UAAW,CAAC,sBAAsB,EAClC,SAAUe,EAAmBP,CAAQ,EACrC,SAAU,MAAOQ,GACG,MAAMC,GAAS,CAC/B,WAAY,CACV,SAAAZ,EACA,MAAOI,EAAO,eACV,KAAK,IAAIA,EAAO,eAAgBH,GAAS,OAAO,gBAAgB,EAChEA,CACN,EACA,UAAW,MAAOY,GAAe,CAC/B,GAAM,CAAE,WAAAC,EAAY,UAAWC,CAAK,EAClC,MAAMJ,EAAQ,iBAAiB,sBAAsB,CACnD,OAAQA,EAAQ,OAChB,OAAQL,GAAmB,GAC3B,SAAUO,EAAW,SACrB,WAAYA,EAAW,UACzB,CAAC,EAEH,MAAO,CAAE,WAAAC,EAAY,KAAAC,CAAK,CAC5B,CACF,CAAC,CAIL,CAAC,CACH,EAEF,uBAAyBC,GACvBC,GAAmB,CAAE,UAAAD,EAAW,eAAgBZ,EAAO,cAAe,CAAC,CAC3E,CAAC,CACH,CACF,CAAC,EAED,OAAOR,CACT,EAEO,SAASqB,GAAmB,CACjC,UAAAD,EACA,eAAAE,CACF,EAGuC,CACrC,GAAIF,EAAU,SAAW,EACvB,MAAO,CACL,KAAM,QACN,QACE,wFACJ,EAGF,GAAM,CAAE,WAAAG,EAAY,YAAAC,CAAY,EAAIF,EAWpC,OAVIC,IACFH,EAAYA,EAAU,OAAQK,GAC5BA,EAAS,SAAS,GAAKF,EAAW,IAAIE,EAAS,QAAQ,EAAE,EAAI,EAC/D,GAGED,IACFJ,EAAYA,EAAU,OAAQK,GAAaD,EAAY,IAAIC,EAAS,EAAE,CAAC,GAGrEL,EAAU,SAAW,EAChB,CACL,KAAM,QACN,QAAS,CACP,2FACA,qFACF,EAAE,KAAK,GAAG,CACZ,EAGK,CACL,KAAM,UACN,OAAQA,CACV,CACF,CE/IO,IAAMM,GAAgB,CAC3BC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,E/IpBO,IAAMC,GAAa,cACbC,GAAgBC,GAAI,QACpBC,GAAY,GAAGH,EAAU,IAAIC,EAAa,GAI1CG,GAAN,cAAqBC,EAAU,CAC3B,KACA,QAUQ,YAEjB,IAAI,YAAqC,CACvC,OAAO,KAAK,aAAe,KAAK,OAAO,iBAAiB,CAC1D,CAEA,YAAY,CAAE,WAAAC,CAAW,EAAiC,CAAC,EAAG,CAC5D,MACE,CACE,KAAMN,GACN,QAASC,EACX,EACA,CACE,aAAc,CACZ,QAAS,CAAC,EACV,MAAO,CAAC,CACV,CACF,CACF,EAEA,KAAK,KAAOD,GACZ,KAAK,QAAUC,GACf,KAAK,YAAcK,CACrB,CAEA,cAAgB,MAAOC,GAA8C,CACnE,OAAW,CACT,KAAAC,EACA,YAAAC,EACA,aAAAC,EACA,YAAAC,EACA,SAAAC,CACF,IAAK,KAAK,oBAAoBL,CAAQ,EACpC,KAAK,KACHC,EACA,MAAMK,GAAS,KAAKJ,CAAW,EAC/B,MAAMI,GAAS,KAAKH,CAAY,EAChC,MAAMG,GAAS,KAAKF,CAAW,EAC/B,MAAME,GAAS,KAAKD,CAAQ,CAC9B,CAEJ,EAEA,wBAA0B,IAAY,CACpC,KAAK,OAAO,kBAAkBE,GAAuB,MAAOC,IAC1DC,GAAY,KAAMD,EAAQ,OAAO,KAAK,EAC/B,CAAC,EACT,CACH,EAEQ,oBAAuBR,GAAiD,CAC9E,GAAM,CAAE,aAAAU,EAAc,aAAAC,CAAa,EAAIC,EAAU,EAG3CC,EADQC,GAAc,IAAKC,GAAgBA,EAAY,KAAMf,CAAQ,CAAC,EAC9C,OAAQgB,GAChCN,EAAa,OAAS,EACjBA,EAAa,SAASM,EAAK,IAAI,EAGpCL,EAAa,OAAS,EACjB,CAACA,EAAa,SAASK,EAAK,IAAI,EAGlC,EACR,EAED,GAAIH,EAAgB,SAAW,EAC7B,MAAM,IAAI,MAAM;AAAA;AAAA,+BAESI,GAAU,KAAK,IAAI,CAAC;AAAA,6BACtBN,EAAa,KAAK,IAAI,CAAC;AAAA,6BACvBD,EAAa,KAAK,IAAI,CAAC;AAAA,SAC3C,EAGL,OAAOG,CACT,CACF,EgJ3GA,OAAS,iCAAAK,OAAqC,qDAC9C,OAAS,uBAAAC,OAAyC,qCAClD,OAAOC,OAAU,OACjB,OAAOC,OAAoD,UAC3D,OAAOC,IAAM,cAAAC,OAAkB,KAC/B,OAAOC,OAAU,OACjB,OAAOC,OAAW,QCNlB,OAAS,iCAAAC,OAAqC,qDAC9C,OAAS,cAAAC,OAAkB,SAS3B,IAAMC,GAA6C,CAAC,EAEvCC,GAAgB,CAAC,CAC5B,WAAAC,CACF,IAEqC,CACnC,IAAMC,EAAY,IAAIL,GAA8B,CAClD,mBAAoB,IAAMC,GAAW,EACrC,qBAAuBK,GAAc,CACnCJ,GAASI,CAAS,EAAI,CAAE,UAAAD,EAAW,WAAAD,CAAW,CAChD,CACF,CAAC,EAED,OAAAC,EAAU,QAAU,IAAM,CACpBA,EAAU,WACZE,GAAcF,EAAU,SAAS,CAErC,EAEOA,CACT,EAEaG,GAAcF,GAClBJ,GAASI,CAAS,EAGrBC,GAAiBD,GAA4B,CACjD,OAAOJ,GAASI,CAAS,CAC3B,EClCO,SAASG,GAAwBC,EAAcC,EAAeC,EAA0B,CAC7F,IAAMC,EAAUH,EAAI,QAAQ,sBAAsB,EAGlD,GAAI,CAACG,EAAS,CACZD,EAAK,EACL,MACF,CAGA,IAAME,EAAoB,CAAC,aAAc,aAAc,YAAY,EACnE,GAAI,CAACA,EAAkB,SAASD,CAAiB,EAAG,CAClDF,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,QAAS,MACT,MAAO,CACL,KAAM,OACN,QAAS,+BACT,KAAM,CAAE,UAAWG,EAAmB,UAAWD,CAAQ,CAC3D,EACA,GAAI,IACN,CAAC,EACD,MACF,CAEAD,EAAK,CACP,CC9BA,OAAS,oBAAAG,GAAkB,mBAAAC,OAAkC,SAE7D,OAAS,gBAAAC,OAAoB,KCQtB,SAASC,GAAyBC,EAAgC,CACvEA,EAAI,IAAI,0CAA2C,CAACC,EAAMC,IAAQ,CAChE,IAAMC,EAASC,EAAU,EAAE,MAAM,OACjCF,EAAI,KAAK,CACP,OAAQC,EACR,uBAAwB,GAAGA,CAAM,mBACjC,eAAgB,GAAGA,CAAM,eACzB,sBAAuB,GAAGA,CAAM,kBAChC,yBAA0B,CAAC,MAAM,EACjC,sBAAuB,CAAC,qBAAsB,gBAAiB,oBAAoB,EACnF,iCAAkC,CAAC,MAAM,EACzC,iBAAkB,CAAC,EACnB,sCAAuC,CAAC,sBAAuB,oBAAoB,EACnF,wBAAyB,CAAC,QAAQ,EAClC,sCAAuC,EACzC,CAAC,CACH,CAAC,CACH,CCfO,SAASE,GAAuBC,EAAgC,CACrEA,EAAI,IAAI,wCAAyC,CAACC,EAAMC,IAAQ,CAC9D,IAAMC,EAASC,EAAU,EAAE,MAAM,OACjCF,EAAI,KAAK,CACP,SAAU,GAAGC,CAAM,IAAIE,EAAU,GACjC,sBAAuB,CAACF,CAAM,EAC9B,yBAA0B,CAAC,QAAQ,CACrC,CAAC,CACH,CAAC,CACH,CClBA,OAAS,kBAAAG,OAAsB,OAC/B,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBAChC,OAAS,aAAAC,OAAiB,uBAgBnB,SAASC,GAAeC,EAAuC,CACpE,MAAO,OACLC,EACAC,EACAC,IACkB,CAClB,IAAMC,EAAaH,EAAI,QAAQ,cAE/B,GAAI,CAACG,GAAc,CAACA,EAAW,WAAW,SAAS,EAAG,CAEpD,GAAIH,EAAI,SAAW,OAASA,EAAI,QAAQ,QAAQ,SAAS,mBAAmB,EAAG,CAC7EC,EAAI,UAAU,IAAK,CACjB,eAAgB,oBAChB,gBAAiB,WACjB,WAAY,YACd,CAAC,EACDA,EAAI,MAAM;AAAA,CAAgB,EAC1BA,EAAI,MACF;AAAA;AAAA,CACF,EACAA,EAAI,IAAI,EACR,MACF,CAEA,IAAMG,EAAU,GAAGJ,EAAI,QAAQ,MAAMA,EAAI,IAAI,MAAM,CAAC,GACpDC,EACG,OAAO,GAAG,EACV,OACC,mBACA,0CAA0CG,CAAO,wCACnD,EACC,KAAK,CACJ,MAAO,eACP,kBAAmB,6CACrB,CAAC,EACH,MACF,CAEA,IAAMC,EAAQF,EAAW,MAAM,CAAC,EAC1BG,EAAS,MAAMC,GAAkBF,EAAON,CAAU,EAExD,GAAIO,EAAO,MAAM,EAAG,CAElB,GAAIN,EAAI,SAAW,OAASA,EAAI,QAAQ,QAAQ,SAAS,mBAAmB,EAAG,CAC7EC,EAAI,UAAU,IAAK,CACjB,eAAgB,oBAChB,gBAAiB,WACjB,WAAY,YACd,CAAC,EACDA,EAAI,MAAM;AAAA,CAAgB,EAC1BA,EAAI,MAAM,0DAA0DK,EAAO,KAAK;AAAA;AAAA,CAAQ,EACxFL,EAAI,IAAI,EACR,MACF,CAEAA,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,gBACP,kBAAmBK,EAAO,KAC5B,CAAC,EACD,MACF,CACAN,EAAI,KAAOM,EAAO,MAClBJ,EAAK,CACP,CACF,CAaA,eAAeK,GACbF,EACAG,EACmC,CACnC,IAAMC,EAASC,EAAU,EAEzB,GAAI,CACF,GAAM,CAAE,UAAAC,CAAU,EAAI,MAAMC,GAAeP,EAAOG,CAAa,EACzDK,EAAU,KAAK,MAAM,IAAI,YAAY,EAAE,OAAOF,CAAS,CAAC,EAExDG,EAAiBC,GAA6B,UAAUF,CAAO,EACrE,GAAI,CAACC,EAAe,QAClB,OAAOE,GAAI,yBAAyBC,GAAUH,EAAe,KAAK,EAAE,SAAS,CAAC,EAAE,EAGlF,GAAM,CAAE,IAAAI,EAAK,IAAAC,EAAK,IAAAC,EAAK,SAAAC,CAAS,EAAIP,EAAe,KACnD,GAAII,IAAQT,EAAO,MAAM,QAAUU,IAAQG,IAAYF,EAAM,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAGvF,OAAO,IAAIJ,GAAI,iCAAiC,EAGlD,IAAIO,EACJ,GAAId,EAAO,OAAS,QAAS,CAC3B,IAAMK,EAAiBU,GAAqB,UAAUX,CAAO,EAC7D,GAAI,CAACC,EAAe,QAClB,OAAOE,GAAI,yBAAyBC,GAAUH,EAAe,KAAK,EAAE,SAAS,CAAC,EAAE,EAGlF,GAAM,CACJ,mBAAAW,EACA,oBAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,cAAAC,EACA,IAAAC,CACF,EAAIhB,EAAe,KAEnB,GAAIa,EAAmB,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EACjD,OAAO,IAAIX,GAAI,iCAAiC,EAGlDO,EAAkB,CAChB,SAAUO,EACV,OAAQF,EACR,OAAQC,EACR,YAAaJ,EACb,aAAcC,CAChB,CACF,KAAO,CACL,GAAM,CAAE,cAAAE,EAAe,cAAAC,EAAe,IAAAC,CAAI,EAAIhB,EAAe,KAC7DS,EAAkB,CAChB,SAAUO,EACV,OAAQD,EACR,GAAID,EAAgB,CAAE,OAAQA,CAAc,EAAI,CAAC,CACnD,CACF,CAEA,OAAOG,GAAG,CACR,MAAA1B,EACA,SAAAgB,EACA,OAAQ,CAAC,EACT,UAAWR,EAAQ,IACnB,MAAOU,CACT,CAAC,CACH,MAAQ,CACN,OAAO,IAAIP,GAAI,iCAAiC,CAClD,CACF,CCtKA,OAAOgB,OAAgB,cACvB,OAAS,eAAAC,GAAa,cAAAC,OAAkB,SAExC,OAAS,QAAAC,OAAY,MACrB,OAAS,iBAAAC,OAAqB,YAC9B,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBAChC,OAAS,aAAAC,OAAiB,uBCNnB,SAASC,GAASC,EAA8B,CACrD,GAAI,CACF,OAAO,IAAI,IAAIA,CAAG,CACpB,MAAQ,CACN,MACF,CACF,CCDO,SAASC,GACdC,EACAC,KACGC,EACa,CAGhB,OAAID,EAAQ,WACH,WAAW,IAAM,CACtBF,GAAeC,EAAUC,EAAQ,WAAW,GAAGC,CAAI,CACrD,EAAG,UAAS,EAGP,WAAWF,EAAUC,EAAO,GAAGC,CAAI,CAC5C,CCfO,IAAMC,GAAsB,IAAIC,GAAoC,CACzE,wBAAyBC,EAC3B,CAAC,ECND,OAAS,YAAAC,OAAgB,eAIzB,IAAIC,GAA+B,KAE5B,SAASC,IAA2B,CACzC,OAAKD,KACHA,GAAc,IAAIE,GAClBF,GAAY,WAAWG,EAAU,EAAE,MAAM,UAAU,GAG9CH,EACT,CCbA,OAAS,cAAAI,OAAkB,SAQpB,SAASC,GAAsBC,EAA0B,CAC9D,OAAOF,GAAW,QAAQ,EAAE,OAAOE,CAAQ,EAAE,OAAO,WAAW,CACjE,CCVO,SAASC,GAAmBC,EAA+B,CAChE,GAAI,OAAOA,GAAgB,SACzB,MAAO,GAGT,GAAI,CACF,IAAMC,EAAM,IAAI,IAAID,CAAW,EAG/B,OAAIC,EAAI,WAAa,SACZ,GAILA,EAAI,WAAa,QACZA,EAAI,WAAa,aAAeA,EAAI,WAAa,YAItD,EAAAA,EAAI,SAAS,MAAM,4BAA4B,CAKrD,MAAQ,CACN,MAAO,EACT,CACF,CNAO,SAASC,GACdC,EACAC,EACM,CACN,IAAMC,EAASC,EAAU,EAEzBH,EAAI,IAAI,mBAAoB,MAAOI,EAAKC,IAAQ,CAC9C,IAAMC,EAASC,GAAmB,UAAUH,EAAI,KAAK,EAErD,GAAI,CAACE,EAAO,QAAS,CACnBD,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmBG,GAAUF,EAAO,KAAK,EAAE,SAAS,CACtD,CAAC,EACD,MACF,CAEA,GAAM,CAAE,UAAAG,EAAW,aAAAC,EAAc,cAAAC,EAAe,eAAAC,EAAgB,sBAAAC,EAAuB,MAAAC,CAAM,EAC3FR,EAAO,KAEHS,EAAcC,GAASP,CAAS,EACtC,GAAIM,EAAa,CAEf,IAAME,EAAe,MAAMC,GAAyBH,CAAW,EAC/D,GAAIE,EAAa,MAAM,EAAG,CACxBZ,EAAI,OAAO,GAAG,EAAE,KAAKY,EAAa,KAAK,EACvC,MACF,CAEA,GAAM,CAAE,cAAAE,EAAe,eAAAC,CAAe,EAAIH,EAAa,MAEvD,GAAIG,GAAkB,CAACA,EAAe,KAAMC,IAASA,KAASV,CAAa,EAAG,CAC5EN,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,4BACP,kBAAmB,8BAA8BM,CAAa,EAChE,CAAC,EACD,MACF,CAEA,GAAIQ,GAAiB,CAACA,EAAc,SAAST,CAAY,EAAG,CAC1DL,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmB,yBAAyBK,CAAY,EAC1D,CAAC,EACD,MACF,CACF,CAEA,GAAIC,IAAkB,OAAQ,CAC5BN,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,4BACP,kBAAmB,2CACrB,CAAC,EACD,MACF,CAEA,GAAIQ,IAA0B,OAAQ,CACpCR,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmB,8CACrB,CAAC,EACD,MACF,CAEA,GAAI,CAACiB,GAAmBZ,CAAY,EAAG,CACrCL,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmB,yBAAyBK,CAAY,EAC1D,CAAC,EACD,MACF,CAGA,IAAMa,EAAeC,GAAY,EAAE,EAAE,SAAS,KAAK,EAC7CC,EAAUD,GAAY,EAAE,EAAE,SAAS,KAAK,EAExCE,EAAkBC,GAAW,EAE7BC,EAAuB,KAAK,MAAM,KAAK,OAAO,EAAK,EAAY,EAAI,GACnEC,EAAsBL,GAAYI,CAAoB,EAAE,SAAS,KAAK,EACtEE,EAAuBC,GAAsBF,CAAmB,EACtE5B,EAAsB,IAAIwB,EAAS,CACjC,SAAUhB,EACV,YAAaC,EACb,cAAeE,EACf,MAAOE,GAAS,GAChB,aAAAS,EACA,gBAAAG,EACA,oBAAAG,CACF,CAAC,EAGDG,GAAe,IAAM/B,EAAsB,OAAOwB,CAAO,EAAGvB,EAAO,MAAM,kBAAkB,EAG3F,IAAM+B,EAAS/B,EAAO,QAAUgC,GAC1BC,EAAW,IAAI,IAAI,GAAGF,CAAM,iBAAiB,EACnDE,EAAS,aAAa,IAAI,YAAaT,CAAe,EACtDS,EAAS,aAAa,IAAI,iBAAkBL,CAAoB,EAChEK,EAAS,aAAa,IAAI,wBAAyB,MAAM,EACzDA,EAAS,aAAa,IAAI,gBAAiB,MAAM,EACjDA,EAAS,aAAa,IAAI,eAAgBjC,EAAO,MAAM,WAAW,EAClEiC,EAAS,aAAa,IAAI,QAAS,GAAGV,CAAO,IAAIF,CAAY,EAAE,EAC/DY,EAAS,aAAa,IAAI,YAAaR,GAAW,CAAC,EACnDQ,EAAS,aAAa,IAAI,cAAejC,EAAO,QAAQ,EACxDiC,EAAS,aAAa,IAAI,cAAeC,GAAc1B,EAAcI,GAAS,EAAE,CAAC,EACjFqB,EAAS,aAAa,IAAI,cAAe,aAAa,EAEtD9B,EAAI,SAAS8B,EAAS,SAAS,CAAC,CAClC,CAAC,CACH,CAGA,eAAejB,GACbmB,EAC+E,CAC/E,IAAMC,EAAcD,EAAkB,SAAS,EACzCE,EAAQC,GAAoB,IAAIF,CAAW,EACjD,GAAIC,EACF,OAAOE,GAAGF,CAAK,EAGjB,IAAMG,EAAmBL,EAAkB,SAC3C,GAAI,CAACM,GAAKN,EAAkB,QAAQ,EAClC,GAAI,CAEF,IAAMO,EAAcC,GAAe,EAE/BC,GADgB,MAAMF,EAAY,SAASP,EAAkB,QAAQ,GAC7C,KAAK,OAAO,EACxC,GAAI,CAACS,IAEHA,GADoB,MAAMF,EAAY,SAASP,EAAkB,QAAQ,GACjD,KAAK,OAAO,EAChC,CAACS,GACH,OAAOC,GAAI,CACT,MAAO,kBACP,kBAAmB,yDACrB,CAAC,EAILV,EAAkB,SAAWS,CAC/B,MAAQ,CACN,OAAOC,GAAI,CACT,MAAO,kBACP,kBAAmB,yDACrB,CAAC,CACH,CAQF,GAAI,CALWC,GAAcX,EAAkB,SAAS,EAAG,CACzD,iBAAkB,CAAC,OAAO,EAC1B,oBAAqB,EACvB,CAAC,EAGC,OAAOU,GAAI,CACT,MAAO,kBACP,kBAAmB,oCACrB,CAAC,EAGH,IAAIE,EACJ,GAAI,CACF,IAAMC,EAASC,GAAM,OAAO,EAC5BC,GAAWF,EAAQ,CAAE,QAAS,EAAG,WAAYE,GAAW,gBAAiB,CAAC,EAE1EH,EAAW,MAAMC,EAAO,IAAIb,EAAkB,SAAS,EAAG,CACxD,QAAS,IACT,iBAAkB,EAAI,KACtB,aAAc,EACd,QAAS,CACP,OAAQ,mBACR,KAAMK,CACR,CACF,CAAC,CACH,MAAQ,CACN,OAAOK,GAAI,CACT,MAAO,kBACP,kBAAmB,iCACrB,CAAC,CACH,CAEA,IAAMM,EAAcC,GAAwBL,EAAS,QAAS,cAAc,EAC5E,GAAI,CAACI,EACH,OAAON,GAAI,CACT,MAAO,0BACP,kBAAmB,6DACrB,CAAC,EAIH,GAAI,CADiBM,EAAY,MAAM,GAAG,EAAE,IAAKE,GAAMA,EAAE,KAAK,CAAC,EAC7C,SAAS,kBAAkB,EAC3C,OAAOR,GAAI,CACT,MAAO,0BACP,kBAAmB,iDACrB,CAAC,EAGH,IAAMS,EAAuBC,GAAmB,UAAUR,EAAS,IAAI,EACvE,GAAI,CAACO,EAAqB,QACxB,OAAOT,GAAI,CACT,MAAO,0BACP,kBAAmB,+BAA+BvC,GAAUgD,EAAqB,KAAK,EAAE,SAAS,CAAC,EACpG,CAAC,EAGH,GAAIA,EAAqB,KAAK,YAAclB,EAC1C,OAAOS,GAAI,CACT,MAAO,0BACP,kBAAmB,oBACrB,CAAC,EAGH,IAAMW,EAAeJ,GAAwBL,EAAS,QAAS,eAAe,EAC1EU,EACJ,GAAID,EAAc,CAChB,IAAME,EAAkBF,EACrB,MAAM,GAAG,EACT,IAAKH,GAAMA,EAAE,KAAK,CAAC,EACnB,KAAMA,GAAM,uBAAuB,KAAKA,CAAC,CAAC,EAEzCK,IACFD,EAAqBC,EAAgB,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAE5D,CAEA,IAAIC,EAAgBrB,GAAoB,wBACxC,GAAImB,EAAoB,CACtB,IAAMG,EAA4B,SAASH,CAAkB,EACzD,CAAC,MAAMG,CAAyB,GAAKA,GAA6B,IACpED,EAAgB,KAAK,IAAIE,GAAeD,EAA4B,GAAI,EAE5E,CAEA,OAAID,EAAgB,GAClBrB,GAAoB,IAAIF,EAAakB,EAAqB,KAAMK,CAAa,EAGxEpB,GAAGe,EAAqB,IAAI,CACrC,CAEA,SAASpB,GAAc4B,EAAqBlD,EAAuB,CACjE,IAAMmD,EAAoB,8BAE1B,GAAI,CACF,IAAMC,EAAM,IAAI,IAAIF,CAAW,EAC/B,OAAIE,EAAI,WAAa,UAAYA,EAAI,WAAa,QAC5CF,IAAgB,+BAAiC,IAAI,IAAIlD,CAAK,EAAE,WAAa,UAGxE,wBAGFmD,EACEC,EAAI,WAAa,UACnB,uBAEA,gBAAgBA,EAAI,SAAS,MAAM,EAAG,EAAE,CAAC,GAEpD,MAAQ,CACN,OAAOD,CACT,CACF,COjSA,OAAS,eAAAE,OAAmB,SAE5B,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBAChC,OAAS,aAAAC,OAAiB,uBCH1B,OAAS,UAAAC,OAA8B,eCAvC,OAAS,WAAAC,OAAe,eCAxB,OAAS,KAAAC,OAAS,MAIX,IAAMC,GAAkCC,GAAE,mBAAmB,aAAc,CAChFA,GAAE,OAAO,CACP,WAAYA,GAAE,QAAQ,oBAAoB,EAC1C,KAAMA,GAAE,OAAO,EACf,cAAeA,GAAE,OAAO,EACxB,aAAcA,GAAE,OAAO,EACvB,UAAWA,GAAE,OAAO,CACtB,CAAC,EACDA,GAAE,OAAO,CACP,WAAYA,GAAE,QAAQ,eAAe,EACrC,UAAWA,GAAE,OAAO,EACpB,cAAeA,GAAE,OAAO,EACxB,eAAgBA,GAAE,OAAO,CAC3B,CAAC,CACH,CAAC,EAEYC,GAAmCD,GAC7C,OAAO,CACN,aAAcE,EAAe,cAAc,EAC3C,WAAYF,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EACzC,cAAeE,EAAe,eAAe,EAC7C,YAAaA,EAAe,aAAa,CAC3C,CAAC,EACA,UAAWC,IAAU,CACpB,YAAaA,EAAK,aAClB,iBAAkBA,EAAK,WACvB,aAAcA,EAAK,cACnB,WAAYA,EAAK,WACnB,EAAE,ED5BG,IAAMC,GAAkBC,GAAQ,CACrC,CACE,OAAQ,OACR,KAAM,mBACN,MAAO,QACP,SAAUC,GACV,WAAY,CACV,CACE,KAAM,OACN,KAAM,OACN,OAAQC,EACV,CACF,CACF,CACF,CAAC,EDdM,IAAMC,GAAaC,GACjB,IAAIC,GAAOD,EAAUE,EAAe,EGD7C,eAAsBC,GACpBC,EACAC,EAC6B,CAC7B,OAAO,MAAMC,GAAUF,CAAQ,EAAE,MAAMC,EAAS,CAC9C,QAAS,CACP,eAAgB,oCAChB,aAAcE,EAChB,CACF,CAAC,CACH,CJMO,SAASC,GACdC,EACAC,EACAC,EACM,CACN,IAAMC,EAASC,EAAU,EAEzBJ,EAAI,IAAI,YAAa,MAAOK,EAAKC,IAAQ,CACvC,IAAMC,EAASC,GAAe,UAAUH,EAAI,KAAK,EAEjD,GAAI,CAACE,EAAO,QAAS,CACnBD,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmBG,GAAUF,EAAO,KAAK,EAAE,SAAS,CACtD,CAAC,EACD,MACF,CAEA,GAAM,CAAE,MAAAG,EAAO,KAAAC,EAAM,MAAAC,CAAM,EAAIL,EAAO,KAEtC,GAAIG,EAAO,CACTJ,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,gBACP,kBAAmB,2BACrB,CAAC,EACD,MACF,CAEA,GAAI,CAEF,GAAM,CAACO,EAASC,CAAY,EAAIF,GAAO,MAAM,GAAG,GAAK,CAAC,EAChDG,EAAcd,EAAsB,IAAIY,CAAO,EAErD,GAAI,CAACE,GAAeA,EAAY,eAAiBD,EAAc,CAC7DR,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmB,yBACrB,CAAC,EACD,MACF,CAEA,IAAMU,EAAe,MAAMC,GAA0B,CACnD,OAAQd,EAAO,QAAUe,GACzB,KAAMP,GAAQ,GACd,YAAaR,EAAO,MAAM,YAC1B,SAAUY,EAAY,gBACtB,aAAcA,EAAY,mBAC5B,CAAC,EAED,GAAIC,EAAa,MAAM,EAAG,CACxBV,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmBU,EAAa,KAClC,CAAC,EACD,MACF,CAEA,GAAM,CAAE,YAAAG,EAAa,aAAAC,EAAc,iBAAAC,EAAkB,WAAAC,CAAW,EAAIN,EAAa,MAC3EO,EAAgB,IAAI,IAAI,WAAWD,CAAU,EAAE,EAErD,GAAInB,EAAO,OAAQ,CACjB,IAAMqB,GAAkB,IAAI,IAAIrB,EAAO,MAAM,EAC7C,GAAIoB,EAAc,WAAaC,GAAgB,SAAU,CAGvDlB,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmB,wBAAwBgB,CAAU,eAAe,IAAI,IAAInB,EAAO,MAAM,EAAE,QAAQ,EACrG,CAAC,EACD,MACF,CACF,CAEA,IAAMsB,EAASF,EAAc,SAAS,EAChCG,EAAU,IAAIC,GAAQF,CAAM,EAClCC,EAAQ,eAAeP,EAAa,iBAAiB,EACrD,IAAMS,EAAgB,MAAMF,EAAQ,2BAA2B,wBAAwB,EACvF,GAAIE,EAAc,MAAM,EAAG,CACrBA,EAAc,MAAM,OAAS,eAC/BtB,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,eACP,kBAAmB,oDAAoD,KAAK,UAAUsB,EAAc,KAAK,CAAC,EAC5G,CAAC,EAEDtB,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,eACP,kBACE,mHACJ,CAAC,EAEH,MACF,CAGA,IAAMuB,EAAoBC,GAAY,EAAE,EAAE,SAAS,KAAK,EACxD5B,EAAmB,IAAI2B,EAAmB,CACxC,SAAUd,EAAY,SACtB,YAAaA,EAAY,YACzB,cAAeA,EAAY,cAC3B,KAAMa,EAAc,MAAM,KAC1B,OAAAH,EACA,gBAAiBV,EAAY,gBAC7B,OAAQ,CACN,YAAAI,EACA,aAAAC,EACA,iBAAAC,CACF,EACA,UAAW,KAAK,OAAO,KAAK,IAAI,EAAIlB,EAAO,MAAM,oBAAsB,GAAI,CAC7E,CAAC,EAGDF,EAAsB,OAAOY,CAAO,EAGpC,IAAMkB,EAAc,IAAI,IAAIhB,EAAY,WAAW,EACnDgB,EAAY,aAAa,IAAI,OAAQF,CAAiB,EACtDE,EAAY,aAAa,IAAI,QAAShB,EAAY,KAAK,EAEvDT,EAAI,SAASyB,EAAY,SAAS,CAAC,CACrC,OAASrB,EAAO,CACd,QAAQ,MAAM,wBAAyBA,CAAK,EAC5CJ,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,eACP,kBACE,yEACJ,CAAC,CACH,CACF,CAAC,CACH,CAYA,eAAeW,GAA0B,CACvC,OAAAQ,EACA,KAAAd,EACA,YAAAqB,EACA,SAAAC,EACA,aAAAC,CACF,EAMgD,CAC9C,GAAI,CACF,IAAM3B,EAAS,MAAM4B,GAAeV,EAAQ,CAC1C,WAAY,qBACZ,KAAAd,EACA,aAAcqB,EACd,UAAWC,EACX,cAAeC,CACjB,CAAC,EAED,OAAOE,GAAG7B,CAAM,CAClB,MAAQ,CACN,OAAO8B,GAAI,uCAAuC,CACpD,CACF,CK1LA,OAAOC,OAAa,UAWb,SAASC,GAASC,EAAgC,CACvDA,EAAI,KAAK,kBAAmBC,GAAQ,KAAK,EAAG,CAACC,EAAKC,IAAQ,CACxD,GAAM,CAAE,cAAAC,CAAc,EAAIF,EAAI,KAExBG,EAAwB,CAAC,EAC/B,GAAID,GAAiB,MAAM,QAAQA,CAAa,EAC9C,QAAWE,KAAOF,EAAe,CAC/B,GAAI,CAACG,GAAmBD,CAAG,EAAG,CAC5BH,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,uBACP,kBAAmB,yBAAyBG,CAAG,EACjD,CAAC,EACD,MACF,CAEAD,EAAsB,KAAKC,CAAG,CAChC,CAGF,GAAI,CAAE,2BAAAE,CAA2B,EAAIN,EAAI,MAEvC,CAACM,GACD,OAAOA,GAA+B,UACtC,CAAC,CAAC,sBAAuB,oBAAoB,EAAE,SAASA,CAA0B,KAElFA,EAA6B,uBAK/BL,EAAI,KAAK,CACP,UAAW,oBACX,cAAeE,EACf,YAAa,CAAC,qBAAsB,oBAAoB,EACxD,eAAgB,CAAC,MAAM,EACvB,2BAAAG,EACA,iBAAkB,QACpB,CAAC,CACH,CAAC,CACH,CClDA,OAAoB,eAAAC,GAAa,mBAAAC,OAAuB,SAExD,OAAS,kBAAAC,OAAsB,OAC/B,OAAS,OAAAC,GAAK,MAAAC,OAAkB,gBAChC,OAAS,aAAAC,OAAiB,uBAkBnB,SAASC,GACdC,EACAC,EACAC,EACAC,EACM,CACN,IAAMC,EAASC,EAAU,EAEzBL,EAAI,KAAK,eAAgB,MAAOM,EAAKC,IAAQ,CAC3C,IAAMC,EAASC,GAAe,UAAUH,EAAI,IAAI,EAEhD,GAAI,CAACE,EAAO,QAAS,CACnBD,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,kBACP,kBAAmBG,GAAUF,EAAO,KAAK,EAAE,SAAS,CACtD,CAAC,EACD,MACF,CAEA,IAAMG,EAA0BC,GAAwB,CACtD,SAAUJ,EAAO,KAAK,YAAc,qBACpC,SAAUA,EAAO,KAAK,SACtB,aAAcA,EAAO,KAAK,aAC1B,oBAAqBH,EAAU,EAAE,MAAM,oBACvC,oBAAqBC,EAAI,QAAQ,aACnC,CAAC,EAED,GAAIK,EAAwB,MAAM,EAAG,CACnCJ,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,iBACP,kBAAmBI,EAAwB,KAC7C,CAAC,EACD,MACF,CAEA,GAAI,CACF,OAAQH,EAAO,KAAK,UAAW,CAC7B,IAAK,qBAAsB,CAEzB,GAAM,CAAE,KAAAK,EAAM,aAAAC,CAAa,EAAIN,EAAO,KAChCO,EAAWd,EAAmB,IAAIY,CAAI,EAC5C,GAAI,CAACE,GAAYA,EAAS,UAAY,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAG,CACnEd,EAAmB,OAAOY,CAAI,EAC9BN,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,gBACP,kBAAmB,uCACrB,CAAC,EACD,MACF,CAIA,GAD8BS,GAAsBF,CAAY,IAClCC,EAAS,cAAe,CACpDR,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,gBACP,kBAAmB,uBACrB,CAAC,EACD,MACF,CAGA,IAAMU,EAAiBC,GAAY,EAAE,EAAE,SAAS,KAAK,EAC/CC,EAAc,MAAMC,GAAkBL,EAAUZ,CAAS,EAC/DD,EAAc,IAAIe,EAAgB,CAChC,KAAMF,EAAS,KACf,OAAQA,EAAS,OACjB,SAAUA,EAAS,SACnB,OAAQA,EAAS,OACjB,UAAW,KAAK,OAAO,KAAK,IAAI,EAAIX,EAAO,MAAM,uBAAyB,GAAI,EAC9E,gBAAiBW,EAAS,eAC5B,CAAC,EAEDM,GACE,IAAMnB,EAAc,OAAOe,CAAc,EACzCb,EAAO,MAAM,qBACf,EAEAH,EAAmB,OAAOY,CAAI,EAE9BN,EAAI,KAAK,CACP,aAAcY,EACd,WAAY,SACZ,WAAYf,EAAO,MAAM,qBAAuB,IAChD,cAAea,CACjB,CAAC,EACD,MACF,CACA,IAAK,qBAAsB,CAIzB,IAAME,EAAc,MAAMG,GACxB,CACE,SAAUX,EAAwB,MAAM,SACxC,OAAQP,EAAO,MACjB,EACAD,CACF,EAEAI,EAAI,KAAK,CACP,aAAcY,EACd,WAAY,SACZ,WAAYf,EAAO,MAAM,qBAAuB,GAClD,CAAC,EACD,MACF,CACA,IAAK,gBAAiB,CAEpB,GAAM,CAAE,aAAAmB,CAAa,EAAIf,EAAO,KAC1BgB,EAAYtB,EAAc,IAAIqB,CAAY,EAChD,GAAI,CAACC,GAAaA,EAAU,UAAY,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAG,CAErEtB,EAAc,OAAOqB,CAAY,EACjChB,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,gBACP,kBAAmB,kCACrB,CAAC,EACD,MACF,CAEA,IAAIY,EACE,CAAE,aAAcM,CAAoB,EAAID,EAAU,OAElDE,EAAe,MAAMC,GACzBH,EAAU,OACVC,EACAD,EAAU,eACZ,EAEA,GAAIE,EAAa,MAAM,EAGrBP,EAAc,MAAMC,GAClB,CACE,KAAMI,EAAU,KAChB,SAAUA,EAAU,SACpB,OAAQA,EAAU,OAClB,OAAQA,EAAU,MACpB,EACArB,CACF,MACK,CACL,GAAM,CACJ,YAAayB,EACb,aAAcC,EACd,iBAAAC,CACF,EAAIJ,EAAa,MAEjBP,EAAc,MAAMC,GAClB,CACE,KAAMI,EAAU,KAChB,SAAUA,EAAU,SACpB,OAAQA,EAAU,OAClB,OAAQ,CACN,YAAaI,EACb,aAAcC,EACd,iBAAAC,CACF,CACF,EACA3B,CACF,CACF,CAGAD,EAAc,OAAOqB,CAAY,EACjC,IAAMN,EAAiBC,GAAY,EAAE,EAAE,SAAS,KAAK,EAErDhB,EAAc,IAAIe,EAAgB,CAChC,KAAMO,EAAU,KAChB,OAAQA,EAAU,OAClB,SAAUA,EAAU,SACpB,OAAQA,EAAU,OAClB,UAAW,KAAK,OAAO,KAAK,IAAI,EAAIpB,EAAO,MAAM,uBAAyB,GAAI,EAC9E,gBAAiBoB,EAAU,eAC7B,CAAC,EAEDjB,EAAI,KAAK,CACP,aAAcY,EACd,WAAY,SACZ,WAAYf,EAAO,MAAM,qBAAuB,IAChD,cAAea,CACjB,CAAC,EACD,MACF,CACF,CACF,OAASc,EAAO,CACd,QAAQ,MAAM,wBAAyBA,CAAK,EAC5CxB,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,MAAO,eACP,kBAAmB,uBACrB,CAAC,EACD,MACF,CACF,CAAC,CACH,CASA,eAAea,GAAkBI,EAA0BrB,EAAuC,CAChG,IAAMC,EAASC,EAAU,EAEnB2B,EAAU,KAAK,UAAU,CAC7B,IAAKR,EAAU,KAAK,KACpB,SAAUA,EAAU,SACpB,cAAeA,EAAU,OACzB,cAAeA,EAAU,KAAK,GAC9B,IAAK,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EACjC,IAAK,KAAK,OAAO,KAAK,IAAI,EAAIpB,EAAO,MAAM,sBAAwB,GAAI,EACvE,IAAK6B,GACL,IAAK7B,EAAO,MAAM,OAClB,GAAIA,EAAO,OAAS,QAChB,CACE,mBAAoBoB,EAAU,OAAO,YACrC,oBAAqBA,EAAU,OAAO,aACtC,iBAAkB,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAAIA,EAAU,OAAO,iBACnE,cAAeA,EAAU,KAAK,EAChC,EACA,CAAC,CACP,CAAC,EAMD,OAJY,MAAM,IAAIU,GAAe,IAAI,YAAY,EAAE,OAAOF,CAAO,CAAC,EACnE,mBAAmB,CAAE,IAAK,eAAgB,IAAK,SAAU,CAAC,EAC1D,QAAQ7B,CAAS,CAGtB,CAEA,eAAemB,GACba,EACAhC,EACiB,CACjB,IAAMC,EAASC,EAAU,EACnB2B,EAAU,KAAK,UAAU,CAC7B,IAAKG,EAAkB,SACvB,SAAUA,EAAkB,SAC5B,cAAeA,EAAkB,OACjC,IAAK,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EACjC,IAAK,KAAK,OAAO,KAAK,IAAI,EAAI/B,EAAO,MAAM,sBAAwB,GAAI,EACvE,IAAK6B,GACL,IAAK7B,EAAO,MAAM,MACpB,CAAC,EAMD,OAJY,MAAM,IAAI8B,GAAe,IAAI,YAAY,EAAE,OAAOF,CAAO,CAAC,EACnE,mBAAmB,CAAE,IAAK,eAAgB,IAAK,SAAU,CAAC,EAC1D,QAAQ7B,CAAS,CAGtB,CAEA,eAAewB,GACbS,EACAb,EACAc,EAC6C,CAC7C,GAAI,CACF,IAAM7B,EAAS,MAAM8B,GAAeF,EAAQ,CAC1C,WAAY,gBACZ,cAAeb,EACf,UAAWc,EACX,eAAgB,EAClB,CAAC,EAED,OAAOE,GAAG/B,CAAM,CAClB,MAAQ,CACN,OAAOgC,GAAI,kCAAkC,CAC/C,CACF,CAEA,SAAS5B,GAAwB,CAC/B,SAAA6B,EACA,SAAAJ,EACA,aAAAK,EACA,oBAAAC,EACA,oBAAAC,CACF,EAMyC,CACvC,GAAI,CAACP,GAAY,CAACK,GACZD,EAAU,CACZ,GAAI,CAACG,EACH,OAAOJ,GAAI,kCAAkC,EAG/C,GAAM,CAACK,EAAMC,CAAW,EAAIF,EAAoB,MAAM,GAAG,EACzD,GAAIC,IAAS,QACX,OAAOL,GAAI,4BAA4B,EAIzC,GADA,CAACH,EAAUK,CAAY,EAAI,OAAO,KAAKI,EAAa,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,EAC9E,CAACT,GAAY,CAACK,EAChB,OAAOF,GAAI,4BAA4B,CAE3C,CAGF,GAAI,CAACC,EACH,OAAOF,GAAG,CAAE,SAAU,EAAG,CAAC,EAG5B,GAAI,CAACF,EACH,OAAOG,GAAI,uBAAuB,EAGpC,GAAI,CAACE,EACH,OAAOF,GAAI,2BAA2B,EAGxC,IAAMO,EAAuBJ,IAAsBN,CAAQ,EAC3D,GAAI,CAACU,GAAwBL,EAAa,SAAWK,EAAqB,OACxE,OAAOP,GAAI,4BAA4B,EAGzC,IAAMQ,EAAc,IAAI,YAClBC,EAAqBD,EAAY,OAAON,CAAY,EACpDQ,EAA6BF,EAAY,OAAOD,CAAoB,EAE1E,OACEE,EAAmB,aAAeC,EAA2B,YAC7D,CAACC,GAAgBF,EAAoBC,CAA0B,EAExDV,GAAI,4BAA4B,EAGlCD,GAAG,CAAE,SAAAF,CAAS,CAAC,CACxB,CjBrVO,IAAMe,GAA2B,6BAC3BC,GAAW,qBASXC,GAAN,KAAoB,CACR,OAASC,EAAU,EAEnB,sBAAwB,IAAI,IAC5B,mBAAqB,IAAI,IACzB,cAAgB,IAAI,IAEpB,WACA,UAEjB,aAAc,CACZ,KAAK,WAAa,KAAK,cAAc,EACrC,KAAK,UAAYC,GAAgB,KAAK,UAAU,CAClD,CAEA,IAAI,gBAAiC,CACnC,OAAOC,GAAe,KAAK,UAAU,CACvC,CAEA,YAAYC,EAAgC,CAE1CC,GAAyBD,CAAG,EAG5BE,GAAuBF,CAAG,EAG1BG,GAASH,CAAG,EAGZI,GAAUJ,EAAK,KAAK,qBAAqB,EAGzCK,GAASL,EAAK,KAAK,sBAAuB,KAAK,kBAAkB,EAGjEM,GAAMN,EAAK,KAAK,mBAAoB,KAAK,cAAe,KAAK,SAAS,CACxE,CAEQ,eAA2B,CACjC,IAAIO,EAAqB,KAAK,OAAO,MAAM,cAAc,QAAQ,OAAQ;AAAA,CAAI,EAC7E,GAAI,CAACA,EACH,GAAI,CACFA,EAAqBC,GAAa,KAAK,OAAO,MAAM,kBAAmB,MAAM,CAC/E,MAAQ,CACN,MAAM,IAAI,MAAM,iCAAiC,CACnD,CAGF,GAAI,CACF,OAAOC,GAAiB,CACtB,IAAKF,EACL,OAAQ,MACR,WAAY,KAAK,OAAO,MAAM,uBAChC,CAAC,CACH,MAAQ,CACN,MAAM,IAAI,MAAM,8BAA8B,CAChD,CACF,CACF,EHjEA,IAAMG,GAAoB,iBAE1B,eAAsBC,GAAmB,CACvC,SAAAC,EACA,OAAAC,EACA,SAAAC,CACF,EAI4E,CAC1E,IAAMC,EAAMC,GAAQ,EAEpBD,EAAI,IAAIC,GAAQ,KAAK,CAAC,EACtBD,EAAI,IAAIC,GAAQ,WAAW,CAAC,EAE5BD,EAAI,IACFE,GAAK,CACH,OAAQJ,EAAO,iBACf,YAAa,GACb,eAAgB,CACd,eACA,gBACA,gBACA,SACA,sBACF,EACA,eAAgB,CAACH,GAAmB,cAAc,CACpD,CAAC,CACH,EAEIG,EAAO,mBAAqB,MAE9BE,EAAI,IAAI,cAAeF,EAAO,gBAAgB,EAGhD,IAAMK,EAAoC,CAAC,EAC3C,GAAIL,EAAO,MAAM,QAAS,CACxB,IAAMM,EAAgB,IAAIC,GAC1BD,EAAc,YAAYJ,CAAG,EAC7BG,EAAW,KAAKC,EAAc,cAAc,EAC5CD,EAAW,KAAKG,EAAuB,CACzC,CAEA,IAAMC,EAAO,IAAIV,CAAQ,GAczB,GAbAG,EAAI,KAAKO,EAAM,GAAGJ,EAAYK,CAAe,EAC7CR,EAAI,IACFO,EACA,GAAGJ,EACHL,EAAO,yBAA2BW,GAAmBC,EACvD,EACAV,EAAI,OACFO,EACA,GAAGJ,EACHL,EAAO,yBAA2BW,GAAmBC,EACvD,EAGI,CADW,CAAC,EAAEZ,EAAO,QAAUA,EAAO,SAExC,OAAO,IAAI,QAASa,GAAY,CAC9B,IAAMC,EAASC,GACZ,aAAab,CAAG,EAChB,OAAOF,EAAO,SAAU,IACvBa,EAAQ,CAAE,IAAK,oBAAoBb,EAAO,QAAQ,IAAID,CAAQ,GAAI,IAAAG,EAAK,OAAAY,CAAO,CAAC,CACjF,CACJ,CAAC,EAGH,GAAI,CAACE,GAAWhB,EAAO,MAAM,EAC3B,MAAM,IAAI,MAAM,6BAA6B,EAG/C,GAAI,CAACgB,GAAWhB,EAAO,OAAO,EAC5B,MAAM,IAAI,MAAM,8BAA8B,EAGhD,IAAMiB,EAAU,CACd,IAAKC,GAAG,aAAalB,EAAO,MAAM,EAClC,KAAMkB,GAAG,aAAalB,EAAO,OAAO,CACtC,EAEA,OAAO,IAAI,QAASa,GAAY,CAC9B,IAAMC,EAASK,GACZ,aAAaF,EAASf,CAAG,EACzB,OAAOF,EAAO,SAAU,IACvBa,EAAQ,CAAE,IAAK,qBAAqBb,EAAO,QAAQ,IAAID,CAAQ,GAAI,IAAAG,EAAK,OAAAY,CAAO,CAAC,CAClF,CACJ,CAAC,EAED,eAAeJ,EAAgBU,EAA2BC,EAA8B,CACtF,GAAI,CACF,IAAIC,EAEJ,GAAItB,EAAO,yBAA0B,CACnC,IAAMc,EAAS,IAAIS,GACnBD,EAAY,IAAIE,GAA8B,CAC5C,mBAAoB,MACtB,CAAC,EAEDH,EAAI,GAAG,QAAS,IAAM,CACpBC,EAAU,MAAM,EAChBR,EAAO,MAAM,CACf,CAAC,EAED,MAAMW,GAAQX,EAAQQ,EAAWrB,EAAUyB,EAAmBN,EAAI,IAAI,CAAC,CACzE,KAAO,CACL,IAAMO,EAAYP,EAAI,QAAQvB,EAAiB,EAE3C+B,EACJ,GAAID,IAAcC,EAAUC,GAAWF,CAAS,GAC9CL,EAAYM,EAAQ,kBACX,CAACD,GAAaG,GAAoBV,EAAI,IAAI,EAAG,CACtD,IAAMW,EAAaX,EAAI,KAAK,OAAO,WACnCE,EAAYU,GAAc,CAAE,WAAAD,CAAW,CAAC,EAExC,IAAMjB,EAAS,IAAIS,GAAO,CAAE,WAAAQ,CAAW,CAAC,EACxC,MAAMN,GAAQX,EAAQQ,EAAWrB,EAAUyB,EAAmBN,EAAI,IAAI,CAAC,CACzE,KAAO,CAELC,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,QAAS,MACT,MAAO,CACL,KAAM,MACN,QAAS,2CACX,EACA,GAAI,IACN,CAAC,EACD,MACF,CACF,CAEA,MAAMC,EAAU,cAAcF,EAAKC,EAAKD,EAAI,IAAI,CAClD,OAASa,EAAO,CACd,QAAQ,MAAM,8BAA+BA,CAAK,EAC7CZ,EAAI,aACPA,EAAI,OAAO,GAAG,EAAE,KAAK,CACnB,QAAS,MACT,MAAO,CACL,KAAM,OACN,QAAS,uBACX,EACA,GAAI,IACN,CAAC,CAEL,CACF,CACF,CAEA,eAAeI,GACbX,EACAQ,EACArB,EACAiC,EACe,CACf,MAAMpB,EAAO,cAAcoB,CAAQ,EACnCpB,EAAO,wBAAwB,EAE/B,MAAMA,EAAO,QAAQQ,CAAS,EAC9Ba,GAAYrB,EAAQb,CAAQ,CAC9B,CAEA,eAAeU,GAAiByB,EAAef,EAA8B,CAC3EA,EAAI,UAAU,GAAG,EAAE,IACjB,KAAK,UAAU,CACb,QAAS,MACT,MAAO,CACL,KAAM,MACN,QAAS,qBACX,EACA,GAAI,IACN,CAAC,CACH,CACF,CAEA,eAAeT,GAAqBQ,EAAsBC,EAAsC,CAC9F,IAAMM,EAAYP,EAAI,QAAQvB,EAAiB,EAE3C+B,EACJ,GAAI,CAACD,GAAa,EAAEC,EAAUC,GAAWF,CAAS,GAAI,CACpDN,EAAI,OAAO,GAAG,EAAE,KAAK,+BAA+B,EACpD,MACF,CAEA,MAAMO,EAAQ,UAAU,cAAcR,EAAKC,CAAG,CAChD,CxJ/LA,eAAegB,IAA6B,CAC1CC,GAAO,OAAO,EACd,IAAMC,EAASC,EAAU,EAEnBC,EAAWC,GAAeH,EAAO,eAAe,EAAIA,EAAO,gBAAkB,QAKnF,OAJIA,EAAO,qBACTI,GAAgB,IAAIC,GAAa,CAAE,aAAcL,EAAO,kBAAmB,CAAC,CAAC,EAGvEA,EAAO,UAAW,CACxB,IAAK,QAAS,CACZ,IAAMM,EAAS,IAAIC,GACnB,MAAMD,EAAO,cAAc,EAC3BA,EAAO,wBAAwB,EAE/B,IAAME,EAAY,IAAIC,GACtB,MAAMH,EAAO,QAAQE,CAAS,EAE9BE,GAAYJ,EAAQJ,CAAQ,EAC5BS,GAAI,KAAKL,EAAQ,GAAGA,EAAO,IAAI,KAAKA,EAAO,OAAO,mBAAmB,EACrE,KACF,CACA,IAAK,OAAQ,CACX,GAAM,CAAE,IAAAM,CAAI,EAAI,MAAMC,GAAmB,CAAE,SAAUC,GAAY,OAAAd,EAAQ,SAAAE,CAAS,CAAC,EAE9EF,EAAO,MAAM,SAChB,QAAQ,KACN,iSACF,EAIF,QAAQ,IACN,GAAGc,EAAU,KAAKC,EAAa,IAAIf,EAAO,yBAA2B,aAAe,EAAE,uCAAuCY,CAAG,EAClI,EACA,KACF,CACF,CAEIZ,EAAO,mBACTgB,GAAc,uCAA6B,CAE/C,CAEA,GAAI,CACF,MAAMlB,GAAY,CACpB,OAASmB,EAAO,CACdD,GAAc,yCAAyCE,EAAoBD,CAAK,CAAC,EAAE,EACnF,QAAQ,KAAK,CAAC,CAChB",
|
|
6
|
+
"names": ["StdioServerTransport", "dotenv", "existsSync", "join", "fileURLToPath", "toolNames", "toolGroupNames", "toolGroups", "isToolName", "value", "name", "isToolGroupName", "transports", "isTransport", "transport", "t", "invariant", "condition", "message", "__dirname", "fileURLToPath", "TEN_MINUTES_IN_MS", "ONE_HOUR_IN_MS", "ONE_DAY_IN_MS", "THIRTY_DAYS_IN_MS", "ONE_YEAR_IN_MS", "authTypes", "isAuthType", "auth", "type", "Config", "cleansedVars", "removeClaudeMcpBundleUserConfigTemplates", "server", "siteName", "transport", "sslKey", "sslCert", "httpPortEnvVarName", "corsOriginConfig", "trustProxyConfig", "patName", "patValue", "jwtSubClaim", "clientId", "secretId", "secretValue", "jwtAdditionalPayload", "datasourceCredentials", "defaultLogLevel", "disableLogMasking", "includeTools", "excludeTools", "maxResultLimit", "disableQueryDatasourceValidationRequests", "disableMetadataApiRequests", "disableSessionManagement", "enableServerLogging", "serverLogDirectory", "includeProjectIds", "includeDatasourceIds", "includeWorkbookIds", "tableauServerVersionCheckIntervalInHours", "disableOauth", "oauthIssuer", "oauthJwePrivateKey", "oauthJwePrivateKeyPath", "oauthJwePrivateKeyPassphrase", "redirectUri", "oauthClientIdSecretPairs", "dnsServers", "authzCodeTimeoutMs", "accessTokenTimeoutMs", "refreshTokenTimeoutMs", "parseNumber", "getCorsOriginConfig", "getTrustProxyConfig", "join", "createSetFromCommaSeparatedString", "disableOauthOverride", "ip", "acc", "curr", "secret", "isTransport", "invariant", "validateServer", "existsSync", "maxResultLimitNumber", "s", "v", "isToolName", "isToolGroupName", "toolGroups", "_", "error", "errorMessage", "origin", "value", "id", "envVars", "key", "defaultValue", "minValue", "maxValue", "number", "getConfig", "loggingLevels", "currentLogLevel", "serverLogger", "isLoggingLevel", "level", "l", "setLogLevel", "server", "silent", "log", "setServerLogger", "logger", "getSendLoggingMessageFn", "shouldLogWhenLevelIsAtLeast", "writeToStderr", "message", "getToolLogMessage", "requestId", "toolName", "args", "username", "appendFile", "existsSync", "mkdirSync", "join", "getExceptionMessage", "error", "ServerLogger", "logDirectory", "existsSync", "mkdirSync", "obj", "timestamp", "filename", "logFilePath", "join", "mutexKey", "newMutex", "appendFile", "error", "writeToStderr", "getExceptionMessage", "McpServer", "SetLevelRequestSchema", "package_default", "Ok", "z", "Err", "Ok", "maskRequest", "config", "result", "clone", "maskedData", "shouldLogWhenLevelIsAtLeast", "connection", "maskResponse", "response", "obj", "Ok", "error", "Err", "message", "getExceptionMessage", "writeToStderr", "getRequestInterceptorConfig", "config", "getResponseInterceptorConfig", "response", "Zodios", "randomUUID", "SignJWT", "getJwt", "username", "connectedApp", "scopes", "additionalPayload", "header", "payload", "makeApi", "makeEndpoint", "z", "z", "credentialsSchema", "signInRequestSchema", "z", "signInEndpoint", "makeEndpoint", "credentialsSchema", "signOutEndpoint", "authenticationApi", "makeApi", "authenticationApis", "Methods", "apiClient", "AuthenticatedMethods", "Methods", "apiClient", "creds", "AuthenticationMethods", "Methods", "baseUrl", "Zodios", "authenticationApis", "authConfig", "getJwt", "AuthenticatedAuthenticationMethods", "AuthenticatedMethods", "creds", "Zodios", "makeApi", "makeEndpoint", "z", "z", "orderingMethods", "orderBySchema", "contentTypes", "modifiedTimeSchema", "searchContentFilterBase", "searchContentFilterSchema", "searchContentItemSchema", "searchContentResponseSchema", "searchContentEndpoint", "makeEndpoint", "z", "searchContentResponseSchema", "contentExplorationApi", "makeApi", "contentExplorationApis", "ContentExplorationMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "contentExplorationApis", "queries", "key", "value", "Zodios", "makeApi", "makeEndpoint", "z", "z", "z", "projectSchema", "dataSourceSchema", "z", "projectSchema", "z", "paginationSchema", "pulsePaginationSchema", "z", "paginationParameters", "listDatasourcesEndpoint", "makeEndpoint", "paginationParameters", "z", "paginationSchema", "dataSourceSchema", "queryDatasourceEndpoint", "datasourcesApi", "makeApi", "datasourcesApis", "DatasourcesMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "datasourcesApis", "siteId", "filter", "pageSize", "pageNumber", "response", "datasourceId", "Zodios", "makeApi", "makeEndpoint", "z", "graphqlResponse", "graphqlEndpoint", "metadataApi", "metadataApis", "MetadataMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "metadataApis", "query", "Zodios", "Err", "Ok", "bind", "fn", "thisArg", "toString", "getPrototypeOf", "iterator", "toStringTag", "kindOf", "cache", "thing", "str", "kindOfTest", "type", "typeOfTest", "isArray", "isUndefined", "isBuffer", "val", "isFunction", "isArrayBuffer", "isArrayBufferView", "result", "isString", "isNumber", "isObject", "isBoolean", "isPlainObject", "prototype", "isEmptyObject", "isDate", "isFile", "isBlob", "isFileList", "isStream", "isFormData", "kind", "isURLSearchParams", "isReadableStream", "isRequest", "isResponse", "isHeaders", "trim", "forEach", "obj", "fn", "allOwnKeys", "i", "l", "keys", "len", "key", "findKey", "_key", "_global", "isContextDefined", "context", "merge", "caseless", "skipUndefined", "assignValue", "targetKey", "extend", "a", "b", "thisArg", "bind", "stripBOM", "content", "inherits", "constructor", "superConstructor", "props", "descriptors", "toFlatObject", "sourceObj", "destObj", "filter", "propFilter", "prop", "merged", "endsWith", "searchString", "position", "lastIndex", "toArray", "arr", "isTypedArray", "TypedArray", "forEachEntry", "_iterator", "pair", "matchAll", "regExp", "matches", "isHTMLForm", "toCamelCase", "m", "p1", "p2", "hasOwnProperty", "isRegExp", "reduceDescriptors", "reducer", "reducedDescriptors", "descriptor", "name", "ret", "freezeMethods", "value", "toObjectSet", "arrayOrString", "delimiter", "define", "noop", "toFiniteNumber", "defaultValue", "isSpecCompliantForm", "toJSONObject", "stack", "visit", "source", "target", "reducedValue", "isAsyncFn", "isThenable", "_setImmediate", "setImmediateSupported", "postMessageSupported", "token", "callbacks", "data", "cb", "asap", "isIterable", "utils_default", "AxiosError", "message", "code", "config", "request", "response", "utils_default", "prototype", "descriptors", "error", "customProps", "axiosError", "obj", "prop", "msg", "errCode", "AxiosError_default", "FormData", "FormData_default", "isVisitable", "thing", "utils_default", "removeBrackets", "key", "renderKey", "path", "dots", "token", "i", "isFlatArray", "arr", "predicates", "prop", "toFormData", "obj", "formData", "options", "FormData_default", "option", "source", "metaTokens", "visitor", "defaultVisitor", "indexes", "useBlob", "convertValue", "value", "AxiosError_default", "el", "index", "stack", "exposedHelpers", "build", "toFormData_default", "encode", "str", "charMap", "match", "AxiosURLSearchParams", "params", "options", "toFormData_default", "prototype", "name", "value", "encoder", "_encode", "pair", "AxiosURLSearchParams_default", "encode", "val", "buildURL", "url", "params", "options", "_encode", "utils_default", "serializeFn", "serializedParams", "AxiosURLSearchParams_default", "hashmarkIndex", "InterceptorManager", "fulfilled", "rejected", "options", "id", "fn", "utils_default", "h", "InterceptorManager_default", "transitional_default", "crypto", "url", "URLSearchParams_default", "ALPHA", "DIGIT", "ALPHABET", "generateString", "size", "alphabet", "str", "length", "randomValues", "crypto", "i", "node_default", "URLSearchParams_default", "FormData_default", "utils_exports", "__export", "hasBrowserEnv", "hasStandardBrowserEnv", "hasStandardBrowserWebWorkerEnv", "_navigator", "origin", "platform_default", "utils_exports", "node_default", "toURLEncodedForm", "data", "options", "toFormData_default", "platform_default", "value", "key", "path", "helpers", "utils_default", "parsePropPath", "name", "utils_default", "match", "arrayToObject", "arr", "obj", "keys", "i", "len", "key", "formDataToJSON", "formData", "buildPath", "path", "value", "target", "index", "isNumericKey", "isLast", "formDataToJSON_default", "stringifySafely", "rawValue", "parser", "encoder", "utils_default", "e", "defaults", "transitional_default", "data", "headers", "contentType", "hasJSONContentType", "isObjectPayload", "formDataToJSON_default", "isFileList", "toURLEncodedForm", "_FormData", "toFormData_default", "transitional", "forcedJSONParsing", "JSONRequested", "strictJSONParsing", "AxiosError_default", "platform_default", "status", "method", "defaults_default", "ignoreDuplicateOf", "utils_default", "parseHeaders_default", "rawHeaders", "parsed", "key", "val", "line", "$internals", "normalizeHeader", "header", "normalizeValue", "value", "utils_default", "parseTokens", "str", "tokens", "tokensRE", "match", "isValidHeaderName", "matchHeaderValue", "context", "filter", "isHeaderNameFilter", "formatHeader", "w", "char", "buildAccessors", "obj", "accessorName", "methodName", "arg1", "arg2", "arg3", "AxiosHeaders", "headers", "valueOrRewrite", "rewrite", "self", "setHeader", "_value", "_header", "_rewrite", "lHeader", "key", "setHeaders", "parseHeaders_default", "dest", "entry", "parser", "matcher", "deleted", "deleteHeader", "keys", "i", "format", "normalized", "targets", "asStrings", "thing", "first", "computed", "target", "accessors", "prototype", "defineAccessor", "mapped", "headerValue", "AxiosHeaders_default", "transformData", "fns", "response", "config", "defaults_default", "context", "headers", "AxiosHeaders_default", "data", "utils_default", "fn", "isCancel", "value", "CanceledError", "message", "config", "request", "AxiosError_default", "utils_default", "CanceledError_default", "settle", "resolve", "reject", "response", "validateStatus", "AxiosError_default", "isAbsoluteURL", "url", "combineURLs", "baseURL", "relativeURL", "buildFullPath", "baseURL", "requestedURL", "allowAbsoluteUrls", "isRelativeUrl", "isAbsoluteURL", "combineURLs", "proxyFromEnv", "http", "https", "util", "followRedirects", "zlib", "VERSION", "parseProtocol", "url", "match", "DATA_URL_PATTERN", "fromDataURI", "uri", "asBlob", "options", "_Blob", "platform_default", "protocol", "parseProtocol", "match", "AxiosError_default", "mime", "isBase64", "body", "buffer", "stream", "stream", "kInternals", "AxiosTransformStream", "stream", "options", "utils_default", "prop", "source", "internals", "event", "size", "chunk", "encoding", "callback", "maxRate", "readableHighWaterMark", "timeWindow", "divider", "bytesThreshold", "minChunkSize", "pushChunk", "_chunk", "_callback", "bytes", "transformChunk", "chunkSize", "chunkRemainder", "maxChunkSize", "bytesLeft", "passed", "now", "transformNextChunk", "err", "AxiosTransformStream_default", "EventEmitter", "util", "Readable", "asyncIterator", "readBlob", "blob", "readBlob_default", "BOUNDARY_ALPHABET", "platform_default", "textEncoder", "util", "CRLF", "CRLF_BYTES", "CRLF_BYTES_COUNT", "FormDataPart", "name", "value", "escapeName", "isStringValue", "utils_default", "headers", "readBlob_default", "match", "formDataToStream", "form", "headersHandler", "options", "tag", "size", "boundary", "boundaryBytes", "footerBytes", "contentLength", "parts", "part", "computedHeaders", "Readable", "formDataToStream_default", "stream", "ZlibHeaderTransformStream", "chunk", "encoding", "callback", "header", "ZlibHeaderTransformStream_default", "callbackify", "fn", "reducer", "utils_default", "args", "cb", "value", "err", "callbackify_default", "speedometer", "samplesCount", "min", "bytes", "timestamps", "head", "tail", "firstSampleTS", "chunkLength", "now", "startedAt", "i", "bytesCount", "passed", "speedometer_default", "throttle", "fn", "freq", "timestamp", "threshold", "lastArgs", "timer", "invoke", "args", "now", "passed", "throttle_default", "progressEventReducer", "listener", "isDownloadStream", "freq", "bytesNotified", "_speedometer", "speedometer_default", "throttle_default", "e", "loaded", "total", "progressBytes", "rate", "inRange", "data", "progressEventDecorator", "throttled", "lengthComputable", "asyncDecorator", "fn", "args", "utils_default", "estimateDataURLDecodedBytes", "url", "comma", "meta", "body", "effectiveLen", "len", "i", "a", "b", "pad", "idx", "tailIsPct3D", "j", "bytes", "zlibOptions", "zlib", "brotliOptions", "isBrotliSupported", "utils_default", "httpFollow", "httpsFollow", "followRedirects", "isHttps", "supportedProtocols", "platform_default", "protocol", "flushOnFinish", "stream", "throttled", "flush", "dispatchBeforeRedirect", "options", "responseDetails", "setProxy", "configProxy", "location", "proxy", "proxyUrl", "proxyFromEnv", "base64", "proxyHost", "redirectOptions", "isHttpAdapterSupported", "wrapAsync", "asyncExecutor", "resolve", "reject", "onDone", "isDone", "done", "value", "isRejected", "_resolve", "_reject", "reason", "onDoneHandler", "resolveFamily", "address", "family", "buildAddressEntry", "http_default", "config", "data", "lookup", "responseType", "responseEncoding", "method", "rejected", "req", "_lookup", "callbackify_default", "hostname", "opt", "cb", "err", "arg0", "arg1", "addresses", "addr", "emitter", "EventEmitter", "onFinished", "abort", "CanceledError_default", "fullPath", "buildFullPath", "parsed", "dataUrl", "estimateDataURLDecodedBytes", "AxiosError_default", "convertedData", "settle", "fromDataURI", "AxiosHeaders_default", "headers", "VERSION", "onUploadProgress", "onDownloadProgress", "maxRate", "maxUploadRate", "maxDownloadRate", "userBoundary", "formDataToStream_default", "formHeaders", "knownLength", "util", "readBlob_default", "contentLength", "AxiosTransformStream_default", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "auth", "username", "password", "urlUsername", "urlPassword", "path", "buildURL", "customErr", "transport", "isHttpsRequest", "https", "http", "res", "streams", "responseLength", "transformStream", "responseStream", "lastRequest", "ZlibHeaderTransformStream_default", "offListeners", "response", "responseBuffer", "totalResponseBytes", "chunk", "responseData", "socket", "timeout", "timeoutErrorMessage", "transitional", "transitional_default", "ended", "errored", "isURLSameOrigin_default", "platform_default", "origin", "isMSIE", "url", "cookies_default", "platform_default", "name", "value", "expires", "path", "domain", "secure", "cookie", "utils_default", "match", "headersToObject", "thing", "AxiosHeaders_default", "mergeConfig", "config1", "config2", "config", "getMergedValue", "target", "source", "prop", "caseless", "utils_default", "mergeDeepProperties", "a", "b", "valueFromConfig2", "defaultToConfig2", "mergeDirectKeys", "mergeMap", "merge", "configValue", "resolveConfig_default", "config", "newConfig", "mergeConfig", "data", "withXSRFToken", "xsrfHeaderName", "xsrfCookieName", "headers", "auth", "AxiosHeaders_default", "buildURL", "buildFullPath", "utils_default", "platform_default", "formHeaders", "allowedHeaders", "key", "val", "isURLSameOrigin_default", "xsrfValue", "cookies_default", "isXHRAdapterSupported", "xhr_default", "config", "resolve", "reject", "_config", "resolveConfig_default", "requestData", "requestHeaders", "AxiosHeaders_default", "responseType", "onUploadProgress", "onDownloadProgress", "onCanceled", "uploadThrottled", "downloadThrottled", "flushUpload", "flushDownload", "done", "request", "onloadend", "responseHeaders", "response", "settle", "value", "err", "AxiosError_default", "event", "msg", "timeoutErrorMessage", "transitional", "transitional_default", "utils_default", "val", "key", "progressEventReducer", "cancel", "CanceledError_default", "protocol", "parseProtocol", "platform_default", "composeSignals", "signals", "timeout", "length", "controller", "aborted", "onabort", "reason", "unsubscribe", "err", "AxiosError_default", "CanceledError_default", "timer", "signal", "utils_default", "composeSignals_default", "streamChunk", "chunk", "chunkSize", "len", "pos", "end", "readBytes", "iterable", "readStream", "stream", "reader", "done", "value", "trackStream", "onProgress", "onFinish", "iterator", "bytes", "_onFinish", "e", "controller", "loadedBytes", "err", "reason", "DEFAULT_CHUNK_SIZE", "isFunction", "utils_default", "globalFetchAPI", "fetch", "Request", "Response", "ReadableStream", "TextEncoder", "test", "fn", "args", "factory", "env", "isFetchSupported", "isRequestSupported", "isResponseSupported", "isReadableStreamSupported", "encodeText", "encoder", "str", "supportsRequestStream", "duplexAccessed", "hasContentType", "platform_default", "supportsResponseStream", "resolvers", "res", "type", "config", "method", "AxiosError_default", "getBodyLength", "body", "resolveBodyLength", "headers", "length", "url", "data", "signal", "cancelToken", "timeout", "onDownloadProgress", "onUploadProgress", "responseType", "withCredentials", "fetchOptions", "resolveConfig_default", "composedSignal", "composeSignals_default", "request", "unsubscribe", "requestContentLength", "_request", "contentTypeHeader", "onProgress", "flush", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "trackStream", "isCredentialsSupported", "resolvedOptions", "response", "isStreamResponse", "options", "prop", "responseContentLength", "responseData", "resolve", "reject", "settle", "AxiosHeaders_default", "err", "seedCache", "getFetch", "seeds", "len", "i", "seed", "target", "map", "adapter", "knownAdapters", "http_default", "xhr_default", "getFetch", "utils_default", "fn", "value", "renderReason", "reason", "isResolvedHandle", "adapter", "adapters_default", "adapters", "config", "length", "nameOrAdapter", "rejectedReasons", "i", "id", "AxiosError_default", "reasons", "state", "s", "throwIfCancellationRequested", "config", "CanceledError_default", "dispatchRequest", "AxiosHeaders_default", "transformData", "adapters_default", "defaults_default", "response", "reason", "isCancel", "validators", "type", "i", "thing", "deprecatedWarnings", "validator", "version", "message", "formatMessage", "opt", "desc", "VERSION", "value", "opts", "AxiosError_default", "correctSpelling", "assertOptions", "options", "schema", "allowUnknown", "keys", "result", "validator_default", "validators", "validator_default", "Axios", "instanceConfig", "InterceptorManager_default", "configOrUrl", "config", "err", "dummy", "stack", "mergeConfig", "transitional", "paramsSerializer", "headers", "utils_default", "contextHeaders", "method", "AxiosHeaders_default", "requestInterceptorChain", "synchronousRequestInterceptors", "interceptor", "responseInterceptorChain", "promise", "i", "len", "chain", "dispatchRequest", "newConfig", "onFulfilled", "onRejected", "error", "fullPath", "buildFullPath", "buildURL", "url", "generateHTTPMethod", "isForm", "data", "Axios_default", "CancelToken", "_CancelToken", "executor", "resolvePromise", "resolve", "token", "cancel", "i", "onfulfilled", "_resolve", "promise", "message", "config", "request", "CanceledError_default", "listener", "index", "controller", "abort", "err", "c", "CancelToken_default", "spread", "callback", "arr", "isAxiosError", "payload", "utils_default", "HttpStatusCode", "key", "value", "HttpStatusCode_default", "createInstance", "defaultConfig", "context", "Axios_default", "instance", "bind", "utils_default", "instanceConfig", "mergeConfig", "axios", "defaults_default", "CanceledError_default", "CancelToken_default", "isCancel", "VERSION", "toFormData_default", "AxiosError_default", "promises", "spread", "isAxiosError", "AxiosHeaders_default", "thing", "formDataToJSON_default", "adapters_default", "HttpStatusCode_default", "axios_default", "Axios", "AxiosError", "CanceledError", "isCancel", "CancelToken", "VERSION", "all", "Cancel", "isAxiosError", "spread", "toFormData", "AxiosHeaders", "HttpStatusCode", "formToJSON", "getAdapter", "mergeConfig", "axios_default", "getStringResponseHeader", "headers", "headerName", "headerValue", "makeApi", "makeEndpoint", "z", "z", "pulseMetadataSchema", "pulseDatasourceSchema", "pulseFilterSchema", "pulseBasicSpecificationSchema", "pulseSpecificationSchema", "pulseExtensionOptionsSchema", "pulseMetricSpecificationSchema", "pulseGoalsSchema", "pulseMetricSchema", "pulseRepresentationOptionsSchema", "insightOptionsSchema", "comparisonSchema", "datasourceGoalsSchema", "pulseMetricDefinitionSchema", "pulseMetricSubscriptionSchema", "languageEnumSchema", "localeEnumSchema", "outputFormatEnumSchema", "pulseBundleRequestSchema", "popcBanInsightGroupSchema", "pulseBundleResponseSchema", "pulseInsightBundleTypeEnum", "pulseMetricDefinitionViewEnum", "listAllPulseMetricDefinitionsRestEndpoint", "makeEndpoint", "z", "pulseMetricDefinitionViewEnum", "pulseMetricDefinitionSchema", "listPulseMetricDefinitionsFromMetricDefinitionIdsRestEndpoint", "listPulseMetricsFromMetricDefinitionIdRestEndpoint", "pulseMetricSchema", "listPulseMetricsFromMetricIdsRestEndpoint", "listPulseMetricSubscriptionsForCurrentUserRestEndpoint", "pulseMetricSubscriptionSchema", "generatePulseMetricValueInsightBundleRestEndpoint", "pulseBundleRequestSchema", "pulseInsightBundleTypeEnum", "pulseBundleResponseSchema", "pulseApi", "makeApi", "pulseApis", "PulseMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "pulseApis", "view", "pageToken", "pageSize", "guardAgainstPulseDisabled", "response", "metricDefinitionIds", "pulseMetricDefinitionID", "metricIds", "bundleRequest", "bundleType", "callback", "Ok", "error", "isAxiosError", "Err", "isErrorFromAlias", "Zodios", "Err", "Ok", "makeApi", "makeEndpoint", "z", "z", "serverInfo", "z", "siteSchema", "z", "userSchema", "sessionSchema", "z", "siteSchema", "userSchema", "getServerInfoEndpoint", "makeEndpoint", "serverInfo", "getCurrentServerSessionEndpoint", "serverApi", "makeApi", "serverApis", "ServerMethods", "Methods", "baseUrl", "Zodios", "serverApis", "AuthenticatedServerMethods", "AuthenticatedMethods", "creds", "response", "Ok", "error", "isErrorFromAlias", "Err", "isAxiosError", "getExceptionMessage", "Zodios", "makeApi", "makeEndpoint", "z", "z", "viewSchema", "getViewEndpoint", "makeEndpoint", "z", "viewSchema", "queryViewDataEndpoint", "queryViewImageEndpoint", "queryViewsForWorkbookEndpoint", "queryViewsForSiteEndpoint", "paginationParameters", "paginationSchema", "viewsApi", "makeApi", "viewsApis", "ViewsMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "viewsApis", "viewId", "siteId", "width", "height", "resolution", "workbookId", "includeUsageStatistics", "filter", "pageSize", "pageNumber", "response", "isErrorFromAlias", "Zodios", "ZodiosError", "Err", "Ok", "makeApi", "makeEndpoint", "z", "functionSchema", "dataTypeSchema", "periodTypeSchema", "columnClassSchema", "fieldMetadataSchema", "parameterValueSchema", "parameterBaseSchema", "parameterSchema", "sortDirectionSchema", "fieldBaseSchema", "dimensionFieldSchema", "measureFieldSchema", "calculatedFieldSchema", "binFieldSchema", "fieldSchema", "dimensionFilterFieldSchema", "measureFilterFieldSchema", "calculatedFilterFieldSchema", "filterFieldSchema", "filterBaseSchema", "simpleFilterBaseSchema", "setFilterSchema", "relativeDateFilterBaseSchema", "relativeDateFilterSchema", "matchFilterBaseSchema", "matchFilterSchema", "quantitativeNumericalFilterBaseSchema", "quantitativeNumericalFilterSchema", "quantitativeDateFilterBaseSchema", "quantitativeDateFilterSchema", "topNFilterSchema", "filterSchema", "queryParameterSchema", "connectionSchema", "datasourceSchema", "returnFormatSchema", "queryOptionsSchema", "readMetadataRequestSchema", "metadataOutputSchema", "tableauErrorSchema", "querySchema", "queryDatasourceOptionsSchema", "queryRequestSchema", "queryOutputSchema", "queryDatasourceEndpoint", "readMetadataEndpoint", "simpleRequestEndpoint", "vizqlDataServiceApi", "vizqlDataServiceApis", "VizqlDataServiceMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "vizqlDataServiceApis", "queryRequest", "Ok", "error", "isErrorFromAlias", "Err", "ZodiosError", "readMetadataRequest", "Zodios", "makeApi", "makeEndpoint", "z", "z", "workbookSchema", "z", "projectSchema", "viewSchema", "getWorkbookEndpoint", "makeEndpoint", "z", "workbookSchema", "queryWorkbooksForSiteEndpoint", "paginationParameters", "paginationSchema", "workbooksApi", "makeApi", "workbooksApis", "WorkbooksMethods", "AuthenticatedMethods", "baseUrl", "creds", "Zodios", "workbooksApis", "workbookId", "siteId", "filter", "pageSize", "pageNumber", "response", "RestApi", "_RestApi", "host", "options", "AuthenticationMethods", "AuthenticatedAuthenticationMethods", "AuthenticatedServerMethods", "ContentExplorationMethods", "DatasourcesMethods", "baseUrl", "MetadataMethods", "PulseMethods", "ServerMethods", "VizqlDataServiceMethods", "ViewsMethods", "WorkbooksMethods", "authConfig", "accessToken", "userId", "parts", "siteId", "interceptors", "config", "getRequestInterceptorConfig", "error", "response", "getResponseInterceptorConfig", "getNewRestApiInstanceAsync", "config", "requestId", "server", "jwtScopes", "authInfo", "tableauServer", "invariant", "restApi", "RestApi", "getRequestInterceptor", "getRequestErrorInterceptor", "getResponseInterceptor", "getResponseErrorInterceptor", "getJwtSubClaim", "getJwtAdditionalPayload", "useRestApi", "callback", "request", "getUserAgent", "logRequest", "error", "baseUrl", "isAxiosError", "log", "getExceptionMessage", "getRequestInterceptorConfig", "response", "logResponse", "getResponseInterceptorConfig", "maskedRequest", "getConfig", "maskRequest", "url", "messageObj", "shouldLogWhenLevelIsAtLeast", "maskedResponse", "maskResponse", "userAgentParts", "userAgent", "name", "version", "json", "z", "z", "requiredString", "property", "mcpAuthorizeSchema", "z", "requiredString", "mcpTokenSchema", "issue", "ctx", "opt", "data", "client_id", "client_secret", "clientIdSecretPair", "callbackSchema", "mcpAccessTokenUserOnlySchema", "mcpAccessTokenSchema", "tableauAuthInfoSchema", "cimdMetadataSchema", "getTableauAuthInfo", "authInfo", "tableauAuthInfo", "tableauAuthInfoSchema", "ZodiosError", "fromError", "isZodErrorLike", "Provider", "_Provider", "provider", "typeOrProvider", "Tool", "server", "name", "description", "paramsSchema", "annotations", "argsValidator", "callback", "requestId", "args", "username", "log", "getToolLogMessage", "authInfo", "getSuccessResult", "getErrorText", "constrainSuccessResult", "tableauAuthInfoSchema", "Provider", "error", "getErrorResult", "result", "constrainedResult", "ZodiosError", "isZodErrorLike", "validationError", "fromError", "getExceptionMessage", "buildOrderByString", "orderBy", "methodsUsed", "ordering", "buildFilterString", "filter", "filterExpressions", "typesUsed", "type", "idsUsed", "id", "modifiedTimesUsed", "modifiedTime", "startDate", "endDate", "reduceSearchContentResponse", "response", "searchResults", "item", "getReducedSearchItemContent", "unifiedDatasourceLuids", "datasourceLuid", "content", "reducedContent", "constrainSearchContent", "items", "boundedContext", "projectIds", "datasourceIds", "workbookIds", "paramsSchema", "z", "orderBySchema", "searchContentFilterSchema", "getSearchContentTool", "server", "searchContentTool", "Tool", "terms", "limit", "orderBy", "filter", "requestId", "authInfo", "config", "getConfig", "orderByString", "buildOrderByString", "filterString", "buildFilterString", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "response", "reduceSearchContentResponse", "items", "constrainSearchContent", "Err", "Ok", "z", "getVizqlDataServiceDisabledError", "ResourceAccessChecker", "_ResourceAccessChecker", "boundedContext", "getConfig", "datasourceLuid", "restApiArgs", "result", "workbookId", "viewId", "config", "requestId", "server", "cachedResult", "datasourceProjectId", "useRestApi", "restApi", "error", "getExceptionMessage", "workbook", "viewWorkbookId", "viewProjectId", "view", "resourceAccessChecker", "exportedForTesting", "validateDatasourceLuid", "datasourceLuid", "z", "fieldSchema", "parameterSchema", "fieldsResultSchema", "simplifyReadMetadataResult", "readMetadataResult", "simplifiedResponse", "field", "toPush", "parameter", "combineFields", "listFieldsResult", "combinedFields", "populateFieldWithAdditionalProperties", "matchingListField", "f", "sourceField", "targetField", "getGraphqlQuery", "datasourceLuid", "paramsSchema", "z", "getGetDatasourceMetadataTool", "server", "getDatasourceMetadataTool", "Tool", "validateDatasourceLuid", "requestId", "authInfo", "config", "getConfig", "query", "isDatasourceAllowedResult", "resourceAccessChecker", "useRestApi", "getTableauAuthInfo", "restApi", "readMetadataResult", "Err", "Ok", "simplifyReadMetadataResult", "listFieldsResult", "combineFields", "fields", "error", "getVizqlDataServiceDisabledError", "Ok", "z", "Ok", "z", "pageConfigSchema", "paginate", "pageConfig", "getDataFn", "pageSize", "limit", "pagination", "data", "result", "totalAvailable", "pageNumber", "nextPagination", "nextData", "pulsePaginateConfigSchema", "pulsePaginate", "config", "validatedConfig", "resultArray", "total_available", "next_page_token", "genericFilterDescription", "z", "z", "FilterOperatorSchema", "isISO8601DateTime", "value", "dateTimeFields", "parseAndValidateFilterString", "filterString", "allowedOperatorsByField", "filterFieldSchema", "isOperatorAllowed", "field", "operator", "expressions", "f", "parsedFilters", "expr", "fieldRaw", "operatorRaw", "valueParts", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateDatasourcesFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListDatasourcesTool", "server", "listDatasourcesTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "authInfo", "config", "getConfig", "validatedFilter", "parseAndValidateDatasourcesFilterString", "datasources", "useRestApi", "getTableauAuthInfo", "restApi", "paginate", "pageConfig", "pagination", "data", "Ok", "constrainDatasources", "boundedContext", "projectIds", "datasourceIds", "datasource", "Err", "z", "getPulseDisabledError", "reason", "paramsSchema", "pulseBundleRequestSchema", "z", "pulseInsightBundleTypeEnum", "getGeneratePulseMetricValueInsightBundleTool", "server", "generatePulseMetricValueInsightBundleTool", "Tool", "bundleRequest", "bundleType", "requestId", "authInfo", "config", "getConfig", "datasourceIds", "datasourceLuid", "Err", "result", "useRestApi", "getTableauAuthInfo", "restApi", "insightBundle", "error", "getPulseDisabledError", "Ok", "z", "constrainPulseDefinitions", "boundedContext", "definitions", "datasourceIds", "definition", "paramsSchema", "z", "pulseMetricDefinitionViewEnum", "getListAllPulseMetricDefinitionsTool", "server", "listAllPulseMetricDefinitionsTool", "Tool", "view", "limit", "pageSize", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "pulsePaginate", "pageToken", "apiResult", "Ok", "definitions", "constrainPulseDefinitions", "getPulseDisabledError", "z", "paramsSchema", "z", "pulseMetricDefinitionViewEnum", "getListPulseMetricDefinitionsFromDefinitionIdsTool", "server", "listPulseMetricDefinitionsFromDefinitionIdsTool", "Tool", "view", "metricDefinitionIds", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "definitions", "constrainPulseDefinitions", "getPulseDisabledError", "z", "constrainPulseMetrics", "metrics", "boundedContext", "datasourceIds", "metric", "paramsSchema", "z", "getListPulseMetricsFromMetricDefinitionIdTool", "server", "listPulseMetricsFromMetricDefinitionIdTool", "Tool", "pulseMetricDefinitionID", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "metrics", "constrainPulseMetrics", "getPulseDisabledError", "z", "paramsSchema", "z", "getListPulseMetricsFromMetricIdsTool", "server", "listPulseMetricsFromMetricIdsTool", "Tool", "metricIds", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "metrics", "constrainPulseMetrics", "getPulseDisabledError", "paramsSchema", "getListPulseMetricSubscriptionsTool", "server", "listPulseMetricSubscriptionsTool", "Tool", "_", "requestId", "authInfo", "config", "getConfig", "useRestApi", "getTableauAuthInfo", "restApi", "subscriptions", "constrainPulseMetricSubscriptions", "getPulseDisabledError", "boundedContext", "restApiArgs", "datasourceIds", "metricsResult", "subscription", "getExceptionMessage", "allowedMetricIds", "metric", "error", "ZodiosError", "Err", "z", "ZodiosError", "fromError", "isZodErrorLike", "ExpiringMap", "defaultExpirationTimeMs", "key", "value", "expirationTimeMs", "currentTimeout", "timeout", "tableauServerVersions", "getTableauServerVersion", "server", "ExpiringMap", "getConfig", "serverVersion", "restApi", "RestApi", "error", "reason", "ZodiosError", "isZodErrorLike", "fromError", "getExceptionMessage", "getResultForTableauVersion", "server", "mappings", "productVersion", "getTableauServerVersion", "minVersion", "value", "isTableauVersionAtLeast", "versionValue", "year", "major", "minor", "minYear", "minMajor", "minMinor", "z", "schema", "z", "luid", "u", "p", "credentialMap", "initialized", "getDatasourceCredentials", "datasourceLuid", "datasourceCredentials", "getConfig", "obj", "e", "parsed", "handleQueryDatasourceError", "error", "errorDetail", "validateFields", "fields", "hasEmptyFieldCaption", "sortPriorities", "acc", "field", "duplicateSortPriorities", "_", "duplicateSortPrioritiesArr", "priority", "fieldsWithBothFunctionAndCalculation", "hasFunctionAndCalculation", "fieldsWithNegativeMaxDecimalPlace", "hasNegativeMaxDecimalPlace", "hasFieldCaptionAndCalculation", "Err", "Ok", "validateFilters", "filters", "filter", "fieldCounts", "acc", "fieldsWithMultipleFilters", "_", "count", "field", "filtersWithInvalidFields", "result", "validateFilterField", "topNFiltersWithInvalidFields", "matchFiltersWithInvalidFields", "hasEmptyFieldCaption", "Err", "hasFieldCaptionAndCalculation", "fieldCaption", "hasFunctionAndCalculation", "Ok", "validateQuery", "datasourceLuid", "query", "validateDatasourceLuid", "fields", "filters", "validateFields", "validateFilters", "querySchema", "queryDatasourceToolDescription20253", "queryDatasourceToolDescription", "levenshtein", "Err", "Ok", "validateFilterValues", "server", "query", "vizqlDataServiceMethods", "datasource", "Ok", "validationErrors", "filtersToValidate", "filter", "fieldCaption", "result", "validateSetFilter", "validateMatchFilter", "error", "log", "Err", "filterValues", "v", "queryRequest", "data", "existingValues", "row", "invalidValues", "value", "suggestedValues", "getFuzzyMatches", "message", "fieldValues", "similarValues", "lowerValue", "fuzzyStartMatch", "pattern", "len", "dynamicDistance", "startSlice", "levenshtein", "fuzzyEndMatch", "endSlice", "fuzzyContainsMatch", "_", "i", "dist", "patternDescriptions", "similarValuesString", "maxDistance", "maxSuggestions", "suggestions", "existingValue", "matches", "invalidValue", "match", "a", "b", "bestMatch", "toReturn", "suggestionLimitPerInvalidValue", "invalidValueSuggestionCounter", "suggestionForInvalidValue", "Err", "Ok", "validateQueryAgainstDatasourceMetadata", "query", "vizqlDataServiceMethods", "datasource", "validationErrors", "readMetadataResult", "validateFieldsAgainstDatasourceMetadata", "validateParametersAgainstDatasourceMetadata", "fields", "datasourceMetadata", "field", "f", "matchingField", "parameters", "parameter", "matchingParameter", "p", "parameterValueMatchesDataType", "value", "dataType", "paramsSchema", "z", "querySchema", "getQueryDatasourceTool", "server", "authInfo", "config", "getConfig", "queryDatasourceTool", "Tool", "Provider", "getResultForTableauVersion", "queryDatasourceToolDescription20253", "queryDatasourceToolDescription", "validateQuery", "datasourceLuid", "query", "requestId", "isDatasourceAllowedResult", "resourceAccessChecker", "Err", "datasource", "options", "credentials", "getDatasourceCredentials", "queryRequest", "useRestApi", "getTableauAuthInfo", "restApi", "metadataValidationResult", "validateQueryAgainstDatasourceMetadata", "errorMessage", "error", "filterValidationResult", "validateFilterValues", "result", "ZodiosError", "queryOutput", "getVizqlDataServiceDisabledError", "handleQueryDatasourceError", "Err", "Ok", "z", "paramsSchema", "z", "getGetViewDataTool", "server", "getViewDataTool", "Tool", "viewId", "requestId", "authInfo", "config", "getConfig", "isViewAllowedResult", "resourceAccessChecker", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "Err", "viewData", "error", "Err", "Ok", "z", "convertPngDataToToolResult", "pngData", "paramsSchema", "z", "getGetViewImageTool", "server", "getViewImageTool", "Tool", "viewId", "width", "height", "requestId", "authInfo", "config", "getConfig", "isViewAllowedResult", "resourceAccessChecker", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "Err", "viewImage", "convertPngDataToToolResult", "error", "Ok", "z", "z", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateViewsFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListViewsTool", "server", "listViewsTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "authInfo", "config", "getConfig", "validatedFilter", "parseAndValidateViewsFilterString", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "paginate", "pageConfig", "pagination", "data", "views", "constrainViews", "boundedContext", "projectIds", "workbookIds", "view", "Err", "Ok", "z", "paramsSchema", "z", "getGetWorkbookTool", "server", "getWorkbookTool", "Tool", "workbookId", "requestId", "authInfo", "config", "getConfig", "isWorkbookAllowedResult", "resourceAccessChecker", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "workbook", "views", "Err", "error", "Ok", "z", "z", "FilterFieldSchema", "z", "allowedOperatorsByField", "_FilterExpressionSchema", "FilterOperatorSchema", "parseAndValidateWorkbooksFilterString", "filterString", "parseAndValidateFilterString", "paramsSchema", "z", "getListWorkbooksTool", "server", "listWorkbooksTool", "Tool", "genericFilterDescription", "filter", "pageSize", "limit", "requestId", "authInfo", "config", "getConfig", "validatedFilter", "parseAndValidateWorkbooksFilterString", "Ok", "useRestApi", "getTableauAuthInfo", "restApi", "paginate", "pageConfig", "pagination", "data", "workbooks", "constrainWorkbooks", "boundedContext", "projectIds", "workbookIds", "workbook", "toolFactories", "getGetDatasourceMetadataTool", "getListDatasourcesTool", "getQueryDatasourceTool", "getListAllPulseMetricDefinitionsTool", "getListPulseMetricDefinitionsFromDefinitionIdsTool", "getListPulseMetricsFromMetricDefinitionIdTool", "getListPulseMetricsFromMetricIdsTool", "getListPulseMetricSubscriptionsTool", "getGeneratePulseMetricValueInsightBundleTool", "getGetWorkbookTool", "getGetViewDataTool", "getGetViewImageTool", "getListWorkbooksTool", "getListViewsTool", "getSearchContentTool", "serverName", "serverVersion", "package_default", "userAgent", "Server", "McpServer", "clientInfo", "authInfo", "name", "description", "paramsSchema", "annotations", "callback", "Provider", "SetLevelRequestSchema", "request", "setLogLevel", "includeTools", "excludeTools", "getConfig", "toolsToRegister", "toolFactories", "toolFactory", "tool", "toolNames", "StreamableHTTPServerTransport", "isInitializeRequest", "cors", "express", "fs", "existsSync", "http", "https", "StreamableHTTPServerTransport", "randomUUID", "sessions", "createSession", "clientInfo", "transport", "sessionId", "deleteSession", "getSession", "validateProtocolVersion", "req", "res", "next", "version", "supportedVersions", "createPrivateKey", "createPublicKey", "readFileSync", "oauthAuthorizationServer", "app", "_req", "res", "origin", "getConfig", "oauthProtectedResource", "app", "_req", "res", "issuer", "getConfig", "serverName", "compactDecrypt", "Err", "Ok", "fromError", "authMiddleware", "privateKey", "req", "res", "next", "authHeader", "baseUrl", "token", "result", "verifyAccessToken", "jwePrivateKey", "config", "getConfig", "plaintext", "compactDecrypt", "payload", "mcpAccessToken", "mcpAccessTokenUserOnlySchema", "Err", "fromError", "iss", "aud", "exp", "clientId", "AUDIENCE", "tableauAuthInfo", "mcpAccessTokenSchema", "tableauAccessToken", "tableauRefreshToken", "tableauExpiresAt", "tableauUserId", "tableauServer", "sub", "Ok", "axiosRetry", "randomBytes", "randomUUID", "isIP", "isSSRFSafeURL", "Err", "Ok", "fromError", "parseUrl", "url", "setLongTimeout", "callback", "delay", "args", "clientMetadataCache", "ExpiringMap", "TEN_MINUTES_IN_MS", "Resolver", "dnsResolver", "getDnsResolver", "Resolver", "getConfig", "createHash", "generateCodeChallenge", "verifier", "isValidRedirectUri", "redirectUri", "url", "authorize", "app", "pendingAuthorizations", "config", "getConfig", "req", "res", "result", "mcpAuthorizeSchema", "fromError", "client_id", "redirect_uri", "response_type", "code_challenge", "code_challenge_method", "state", "clientIdUrl", "parseUrl", "clientResult", "getClientFromMetadataDoc", "redirect_uris", "response_types", "type", "isValidRedirectUri", "tableauState", "randomBytes", "authKey", "tableauClientId", "randomUUID", "numCodeVerifierBytes", "tableauCodeVerifier", "tableauCodeChallenge", "generateCodeChallenge", "setLongTimeout", "server", "TABLEAU_CLOUD_SERVER_URL", "oauthUrl", "getDeviceName", "clientMetadataUrl", "originalUrl", "cache", "clientMetadataCache", "Ok", "originalHostname", "isIP", "dnsResolver", "getDnsResolver", "ipAddress", "Err", "isSSRFSafeURL", "response", "client", "axios_default", "axiosRetry", "contentType", "getStringResponseHeader", "s", "clientMetadataResult", "cimdMetadataSchema", "cacheControl", "cacheControlMaxAge", "maxAgeDirective", "cacheExpiryMs", "cacheControlMaxAgeSeconds", "ONE_DAY_IN_MS", "redirectUri", "defaultDeviceName", "url", "randomBytes", "Err", "Ok", "fromError", "Zodios", "makeApi", "z", "tableauAccessTokenRequestSchema", "z", "tableauAccessTokenResponseSchema", "requiredString", "data", "tableauTokenApi", "makeApi", "tableauAccessTokenResponseSchema", "tableauAccessTokenRequestSchema", "getClient", "basePath", "Zodios", "tableauTokenApi", "getTokenResult", "basePath", "request", "getClient", "userAgent", "callback", "app", "pendingAuthorizations", "authorizationCodes", "config", "getConfig", "req", "res", "result", "callbackSchema", "fromError", "error", "code", "state", "authKey", "tableauState", "pendingAuth", "tokensResult", "exchangeAuthorizationCode", "TABLEAU_CLOUD_SERVER_URL", "accessToken", "refreshToken", "expiresInSeconds", "originHost", "originHostUrl", "configServerUrl", "server", "restApi", "RestApi", "sessionResult", "authorizationCode", "randomBytes", "redirectUrl", "redirectUri", "clientId", "codeVerifier", "getTokenResult", "Ok", "Err", "express", "register", "app", "express", "req", "res", "redirect_uris", "validatedRedirectUris", "uri", "isValidRedirectUri", "token_endpoint_auth_method", "randomBytes", "timingSafeEqual", "CompactEncrypt", "Err", "Ok", "fromError", "token", "app", "authorizationCodes", "refreshTokens", "publicKey", "config", "getConfig", "req", "res", "result", "mcpTokenSchema", "fromError", "clientCredentialsResult", "verifyClientCredentials", "code", "codeVerifier", "authCode", "generateCodeChallenge", "refreshTokenId", "randomBytes", "accessToken", "createAccessToken", "setLongTimeout", "createClientCredentialsAccessToken", "refreshToken", "tokenData", "tableauRefreshToken", "tokensResult", "exchangeRefreshToken", "newTableauAccessToken", "newTableauRefreshToken", "expiresInSeconds", "error", "payload", "AUDIENCE", "CompactEncrypt", "clientCredentials", "server", "clientId", "getTokenResult", "Ok", "Err", "required", "clientSecret", "clientIdSecretPairs", "authorizationHeader", "type", "credentials", "expectedClientSecret", "textEncoder", "clientSecretBuffer", "expectedClientSecretBuffer", "timingSafeEqual", "TABLEAU_CLOUD_SERVER_URL", "AUDIENCE", "OAuthProvider", "getConfig", "createPublicKey", "authMiddleware", "app", "oauthAuthorizationServer", "oauthProtectedResource", "register", "authorize", "callback", "token", "privateKeyContents", "readFileSync", "createPrivateKey", "SESSION_ID_HEADER", "startExpressServer", "basePath", "config", "logLevel", "app", "express", "cors", "middleware", "oauthProvider", "OAuthProvider", "validateProtocolVersion", "path", "createMcpServer", "methodNotAllowed", "handleSessionRequest", "resolve", "server", "http", "existsSync", "options", "fs", "https", "req", "res", "transport", "Server", "StreamableHTTPServerTransport", "connect", "getTableauAuthInfo", "sessionId", "session", "getSession", "isInitializeRequest", "clientInfo", "createSession", "error", "authInfo", "setLogLevel", "_req", "startServer", "dotenv", "config", "getConfig", "logLevel", "isLoggingLevel", "setServerLogger", "ServerLogger", "server", "Server", "transport", "StdioServerTransport", "setLogLevel", "log", "url", "startExpressServer", "serverName", "serverVersion", "writeToStderr", "error", "getExceptionMessage"]
|
|
7
7
|
}
|