@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
157 lines • 6.69 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const schema_1 = require("@sprucelabs/schema");
const spruce_skill_utils_1 = require("@sprucelabs/spruce-skill-utils");
const skillFeature_schema_1 = __importDefault(require("./../../.spruce/schemas/spruceCli/v2020_07_22/skillFeature.schema"));
const ScriptUpdater_1 = __importDefault(require("../../updaters/ScriptUpdater"));
const AbstractFeature_1 = __importDefault(require("../AbstractFeature"));
const universalDevDependencies_1 = __importDefault(require("../universalDevDependencies"));
const universalFileDescriptions_1 = __importDefault(require("../universalFileDescriptions"));
const universalScripts_1 = __importDefault(require("../universalScripts"));
const Updater_1 = __importDefault(require("./updaters/Updater"));
class SkillFeature extends AbstractFeature_1.default {
nameReadable = 'Skill';
code = 'skill';
description = 'The scaffolding needed to run a Skill';
installOrderWeight = 100;
packageDependencies = [
{ name: '@sprucelabs/error' },
{ name: '@sprucelabs/spruce-skill-utils' },
{ name: '@sprucelabs/spruce-skill-booter' },
{ name: '@sprucelabs/spruce-event-utils' },
{ name: '@sprucelabs/spruce-event-plugin' },
{ name: '@sprucelabs/spruce-core-schemas' },
{ name: 'dotenv' },
{ name: '@sprucelabs/globby' },
{
name: '@sprucelabs/mercury-types',
},
{ name: 'tsconfig-paths', isDev: true },
{ name: '@sprucelabs/spruce-test-fixtures@latest', isDev: true },
{ name: 'ts-node', isDev: true },
...universalDevDependencies_1.default,
];
optionsSchema = skillFeature_schema_1.default;
actionsDir = spruce_skill_utils_1.diskUtil.resolvePath(__dirname, 'actions');
engines = {
yarn: '1.x',
};
scripts = {
boot: 'node build/index',
'boot.local': 'node -r ts-node/register -r tsconfig-paths/register ./src/index',
health: 'yarn boot --health',
'health.local': 'yarn boot.local --health',
...universalScripts_1.default,
build: 'yarn clean && yarn run build.copy-files && tsc -p tsconfig.prod.json && yarn build.resolve-paths && rm -rf build/__tests__',
};
fileDescriptions = [
...universalFileDescriptions_1.default,
{
path: 'src/index.ts',
description: 'The file that "boots" the skill.',
shouldOverwriteWhenChanged: true,
},
{
path: 'errors/SpruceError.ts',
description: 'Starting error class that you can edit.',
shouldOverwriteWhenChanged: false,
},
{
path: '.spruce/skill.ts',
description: 'Used to support booting the skill.',
shouldOverwriteWhenChanged: true,
},
{
path: '.spruce/errors/options.types.ts',
description: 'Holds all possible error codes and options. Will be updated as you create more errors (spruce create.error).',
shouldOverwriteWhenChanged: true,
},
{
path: 'src/.spruce/features/event.plugin.ts',
description: 'Gives your skill event support through local boot events and optionall Mercury (spruce event.listen).',
shouldOverwriteWhenChanged: true,
},
{
path: 'tsconfig.prod.json',
description: 'Configuration for building for production.',
shouldOverwriteWhenChanged: true,
},
];
constructor(options) {
super(options);
void this.emitter.on(`test.register-abstract-test-classes`, this.handleRegisterAbstractTestClasses.bind(this));
void this.emitter.on('feature.will-execute', this.handleWillExecute.bind(this));
}
async handleRegisterAbstractTestClasses() {
return {
abstractClasses: [
{
name: 'AbstractSpruceFixtureTest',
label: 'AbstractSpruceFixtureTest',
import: '@sprucelabs/spruce-test-fixtures',
featureCode: 'node',
},
],
};
}
async beforePackageInstall(options) {
const { files } = await this.install(options);
return { files, cwd: this.resolveDestination(options) };
}
async afterPackageInstall(options) {
const destination = this.resolveDestination(options);
await this.Store('skill', {
cwd: destination,
}).setCurrentSkillsNamespace(options.name);
return {};
}
async install(options) {
(0, schema_1.validateSchemaValues)(skillFeature_schema_1.default, options);
const destination = this.resolveDestination(options);
if (!spruce_skill_utils_1.diskUtil.doesDirExist(destination)) {
spruce_skill_utils_1.diskUtil.createDir(destination);
}
const skillGenerator = this.Writer('skill');
const files = await skillGenerator.writeSkill(destination, options);
await this.installScripts(destination);
this.setEngines(destination);
const env = this.Service('env', destination);
env.set('SKILL_NAME', options.name);
return { files };
}
resolveDestination(options) {
return spruce_skill_utils_1.diskUtil.resolvePath(this.cwd, options.destination ?? '');
}
async installScripts(destination = this.cwd) {
const scriptUpdater = ScriptUpdater_1.default.FromFeature(this, {
cwd: destination,
});
await scriptUpdater.update();
}
setEngines(destination) {
const pkg = this.Service('pkg', destination);
const engines = pkg.get('engines') || {};
for (const name in this.engines) {
const all = this.engines;
engines[name] = this.engines[name];
}
pkg.set({ path: 'engines', value: engines });
}
async handleWillExecute(options) {
const { featureCode, actionCode, options: upgradeOptions } = options;
const isInstalled = await this.features.isInstalled('skill');
if (isInstalled && featureCode === 'node' && actionCode === 'upgrade') {
const updater = new Updater_1.default(this, this.emitter);
const files = await updater.updateFiles(upgradeOptions ?? {});
return {
files,
};
}
return {};
}
}
exports.default = SkillFeature;
//# sourceMappingURL=SkillFeature.js.map