UNPKG

@unito/integration-debugger

Version:

The Unito Integration Debugger

662 lines (661 loc) 22.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.InspectMode = exports.CrawlMode = exports.Pane = exports.Window = void 0; exports.useWindowState = useWindowState; exports.useConfigurationState = useConfigurationState; exports.useStatusState = useStatusState; exports.useProfileState = useProfileState; exports.useIntegrationState = useIntegrationState; exports.useIntegrationsState = useIntegrationsState; exports.useCredentialState = useCredentialState; exports.useCredentialsState = useCredentialsState; exports.useIntegrationProcessState = useIntegrationProcessState; exports.useDebuggerState = useDebuggerState; const core_1 = require("@hookstate/core"); const configuration_1 = require("./resources/configuration"); const CrawlerDriver = __importStar(require("./services/crawlerDriver")); // // Window state. // var Window; (function (Window) { Window["help"] = "help"; Window["config"] = "config"; Window["debugger"] = "debugger"; Window["process"] = "process"; Window["quit"] = "quit"; })(Window || (exports.Window = Window = {})); const windowState = (0, core_1.hookstate)({ current: 'help', }); function useWindowState() { const state = (0, core_1.useHookstate)(windowState); return { get current() { return state.current.get(); }, set current(window) { state.current.set(window); }, }; } // // Configuration state. // const configurationState = (0, core_1.hookstate)({ apiKey: undefined, environment: configuration_1.Environment.None, integrationId: undefined, integrationUrl: undefined, credentialId: undefined, credentialPayload: undefined, secretsPayload: undefined, graphRelativeUrl: undefined, credentialAccountRelativeUrl: undefined, webhookParsingRelativeUrl: undefined, webhookSubscriptionsRelativeUrl: undefined, webhookAcknowledgeRelativeUrl: undefined, spawnProcessCommand: undefined, interactive: undefined, verbose: undefined, startingPath: undefined, startingOperation: undefined, outputFilePath: undefined, stepCheckKeys: undefined, operationCollectionItemsPerPage: undefined, operationCollectionFollowNextPages: undefined, readOnly: undefined, timeout: undefined, }); function useConfigurationState() { const state = (0, core_1.useHookstate)(configurationState); return { get current() { return state.get(); }, set current(configuration) { state.set((state) => Object.assign(state, configuration)); }, get apiKey() { return state.apiKey.get(); }, set apiKey(apiKey) { state.set((state) => Object.assign(state, { apiKey })); }, get environment() { return state.environment.get(); }, set environment(environment) { state.set((state) => Object.assign(state, { environment })); }, get integrationId() { return state.integrationId.get(); }, set integrationId(integrationId) { state.set((state) => Object.assign(state, { integrationId })); }, get credentialId() { return state.credentialId.get(); }, set credentialId(credentialId) { state.set((state) => Object.assign(state, { credentialId })); }, get integrationUrl() { return state.integrationUrl.get(); }, set integrationUrl(integrationUrl) { state.set((state) => Object.assign(state, { integrationUrl })); }, get credentialPayload() { return state.credentialPayload.get(); }, set credentialPayload(credentialPayload) { state.set((state) => Object.assign(state, { credentialPayload })); }, get secretsPayload() { return state.secretsPayload.get(); }, set secretsPayload(secretsPayload) { state.set((state) => Object.assign(state, { secretsPayload })); }, get spawnProcessCommand() { return state.spawnProcessCommand.get(); }, set spawnProcessCommand(spawnProcessCommand) { state.set((state) => Object.assign(state, { spawnProcessCommand })); }, get graphRelativeUrl() { return state.graphRelativeUrl.get(); }, set graphRelativeUrl(graphRelativeUrl) { state.set((state) => Object.assign(state, { graphRelativeUrl })); }, get credentialAccountRelativeUrl() { return state.credentialAccountRelativeUrl.get(); }, set credentialAccountRelativeUrl(credentialAccountRelativeUrl) { state.set((state) => Object.assign(state, { credentialAccountRelativeUrl })); }, get webhookParsingRelativeUrl() { return state.webhookParsingRelativeUrl.get(); }, set webhookParsingRelativeUrl(webhookParsingRelativeUrl) { state.set((state) => Object.assign(state, { webhookParsingRelativeUrl })); }, get webhookSubscriptionsRelativeUrl() { return state.webhookSubscriptionsRelativeUrl.get(); }, set webhookSubscriptionsRelativeUrl(webhookSubscriptionsRelativeUrl) { state.set((state) => Object.assign(state, { webhookSubscriptionsRelativeUrl })); }, get webhookAcknowledgeRelativeUrl() { return state.webhookAcknowledgeRelativeUrl.get(); }, set webhookAcknowledgeRelativeUrl(webhookAcknowledgeRelativeUrl) { state.set((state) => Object.assign(state, { webhookAcknowledgeRelativeUrl })); }, get interactive() { return state.interactive.get(); }, set interactive(interactive) { state.set((state) => Object.assign(state, { interactive })); }, get verbose() { return state.verbose.get(); }, set verbose(verbose) { state.set((state) => Object.assign(state, { verbose })); }, get startingPath() { return state.startingPath.get(); }, set startingPath(startingPath) { state.set((state) => Object.assign(state, { startingPath })); }, get startingOperation() { return state.startingOperation.get(); }, set startingOperation(startingOperation) { state.set((state) => Object.assign(state, { startingOperation })); }, get outputFilePath() { return state.outputFilePath.get(); }, set outputFilePath(outputFilePath) { state.set((state) => Object.assign(state, { outputFilePath })); }, get stepCheckKeys() { return state.stepCheckKeys.get(); }, set stepCheckKeys(stepCheckKeys) { state.set((state) => Object.assign(state, { stepCheckKeys })); }, get operationCollectionItemsPerPage() { return state.operationCollectionItemsPerPage.get(); }, set operationCollectionItemsPerPage(operationCollectionItemsPerPage) { state.set((state) => Object.assign(state, { operationCollectionItemsPerPage })); }, get operationCollectionFollowNextPages() { return state.operationCollectionFollowNextPages.get(); }, set operationCollectionFollowNextPages(operationCollectionFollowNextPages) { state.set((state) => Object.assign(state, { operationCollectionFollowNextPages })); }, get readOnly() { return state.readOnly.get(); }, set readOnly(readOnly) { state.set((state) => Object.assign(state, { readOnly })); }, get timeout() { return state.timeout.get(); }, set timeout(timeout) { state.set((state) => Object.assign(state, { timeout })); }, }; } const statusState = (0, core_1.hookstate)({ apiKey: true, environment: true, integration: true, credential: true, }); function useStatusState() { const state = (0, core_1.useHookstate)(statusState); return { get current() { return state.get(); }, set current(status) { state.set((state) => Object.assign(state, status)); }, get apiKey() { return state.apiKey.get(); }, set apiKey(apiKey) { state.set((state) => Object.assign(state, { apiKey })); }, get environment() { return state.environment.get(); }, set environment(environment) { state.set((state) => Object.assign(state, { environment })); }, get integration() { return state.integration.get(); }, set integration(integration) { state.set((state) => Object.assign(state, { integration })); }, get credential() { return state.credential.get(); }, set credential(credential) { state.set((state) => Object.assign(state, { credential })); }, }; } // // Profile state. // const profileState = (0, core_1.hookstate)(null); function useProfileState() { const state = (0, core_1.useHookstate)(profileState); return { get current() { return state.get(); }, set current(profile) { state.set((state) => { if (profile) { return Object.assign(state ?? {}, profile); } else { return null; } }); }, }; } // // Integration state. // const integrationState = (0, core_1.hookstate)(null); function useIntegrationState() { const state = (0, core_1.useHookstate)(integrationState); return { get current() { return state.get(); }, set current(integration) { state.set((state) => { if (integration) { return Object.assign(state ?? {}, integration); } else { return null; } }); }, }; } // // Integrations state. // const integrationsState = (0, core_1.hookstate)([]); function useIntegrationsState() { const state = (0, core_1.useHookstate)(integrationsState); return { get current() { return state.get(); }, set current(integrations) { state.set(integrations); }, }; } // // Credential state. // const credentialState = (0, core_1.hookstate)(null); function useCredentialState() { const state = (0, core_1.useHookstate)(credentialState); return { get current() { return state.get(); }, set current(credential) { state.set((state) => { if (credential) { return Object.assign(state ?? {}, credential); } else { return null; } }); }, }; } // // Credentials state. // const credentialsState = (0, core_1.hookstate)([]); function useCredentialsState() { const state = (0, core_1.useHookstate)(credentialsState); return { get current() { return state.get(); }, set current(credentials) { state.set(credentials); }, }; } const integrationProcessState = (0, core_1.hookstate)({ process: null, output: [] }); function useIntegrationProcessState() { const state = (0, core_1.useHookstate)(integrationProcessState); return { get process() { return state.process.get(); }, set process(integrationProcess) { const instance = { process: integrationProcess, output: [], }; state.set(instance); }, get output() { return state.output.get(); }, addLine(line) { state.output.set(output => { output.push(line); return output.slice(-1000); // keep last 1000 lines. }); }, }; } var Pane; (function (Pane) { Pane["None"] = "none"; Pane["Calls"] = "calls"; Pane["Stack"] = "stack"; Pane["Inspect"] = "inspect"; Pane["Output"] = "output"; })(Pane || (exports.Pane = Pane = {})); var CrawlMode; (function (CrawlMode) { CrawlMode["None"] = "none"; CrawlMode["StopOnError"] = "stopOnError"; CrawlMode["All"] = "all"; })(CrawlMode || (exports.CrawlMode = CrawlMode = {})); var InspectMode; (function (InspectMode) { InspectMode["Payloads"] = "payloads"; InspectMode["Headers"] = "headers"; InspectMode["Errors"] = "errors"; InspectMode["Warnings"] = "warnings"; })(InspectMode || (exports.InspectMode = InspectMode = {})); const paneOrder = [Pane.Calls, Pane.Inspect, Pane.Stack, Pane.Output]; const debuggerState = (0, core_1.hookstate)({ crawlerDriver: null, steps: [], selected: undefined, selectedStack: undefined, selectedPaneIndex: undefined, inspectMode: InspectMode.Payloads, crawlMode: CrawlMode.None, crawlModeTick: 0, startingPath: undefined, startingOperation: undefined, stepCheckKeys: undefined, }); function useDebuggerState() { const state = (0, core_1.useHookstate)(debuggerState); return { // // Getters / Setters. // get crawlerDriver() { return state.crawlerDriver.get(); }, set crawlerDriver(crawlerDriver) { state.crawlerDriver.set(crawlerDriver); }, get inspectMode() { return state.inspectMode.get(); }, set inspectMode(inspectMode) { state.inspectMode.set(inspectMode); }, get steps() { return state.steps.get(); }, get selected() { return state.selected.get(); }, set selected(selected) { if (selected) { state.selected.set(JSON.parse(JSON.stringify(selected))); } else { state.selected.set(undefined); } }, get selectedStack() { return state.selectedStack.get(); }, set selectedStack(selectedStack) { if (selectedStack) { state.selectedStack.set(JSON.parse(JSON.stringify(selectedStack))); } else { state.selectedStack.set(undefined); } }, get selectedPane() { const select = state.selectedPaneIndex.get(); return select === undefined ? Pane.None : paneOrder[select]; }, set selectedPane(selectedPane) { const paneIndex = paneOrder.indexOf(selectedPane); if (paneIndex === -1) { state.selectedPaneIndex.set(undefined); } else { state.selectedPaneIndex.set(paneIndex); } }, get selectedPaneIndex() { return state.selectedPaneIndex.get(); }, set selectedPaneIndex(selectedPaneIndex) { state.selectedPaneIndex.set(selectedPaneIndex); }, get crawlMode() { return state.crawlMode.get(); }, set crawlMode(crawlMode) { state.crawlMode.set(crawlMode); }, get crawlModeTick() { return state.crawlModeTick.get(); }, set crawlModeTick(crawlModeTick) { state.crawlModeTick.set(crawlModeTick); }, get startingPath() { return state.startingPath.get(); }, set startingPath(startingPath) { state.startingPath.set(startingPath); }, get startingOperation() { return state.startingOperation.get(); }, set startingOperation(startingOperation) { state.startingOperation.set(startingOperation); }, get stepCheckKeys() { return state.stepCheckKeys.get(); }, set stepCheckKeys(stepCheckKeys) { state.stepCheckKeys.set(stepCheckKeys); const crawlerDriver = state.crawlerDriver.get(); if (crawlerDriver) { crawlerDriver.stepCheckKeys = stepCheckKeys; } }, // // Operations. // clearSteps() { state.steps.set([]); }, addStep(step) { state.steps.set(steps => { steps.push(step); return steps; }); }, popStep() { state.steps.set(steps => { steps.pop(); return steps; }); }, nextPaneIndex() { state.selectedPaneIndex.set(currentIndex => { const nextPaneIndex = currentIndex === undefined ? 0 : (currentIndex + 1) % paneOrder.length; return nextPaneIndex; }); }, // // Crawler operations. // async stepOne() { const step = await state.crawlerDriver.get()?.next(); if (step) { this.addStep(step); this.selected = step; this.selectedStack = undefined; } return step; }, crawlWithStop() { this.crawlMode = CrawlMode.StopOnError; this.crawlModeTick = 1; }, crawlWithoutStop() { this.crawlMode = CrawlMode.All; this.crawlModeTick = 1; }, pause() { this.crawlMode = CrawlMode.None; }, async restart(options) { if (options.credentialId || (options.integrationUrl && options.credentialPayload && options.secretsPayload)) { let crawlerDriver; if (options.credentialId) { crawlerDriver = await CrawlerDriver.createWithProxyCrawler(options.credentialId, { readOnly: configurationState.readOnly.get() ?? false, timeout: configurationState.timeout.get(), [CrawlerDriver.Operation.GetCollection]: { itemsPerPage: configurationState.operationCollectionItemsPerPage.get(), followNextPage: configurationState.operationCollectionFollowNextPages.get(), }, }); } else { crawlerDriver = await CrawlerDriver.createWithDirectCrawler(options.integrationUrl ?? '', options.graphRelativeUrl ?? '/', options.credentialAccountRelativeUrl ?? '/me', options.webhookParsingRelativeUrl, options.webhookSubscriptionsRelativeUrl, options.webhookAcknowledgeRelativeUrl, options.credentialPayload ?? {}, options.secretsPayload ?? {}, { readOnly: configurationState.readOnly.get() ?? false, timeout: configurationState.timeout.get(), [CrawlerDriver.Operation.GetCollection]: { itemsPerPage: configurationState.operationCollectionItemsPerPage.get(), followNextPage: configurationState.operationCollectionFollowNextPages.get(), }, }); } crawlerDriver.stepCheckKeys = options.stepCheckKeys; crawlerDriver.startFrom({ path: options.startingPath ?? (options.credentialId ? '/' : (options.graphRelativeUrl ?? '/')), schemaPath: undefined, parentOperation: undefined, parentPath: undefined, requestSchema: undefined, operation: options.startingOperation ?? CrawlerDriver.Operation.GetItem, payloadIn: options.payloadIn ?? {}, warnings: [], errors: [], }); const instance = { crawlerDriver, steps: [], selected: undefined, selectedStack: undefined, selectedPaneIndex: undefined, inspectMode: InspectMode.Payloads, crawlMode: CrawlMode.None, crawlModeTick: 0, startingPath: options.startingPath, startingOperation: options.startingOperation ?? CrawlerDriver.Operation.GetItem, stepCheckKeys: options.stepCheckKeys, }; state.set(instance); } }, async goto(options) { await this.restart(options); await this.stepOne(); this.selected = state.steps.get().at(-1); this.selectedStack = undefined; }, async retrySelected() { const toRetry = state.selected.get(); if (toRetry) { // Must be done before removing "selected" from store. state.crawlerDriver.get()?.startFrom(toRetry); state.steps.set(steps => { return steps.filter(step => step.path !== toRetry.path); }); await this.stepOne(); } }, }; }