@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
110 lines • 4.38 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const spruce_event_utils_1 = require("@sprucelabs/spruce-event-utils");
const spruce_skill_utils_1 = require("@sprucelabs/spruce-skill-utils");
const SpruceError_1 = __importDefault(require("../../errors/SpruceError"));
const tsConfig_utility_1 = __importDefault(require("../../utilities/tsConfig.utility"));
const AbstractFeature_1 = __importDefault(require("../AbstractFeature"));
const ParentTestFinder_1 = __importDefault(require("../error/ParentTestFinder"));
class TestFeature extends AbstractFeature_1.default {
nameReadable = 'Testing';
description = 'Test first. Test everything! 💪';
code = 'test';
dependencies = [
{ code: 'skill', isRequired: false },
{ code: 'node', isRequired: true },
];
packageDependencies = [
{ name: '@sprucelabs/test@latest', isDev: true },
{ name: '@sprucelabs/test-utils@latest', isDev: true },
{ name: '@sprucelabs/jest-json-reporter@latest', isDev: true },
{ name: 'jest-circus', isDev: true },
{ name: 'jest', isDev: true },
];
actionsDir = spruce_skill_utils_1.diskUtil.resolvePath(__dirname, 'actions');
async afterPackageInstall() {
const service = this.Service('pkg');
this.configureJest(service);
this.configureScripts(service);
this.configureTsConfig();
return {};
}
configureTsConfig() {
try {
const tsConfig = tsConfig_utility_1.default.readConfig(this.cwd);
if (!tsConfig.compilerOptions.experimentalDecorators) {
tsConfig.compilerOptions.experimentalDecorators = true;
tsConfig_utility_1.default.setCompilerOption(this.cwd, 'experimentalDecorators', true);
}
}
catch (err) {
//@ts-ignore
}
}
configureScripts(service) {
let scripts = service.get('scripts');
if (!scripts) {
scripts = {};
}
if (!scripts.test) {
scripts.test = 'jest';
scripts['watch.tests'] = 'jest --watch';
service.set({ path: 'scripts', value: scripts });
}
}
configureJest(service) {
const jestConfig = {
testRunner: 'jest-circus/runner',
maxWorkers: 4,
testTimeout: 120000,
testEnvironment: 'node',
testPathIgnorePatterns: [
'<rootDir>/tmp/',
'<rootDir>/src/',
'<rootDir>/node_modules/',
'<rootDir>/build/__tests__/testDirsAndFiles/',
],
testMatch: ['**/__tests__/**/*.test.js?(x)'],
moduleNameMapper: {
'^#spruce/(.*)$': '<rootDir>/build/.spruce/$1',
},
};
const existingJest = service.get('jest');
if (!existingJest) {
service.set({ path: 'jest', value: jestConfig });
}
}
async buildParentClassCandidates() {
const parentFinder = new ParentTestFinder_1.default(this.cwd);
const candidates = (await parentFinder.findAbstractTests()).map((a) => ({ ...a, label: a.name }));
const results = await this.emitter.emit('test.register-abstract-test-classes');
const { payloads } = spruce_event_utils_1.eventResponseUtil.getAllResponsePayloadsAndErrors(results, SpruceError_1.default);
for (const payload of payloads) {
const { abstractClasses } = payload;
for (const ac of abstractClasses) {
const a = { ...ac, isDefaultExport: false };
if (ac.featureCode) {
const isInstalled = await this.features.isInstalled(ac.featureCode);
if (!isInstalled) {
a.label = `${a.label} (requires install)`;
}
}
candidates.push(a);
}
}
candidates.sort((a, b) => {
if (a.label > b.label) {
return 1;
}
else {
return -1;
}
});
return candidates;
}
}
exports.default = TestFeature;
//# sourceMappingURL=TestFeature.js.map