@unito/integration-debugger
Version:
The Unito Integration Debugger
662 lines (661 loc) • 22.9 kB
JavaScript
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();
}
},
};
}
;