@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
161 lines • 6.74 kB
JavaScript
;
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