/* eslint-disable @typescript-eslint/no-explicit-any */ import { WebApiSpec } from '../schema/WebApiSchema.js'; import { Config } from '../types/Config.js'; import { PagingState } from '../types/PagingState.js'; import { Plugin } from '../types/Plugin.js'; import { PluginContext } from '../types/PluginContext.js'; import { SqupContext } from '../types/SqupContext.js'; import type { } from '../types/fetch.js'; // NodeJS v18 has fetch in core, but no types :( import { CallApi } from './ApiFetcher.js'; export async function TestConfig( plugin: Plugin, webapiSpec: WebApiSpec, config: Config, squpContext: SqupContext ) { const testConfig = webapiSpec.testConfig; if (!testConfig || !Array.isArray(testConfig.apis) || testConfig.apis.length <= 0) { throw new Error('TestConfig: empty or missing testConfig.apis array'); } const apiDefinitions = (Array.isArray(webapiSpec.api) ? webapiSpec.api : []).reduce( (acc, val) => acc.set(val.name, val), new Map() ); const pluginContext: PluginContext = { plugin, config, apiDefinitions, lookUps: new Map(), lookUpCache: new Map(), dataTransforms: webapiSpec.dataTransforms ?? [] }; let errored = false; const messages = []; const testSqupContext = { ...squpContext, report: { warning: (message: string): void => { messages.push({ status: 'warning', message }); }, error: (message: string): void => { throw new PluginError(message); } } }; for (let tn = 0; tn < testConfig.apis.length && !errored; tn++) { try { const apiSpec = testConfig.apis[tn]; const pagingState: PagingState = { complete: false, recordCount: 0 }; await CallApi(pluginContext, apiSpec, pagingState, testSqupContext); } catch (err: any) { if (err.isUserFacing) { messages.push({ status: 'error', message: err.message }); errored = true; } else { throw new Error (`TestConfig: unexpected exception occurred: ${err.message}`); } } } if (messages.length <= 0) { messages.push({ status: 'success', message: 'Configuration is valid' }); } return { link: testConfig.helpUrl ?? `https://squaredup.com/cloud/pluginsetup-${plugin.name.toLowerCase()}`, messages }; } class PluginError extends Error { isUserFacing: boolean; constructor(message: string) { super(message); this.isUserFacing = true; } }