cdkdx
Version:
Zero-config CLI for aws cdk development
143 lines • 14.6 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestCommand = void 0;
const clipanion_1 = require("clipanion");
const jest = __importStar(require("jest"));
const presets_1 = __importDefault(require("ts-jest/presets"));
const base_command_1 = require("../base-command");
const ts_config_1 = require("../ts-config");
class TestCommand extends base_command_1.BaseProjectCommand {
async execute() {
process.env.NODE_ENV = 'test';
process.env.LAMBDAS = this.projectInfo.lambdasSrcPath;
const argv = [];
const projects = [];
if (this.projectInfo.workspaces) {
const infos = await this.projectInfo.getWorkspaceProjectInfos();
// TODO Remove isolatedModules? See https://github.com/kulshekhar/ts-jest/issues/1967
if (infos) {
for (const info of infos) {
projects.push(this.createCdkProjectConfig(info, true));
if (await info.hasLambdaSrc()) {
projects.push(this.createLambdaProjectConfig(info, true));
}
}
}
}
else {
projects.push(this.createCdkProjectConfig(this.projectInfo));
if (await this.projectInfo.hasLambdaSrc()) {
projects.push(this.createLambdaProjectConfig(this.projectInfo));
}
}
const jestConfig = {
collectCoverageFrom: ['src/**/*.ts', '!src/**/*.(spec|test).ts'],
watchPlugins: [
require.resolve('jest-watch-typeahead/filename'),
require.resolve('jest-watch-typeahead/testname'),
require.resolve('jest-watch-select-projects'),
],
projects,
};
argv.push('--config', JSON.stringify(jestConfig));
argv.push(...this.jestArgv);
await jest.run(argv);
return 0;
}
createCdkProjectConfig(info, isolatedModules = false) {
return {
displayName: { name: `${info.name} [cdk]`, color: 'white' },
rootDir: info.root,
transform: {
...presets_1.default.defaults.transform,
'.+\\.(css|html)$': require.resolve('jest-transform-stub'),
},
moduleFileExtensions: ['ts', 'js', 'json', 'html'],
testMatch: [`/**/*.(spec|test).ts`],
testPathIgnorePatterns: [info.lambdasSrcPath],
testEnvironment: 'node',
globals: {
'ts-jest': {
tsconfig: ts_config_1.TsConfig.fromJsiiTemplate().getCompilerOptions(),
isolatedModules,
},
},
};
}
createLambdaProjectConfig(info, isolatedModules = false) {
return {
displayName: { name: `${info.name} [lambda]`, color: 'white' },
rootDir: info.lambdasSrcPath,
transform: {
...presets_1.default.defaults.transform,
'.+\\.(css|html)$': require.resolve('jest-transform-stub'),
},
moduleFileExtensions: ['ts', 'js', 'json', 'html'],
testMatch: [`/**/*.(spec|test).ts`],
testEnvironment: 'node',
globals: {
'ts-jest': {
tsconfig: ts_config_1.TsConfig.fromLambdaTemplate().getCompilerOptions(),
isolatedModules,
},
},
};
}
}
TestCommand.usage = clipanion_1.Command.Usage({
description: 'Run jest test runner',
details: `
All flags are passed through directly to jest.
`,
examples: [
['Run jest', 'cdkdx test'],
['Run jest in watch mode', 'cdkdx test --watch'],
],
});
__decorate([
clipanion_1.Command.Proxy(),
__metadata("design:type", Array)
], TestCommand.prototype, "jestArgv", void 0);
__decorate([
clipanion_1.Command.Path('test'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], TestCommand.prototype, "execute", null);
exports.TestCommand = TestCommand;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jb21tYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3Rlc3QtY29tbWFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUFvQztBQUNwQywyQ0FBNkI7QUFDN0IsOERBQXdDO0FBRXhDLGtEQUFxRDtBQUVyRCw0Q0FBd0M7QUFDeEMsTUFBYSxXQUFZLFNBQVEsaUNBQWtCO0lBZ0JqRCxLQUFLLENBQUMsT0FBTztRQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUV0RCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7UUFFMUIsTUFBTSxRQUFRLEdBQThCLEVBQUUsQ0FBQztRQUUvQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBRWhFLHFGQUFxRjtZQUNyRixJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtvQkFDeEIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBRXZELElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO3FCQUMzRDtpQkFDRjthQUNGO1NBQ0Y7YUFBTTtZQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFD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QUMsVUFBVSxFQUFFLFlBQVksQ0FBQztRQUMxQixDQUFDLHdCQUF3QixFQUFFLG9CQUFvQixDQUFDO0tBQ2pEO0NBQ0YsQ0FBQyxDQUFDO0FBR0g7SUFEQyxtQkFBTyxDQUFDLEtBQUssRUFBRTs7NkNBQ1c7QUFHM0I7SUFEQyxtQkFBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7MENBK0NwQjtBQTlESCxrQ0EyR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY2xpcGFuaW9uJztcbmltcG9ydCAqIGFzIGplc3QgZnJvbSAnamVzdCc7XG5pbXBvcnQgdHNqUHJlc2V0IGZyb20gJ3RzLWplc3QvcHJlc2V0cyc7XG5cbmltcG9ydCB7IEJhc2VQcm9qZWN0Q29tbWFuZCB9IGZyb20gJy4uL2Jhc2UtY29tbWFuZCc7XG5pbXBvcnQgeyBQcm9qZWN0SW5mbyB9IGZyb20gJy4uL3Byb2plY3QtaW5mbyc7XG5pbXBvcnQgeyBUc0NvbmZpZyB9IGZyb20gJy4uL3RzLWNvbmZpZyc7XG5leHBvcnQgY2xhc3MgVGVzdENvbW1hbmQgZXh0ZW5kcyBCYXNlUHJvamVjdENvbW1hbmQge1xuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biBqZXN0IHRlc3QgcnVubmVyJyxcbiAgICBkZXRhaWxzOiBgXG4gICAgICAgICAgICBBbGwgZmxhZ3MgYXJlIHBhc3NlZCB0aHJvdWdoIGRpcmVjdGx5IHRvIGplc3QuXG4gICAgICAgIGAsXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgIFsnUnVuIGplc3QnLCAnY2RrZHggdGVzdCddLFxuICAgICAgWydSdW4gamVzdCBpbiB3YXRjaCBtb2RlJywgJ2Nka2R4IHRlc3QgLS13YXRjaCddLFxuICAgIF0sXG4gIH0pO1xuXG4gIEBDb21tYW5kLlByb3h5KClcbiAgcHVibGljIGplc3RBcmd2ITogc3RyaW5nW107XG5cbiAgQENvbW1hbmQuUGF0aCgndGVzdCcpXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9ICd0ZXN0JztcbiAgICBwcm9jZXNzLmVudi5MQU1CREFTID0gdGhpcy5wcm9qZWN0SW5mby5sYW1iZGFzU3JjUGF0aDtcblxuICAgIGNvbnN0IGFyZ3Y6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBwcm9qZWN0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMucHJvamVjdEluZm8ud29ya3NwYWNlcykge1xuICAgICAgY29uc3QgaW5mb3MgPSBhd2FpdCB0aGlzLnByb2plY3RJbmZvLmdldFdvcmtzcGFjZVByb2plY3RJbmZvcygpO1xuXG4gICAgICAvLyBUT0RPIFJlbW92ZSBpc29sYXRlZE1vZHVsZXM/IFNlZSBodHRwczovL2dpdGh1Yi5jb20va3Vsc2hla2hhci90cy1qZXN0L2lzc3Vlcy8xOTY3XG4gICAgICBpZiAoaW5mb3MpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbmZvIG9mIGluZm9zKSB7XG4gICAgICAgICAgcHJvamVjdHMucHVzaCh0aGlzLmNyZWF0ZUNka1Byb2plY3RDb25maWcoaW5mbywgdHJ1ZSkpO1xuXG4gICAgICAgICAgaWYgKGF3YWl0IGluZm8uaGFzTGFtYmRhU3JjKCkpIHtcbiAgICAgICAgICAgIHByb2plY3RzLnB1c2godGhpcy5jcmVhdGVMYW1iZGFQcm9qZWN0Q29uZmlnKGluZm8sIHRydWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvamVjdHMucHVzaCh0aGlzLmNyZWF0ZUNka1Byb2plY3RDb25maWcodGhpcy5wcm9qZWN0SW5mbykpO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5wcm9qZWN0SW5mby5oYXNMYW1iZGFTcmMoKSkge1xuICAgICAgICBwcm9qZWN0cy5wdXNoKHRoaXMuY3JlYXRlTGFtYmRhUHJvamVjdENvbmZpZyh0aGlzLnByb2plY3RJbmZvKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgamVzdENvbmZpZyA9IHtcbiAgICAgIGNvbGxlY3RDb3ZlcmFnZUZyb206IFsnc3JjLyoqLyoudHMnLCAnIXNyYy8qKi8qLihzcGVjfHRlc3QpLnRzJ10sXG4gICAgICB3YXRjaFBsdWdpbnM6IFtcbiAgICAgICAgcmVxdWlyZS5yZXNvbHZlKCdqZXN0LXdhdGNoLXR5cGVhaGVhZC9maWxlbmFtZScpLFxuICAgICAgICByZXF1aXJlLnJlc29sdmUoJ2plc3Qtd2F0Y2gtdHlwZWFoZWFkL3Rlc3RuYW1lJyksXG4gICAgICAgIHJlcXVpcmUucmVzb2x2ZSgnamVzdC13YXRjaC1zZWxlY3QtcHJvamVjdHMnKSxcbiAgICAgIF0sXG4gICAgICBwcm9qZWN0cyxcbiAgICB9O1xuXG4gICAgYXJndi5wdXNoKCctLWNvbmZpZycsIEpTT04uc3RyaW5naWZ5KGplc3RDb25maWcpKTtcblxuICAgIGFyZ3YucHVzaCguLi50aGlzLmplc3RBcmd2KTtcblxuICAgIGF3YWl0IGplc3QucnVuKGFyZ3YpO1xuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNka1Byb2plY3RDb25maWcoaW5mbzogUHJvamVjdEluZm8sIGlzb2xhdGVkTW9kdWxlcyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlOYW1lOiB7IG5hbWU6IGAke2luZm8ubmFtZX0gW2Nka11gLCBjb2xvcjogJ3doaXRlJyB9LFxuICAgICAgcm9vdERpcjogaW5mby5yb290LFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIC4uLnRzalByZXNldC5kZWZhdWx0cy50cmFuc2Zvcm0sXG4gICAgICAgICcuK1xcXFwuKGNzc3xodG1sKSQnOiByZXF1aXJlLnJlc29sdmUoJ2plc3QtdHJhbnNmb3JtLXN0dWInKSxcbiAgICAgIH0sXG4gICAgICBtb2R1bGVGaWxlRXh0ZW5zaW9uczogWyd0cycsICdqcycsICdqc29uJywgJ2h0bWwnXSxcbiAgICAgIHRlc3RNYXRjaDogW2AvKiovKi4oc3BlY3x0ZXN0KS50c2BdLFxuICAgICAgdGVzdFBhdGhJZ25vcmVQYXR0ZXJuczogW2luZm8ubGFtYmRhc1NyY1BhdGhdLFxuICAgICAgdGVzdEVudmlyb25tZW50OiAnbm9kZScsXG4gICAgICBnbG9iYWxzOiB7XG4gICAgICAgICd0cy1qZXN0Jzoge1xuICAgICAgICAgIHRzY29uZmlnOiBUc0NvbmZpZy5mcm9tSnNpaVRlbXBsYXRlKCkuZ2V0Q29tcGlsZXJPcHRpb25zKCksXG4gICAgICAgICAgaXNvbGF0ZWRNb2R1bGVzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMYW1iZGFQcm9qZWN0Q29uZmlnKFxuICAgIGluZm86IFByb2plY3RJbmZvLFxuICAgIGlzb2xhdGVkTW9kdWxlcyA9IGZhbHNlLFxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU5hbWU6IHsgbmFtZTogYCR7aW5mby5uYW1lfSBbbGFtYmRhXWAsIGNvbG9yOiAnd2hpdGUnIH0sXG4gICAgICByb290RGlyOiBpbmZvLmxhbWJkYXNTcmNQYXRoLFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIC4uLnRzalByZXNldC5kZWZhdWx0cy50cmFuc2Zvcm0sXG4gICAgICAgICcuK1xcXFwuKGNzc3xodG1sKSQnOiByZXF1aXJlLnJlc29sdmUoJ2plc3QtdHJhbnNmb3JtLXN0dWInKSxcbiAgICAgIH0sXG4gICAgICBtb2R1bGVGaWxlRXh0ZW5zaW9uczogWyd0cycsICdqcycsICdqc29uJywgJ2h0bWwnXSxcbiAgICAgIHRlc3RNYXRjaDogW2AvKiovKi4oc3BlY3x0ZXN0KS50c2BdLFxuICAgICAgdGVzdEVudmlyb25tZW50OiAnbm9kZScsXG4gICAgICBnbG9iYWxzOiB7XG4gICAgICAgICd0cy1qZXN0Jzoge1xuICAgICAgICAgIHRzY29uZmlnOiBUc0NvbmZpZy5mcm9tTGFtYmRhVGVtcGxhdGUoKS5nZXRDb21waWxlck9wdGlvbnMoKSxcbiAgICAgICAgICBpc29sYXRlZE1vZHVsZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==