UNPKG

@sprucelabs/spruce-cli

Version:

Command line interface for building Spruce skills.

157 lines 6.69 kB
"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