UNPKG

@sprucelabs/spruce-cli

Version:

Command line interface for building Spruce skills.

161 lines • 6.74 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const spruce_skill_utils_1 = require("@sprucelabs/spruce-skill-utils"); const syncEventOptions_schema_1 = __importDefault(require("./../../.spruce/schemas/spruceCli/v2020_07_22/syncEventOptions.schema")); const TerminalInterface_1 = __importDefault(require("../../interfaces/TerminalInterface")); const action_utility_1 = __importDefault(require("../../utilities/action.utility")); const AbstractFeature_1 = __importDefault(require("../AbstractFeature")); const EventContractBuilder_1 = __importDefault(require("./builders/EventContractBuilder")); const EventStore_1 = __importDefault(require("./stores/EventStore")); class EventFeature extends AbstractFeature_1.default { code = 'event'; nameReadable = 'Events'; description = 'Connect to the Mercury Event Engine.'; dependencies = [ { code: 'schema', isRequired: true }, { code: 'permission', isRequired: true }, ]; packageDependencies = [ { name: '@sprucelabs/mercury-client', }, { name: '@sprucelabs/mercury-types', }, { name: '@sprucelabs/spruce-event-utils', }, { name: '@sprucelabs/spruce-event-plugin', }, { name: '@sprucelabs/mercury-core-events', }, ]; actionsDir = spruce_skill_utils_1.diskUtil.resolvePath(__dirname, 'actions'); fileDescriptions = []; contractBuilder; initiatingAction; constructor(options) { super(options); void this.emitter.on('schema.did-fetch-schemas', this.handleDidFetchSchemas.bind(this)); void this.emitter.on('feature.will-execute', this.handleWillExecute.bind(this)); void this.emitter.on('feature.did-execute', this.handleDidExecute.bind(this)); } async afterPackageInstall() { spruce_skill_utils_1.diskUtil.createDir(spruce_skill_utils_1.diskUtil.resolvePath(this.cwd, 'src', 'events')); return this.optionallySyncListeners(); } async optionallySyncListeners() { let results = {}; const isSkillInstalled = await this.features.isInstalled('skill'); if (isSkillInstalled) { results = await this.Action('event', 'sync.listeners').execute({}); } return results; } async handleWillExecute(payload) { const { featureCode, actionCode } = payload; let results = {}; if (!this.initiatingAction) { EventStore_1.default.clearCache(); const combined = this.combineCodes(featureCode, actionCode); this.initiatingAction = combined; } if (featureCode === 'node' || featureCode === 'upgrade') { const settings = this.Service('eventCache'); settings.clearListenerCache(); } const isInstalled = await this.features.isInstalled('event'); const isRemoteRelevant = isInstalled && (featureCode === 'event' || featureCode === 'eventContract' || actionCode === 'login') && actionCode !== 'setRemote'; if (isRemoteRelevant) { const remoteResults = await this.appendRemoteToResultsOrPrompt(); results = action_utility_1.default.mergeActionResults(results, remoteResults); } return results; } async syncListenersAndMixinResults(results) { const syncResults = await this.optionallySyncListeners(); results = action_utility_1.default.mergeActionResults(results, syncResults); return results; } async handleDidExecute(payload) { const { featureCode, actionCode } = payload; const isInstalled = await this.features.isInstalled('event'); let results = {}; const isUpgrade = isInstalled && featureCode === 'node' && actionCode === 'upgrade'; if (isUpgrade) { results = await this.Action('event', 'sync').execute({}); results = await this.syncListenersAndMixinResults(results); } if (this.initiatingAction === this.combineCodes(featureCode, actionCode)) { EventStore_1.default.clearCache(); } return results; } combineCodes(featureCode, actionCode) { return `${featureCode}.${actionCode}`; } async appendRemoteToResultsOrPrompt() { const remote = this.Service('remote'); const r = remote.getRemote(); if (!r) { if (!TerminalInterface_1.default.doesSupportColor()) { throw new Error(`Dang! I couldn't find env.HOST. Once that is set, lets try again!`); } this.ui.stopLoading(); this.ui.renderLine(`Uh oh! It looks like you haven't configured your remote! We gotta do that.`); const results = await this.Action('event', 'setRemote').execute({}); return results; } else { return { summaryLines: [`Remote: ${r}`, `Host: ${remote.getHost()}`], }; } } async handleDidFetchSchemas(payload) { const isInstalled = await this.features.isInstalled(this.code); const lastSync = this.Service('eventCache').getLastSyncOptions(); if (lastSync && isInstalled) { const writer = this.getEventContractBuilder(); const uniqueSchemas = await writer.fetchContractsAndGenerateUniqueSchemas(payload.schemas ?? [], lastSync.shouldSyncOnlyCoreEvents, lastSync.shouldOnlySyncRemoteEvents); return { schemas: uniqueSchemas.schemas ?? [], }; } return { schemas: [], }; } getEventContractBuilder() { if (!this.contractBuilder) { this.contractBuilder = new EventContractBuilder_1.default({ cwd: this.cwd, optionsSchema: syncEventOptions_schema_1.default, ui: this.ui, eventGenerator: this.Writer('event'), eventStore: this.Store('event'), skillStore: this.Store('skill'), dependencyService: this.Service('dependency'), }); } return this.contractBuilder; } hasBeenSynced() { if (spruce_skill_utils_1.diskUtil.doesHashSprucePathExist(this.cwd)) { const writer = this.Writer('event'); return writer.hasCombinedContractBeenWritten(this.cwd); } return false; } } exports.default = EventFeature; //# sourceMappingURL=EventFeature.js.map