@aws-cdk-testing/cli-integ
Version:
Integration tests for the AWS CDK CLI
94 lines • 14.8 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 __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const path = __importStar(require("path"));
const lib_1 = require("../../lib");
const npm_1 = require("../../lib/npm");
['app', 'sample-app'].forEach(template => {
(0, lib_1.integTest)(`typescript init ${template}`, (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
const shell = lib_1.ShellHelper.fromContext(context);
await context.cli.makeCliAvailable();
await shell.shell(['cdk', 'init', '--lib-version', context.library.requestedVersion(), '-l', 'typescript', template]);
await shell.shell(['npm', 'ci']); // this will fail if we have bundled dependencies that introduce version conflicts
await shell.shell(['npm', 'prune']);
await shell.shell(['npm', 'ls']); // this will fail if we have unmet peer dependencies
await shell.shell(['npm', 'run', 'build']);
await shell.shell(['npm', 'run', 'test']);
await shell.shell(['cdk', 'synth']);
})), 300_000);
});
// Same as https://github.com/DefinitelyTyped/DefinitelyTyped?tab=readme-ov-file#support-window
const TYPESCRIPT_VERSION_AGE_DAYS = 2 * 365;
const TYPESCRIPT_VERSIONS = (0, npm_1.typescriptVersionsYoungerThanDaysSync)(TYPESCRIPT_VERSION_AGE_DAYS, (0, npm_1.typescriptVersionsSync)());
/**
* Test our generated code with various versions of TypeScript
*/
TYPESCRIPT_VERSIONS.forEach(tsVersion => {
(0, lib_1.integTest)(`typescript ${tsVersion} init app`, (0, lib_1.withTemporaryDirectory)((0, lib_1.withPackages)(async (context) => {
const shell = lib_1.ShellHelper.fromContext(context);
await context.cli.makeCliAvailable();
await shell.shell(['node', '--version']);
await shell.shell(['npm', '--version']);
await shell.shell(['cdk', 'init', '--lib-version', context.library.requestedVersion(), '-l', 'typescript', 'app', '--generate-only']);
// Remove devDependencies that may have peer dependency constraints incompatible
// with older TypeScript versions we test against.
await removeDevDependencies(context);
// The generated app type-checks with `tsc` and runs through `tsx`, so those
// two packages are the only toolchain needed for `cdk synth`.
await shell.shell(['npm', 'install', '--save-dev', `typescript@${tsVersion}`, 'tsx@^4']);
await shell.shell(['npm', 'install']); // Older versions of npm require this to be a separate step from the one above
await shell.shell(['npx', 'tsc', '--version']);
await shell.shell(['npm', 'prune']);
await shell.shell(['npm', 'ls']); // this will fail if we have unmet peer dependencies
// We just removed the 'jest' dependency so remove the tests as well because they won't compile
await shell.shell(['rm', '-rf', 'test/']);
await shell.shell(['npm', 'run', 'build']);
await shell.shell(['cdk', 'synth']);
})));
});
async function removeDevDependencies(context) {
const filename = path.join(context.integTestDir, 'package.json');
const pj = JSON.parse(await fs_1.promises.readFile(filename, { encoding: 'utf-8' }));
delete pj.devDependencies;
await fs_1.promises.writeFile(filename, JSON.stringify(pj, undefined, 2), { encoding: 'utf-8' });
// The generated tsconfig explicitly lists the @types packages we just removed;
// with them gone, tsc would fail on the missing type definition files.
const tsconfigFilename = path.join(context.integTestDir, 'tsconfig.json');
const tsconfig = JSON.parse(await fs_1.promises.readFile(tsconfigFilename, { encoding: 'utf-8' }));
delete tsconfig.compilerOptions.types;
await fs_1.promises.writeFile(tsconfigFilename, JSON.stringify(tsconfig, undefined, 2), { encoding: 'utf-8' });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC10eXBlc2NyaXB0LWFwcC5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbml0LXR5cGVzY3JpcHQtYXBwLmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJCQUFvQztBQUNwQywyQ0FBNkI7QUFFN0IsbUNBQXlGO0FBQ3pGLHVDQUE4RjtBQUU5RixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7SUFDdkMsSUFBQSxlQUFTLEVBQUMsbUJBQW1CLFFBQVEsRUFBRSxFQUFFLElBQUEsNEJBQXNCLEVBQUMsSUFBQSxrQkFBWSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUM3RixNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVyQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRXRILE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsa0ZBQWtGO1FBRXBILE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsb0RBQW9EO1FBQ3RGLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUss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QUM7SUFDakUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLGFBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDMUIsTUFBTSxhQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUV0RiwrRUFBK0U7SUFDL0UsdUVBQXVFO0lBQ3ZFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxhQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixPQUFPLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQ3RDLE1BQU0sYUFBRSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUN0RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHR5cGUgeyBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB7IGludGVnVGVzdCwgd2l0aFRlbXBvcmFyeURpcmVjdG9yeSwgU2hlbGxIZWxwZXIsIHdpdGhQYWNrYWdlcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgeyB0eXBlc2NyaXB0VmVyc2lvbnNTeW5jLCB0eXBlc2NyaXB0VmVyc2lvbnNZb3VuZ2VyVGhhbkRheXNTeW5jIH0gZnJvbSAnLi4vLi4vbGliL25wbSc7XG5cblsnYXBwJywgJ3NhbXBsZS1hcHAnXS5mb3JFYWNoKHRlbXBsYXRlID0+IHtcbiAgaW50ZWdUZXN0KGB0eXBlc2NyaXB0IGluaXQgJHt0ZW1wbGF0ZX1gLCB3aXRoVGVtcG9yYXJ5RGlyZWN0b3J5KHdpdGhQYWNrYWdlcyhhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHNoZWxsID0gU2hlbGxIZWxwZXIuZnJvbUNvbnRleHQoY29udGV4dCk7XG4gICAgYXdhaXQgY29udGV4dC5jbGkubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnaW5pdCcsICctLWxpYi12ZXJzaW9uJywgY29udGV4dC5saWJyYXJ5LnJlcXVlc3RlZFZlcnNpb24oKSwgJy1sJywgJ3R5cGVzY3JpcHQnLCB0ZW1wbGF0ZV0pO1xuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAnY2knXSk7IC8vIHRoaXMgd2lsbCBmYWlsIGlmIHdlIGhhdmUgYnVuZGxlZCBkZXBlbmRlbmNpZXMgdGhhdCBpbnRyb2R1Y2UgdmVyc2lvbiBjb25mbGljdHNcblxuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ3BydW5lJ10pO1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ2xzJ10pOyAvLyB0aGlzIHdpbGwgZmFpbCBpZiB3ZSBoYXZlIHVubWV0IHBlZXIgZGVwZW5kZW5jaWVzXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAncnVuJywgJ2J1aWxkJ10pO1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ3J1bicsICd0ZXN0J10pO1xuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWydjZGsnLCAnc3ludGgnXSk7XG4gIH0pKSwgMzAwXzAwMCk7XG59KTtcblxuLy8gU2FtZSBhcyBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZD90YWI9cmVhZG1lLW92LWZpbGUjc3VwcG9ydC13aW5kb3dcbmNvbnN0IFRZUEVTQ1JJUFRfVkVSU0lPTl9BR0VfREFZUyA9IDIgKiAzNjU7XG5cbmNvbnN0IFRZUEVTQ1JJUFRfVkVSU0lPTlMgPSB0eXBlc2NyaXB0VmVyc2lvbnNZb3VuZ2VyVGhhbkRheXNTeW5jKFRZUEVTQ1JJUFRfVkVSU0lPTl9BR0VfREFZUywgdHlwZXNjcmlwdFZlcnNpb25zU3luYygpKTtcblxuLyoqXG4gKiBUZXN0IG91ciBnZW5lcmF0ZWQgY29kZSB3aXRoIHZhcmlvdXMgdmVyc2lvbnMgb2YgVHlwZVNjcmlwdFxuICovXG5UWVBFU0NSSVBUX1ZFUlNJT05TLmZvckVhY2godHNWZXJzaW9uID0+IHtcbiAgaW50ZWdUZXN0KGB0eXBlc2NyaXB0ICR7dHNWZXJzaW9ufSBpbml0IGFwcGAsIHdpdGhUZW1wb3JhcnlEaXJlY3Rvcnkod2l0aFBhY2thZ2VzKGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgY29uc3Qgc2hlbGwgPSBTaGVsbEhlbHBlci5mcm9tQ29udGV4dChjb250ZXh0KTtcbiAgICBhd2FpdCBjb250ZXh0LmNsaS5tYWtlQ2xpQXZhaWxhYmxlKCk7XG5cbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ25vZGUnLCAnLS12ZXJzaW9uJ10pO1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJy0tdmVyc2lvbiddKTtcblxuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnY2RrJywgJ2luaXQnLCAnLS1saWItdmVyc2lvbicsIGNvbnRleHQubGlicmFyeS5yZXF1ZXN0ZWRWZXJzaW9uKCksICctbCcsICd0eXBlc2NyaXB0JywgJ2FwcCcsICctLWdlbmVyYXRlLW9ubHknXSk7XG5cbiAgICAvLyBSZW1vdmUgZGV2RGVwZW5kZW5jaWVzIHRoYXQgbWF5IGhhdmUgcGVlciBkZXBlbmRlbmN5IGNvbnN0cmFpbnRzIGluY29tcGF0aWJsZVxuICAgIC8vIHdpdGggb2xkZXIgVHlwZVNjcmlwdCB2ZXJzaW9ucyB3ZSB0ZXN0IGFnYWluc3QuXG4gICAgYXdhaXQgcmVtb3ZlRGV2RGVwZW5kZW5jaWVzKGNvbnRleHQpO1xuXG4gICAgLy8gVGhlIGdlbmVyYXRlZCBhcHAgdHlwZS1jaGVja3Mgd2l0aCBgdHNjYCBhbmQgcnVucyB0aHJvdWdoIGB0c3hgLCBzbyB0aG9zZVxuICAgIC8vIHR3byBwYWNrYWdlcyBhcmUgdGhlIG9ubHkgdG9vbGNoYWluIG5lZWRlZCBmb3IgYGNkayBzeW50aGAuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAnaW5zdGFsbCcsICctLXNhdmUtZGV2JywgYHR5cGVzY3JpcHRAJHt0c1ZlcnNpb259YCwgJ3RzeEBeNCddKTtcblxuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ2luc3RhbGwnXSk7IC8vIE9sZGVyIHZlcnNpb25zIG9mIG5wbSByZXF1aXJlIHRoaXMgdG8gYmUgYSBzZXBhcmF0ZSBzdGVwIGZyb20gdGhlIG9uZSBhYm92ZVxuXG4gICAgYXdhaXQgc2hlbGwuc2hlbGwoWyducHgnLCAndHNjJywgJy0tdmVyc2lvbiddKTtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdwcnVuZSddKTtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdscyddKTsgLy8gdGhpcyB3aWxsIGZhaWwgaWYgd2UgaGF2ZSB1bm1ldCBwZWVyIGRlcGVuZGVuY2llc1xuXG4gICAgLy8gV2UganVzdCByZW1vdmVkIHRoZSAnamVzdCcgZGVwZW5kZW5jeSBzbyByZW1vdmUgdGhlIHRlc3RzIGFzIHdlbGwgYmVjYXVzZSB0aGV5IHdvbid0IGNvbXBpbGVcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ3JtJywgJy1yZicsICd0ZXN0LyddKTtcblxuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ3J1bicsICdidWlsZCddKTtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ2NkaycsICdzeW50aCddKTtcbiAgfSkpKTtcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXZEZXBlbmRlbmNpZXMoY29udGV4dDogVGVtcG9yYXJ5RGlyZWN0b3J5Q29udGV4dCkge1xuICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihjb250ZXh0LmludGVnVGVzdERpciwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBwaiA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoZmlsZW5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpO1xuICBkZWxldGUgcGouZGV2RGVwZW5kZW5jaWVzO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZW5hbWUsIEpTT04uc3RyaW5naWZ5KHBqLCB1bmRlZmluZWQsIDIpLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gIC8vIFRoZSBnZW5lcmF0ZWQgdHNjb25maWcgZXhwbGljaXRseSBsaXN0cyB0aGUgQHR5cGVzIHBhY2thZ2VzIHdlIGp1c3QgcmVtb3ZlZDtcbiAgLy8gd2l0aCB0aGVtIGdvbmUsIHRzYyB3b3VsZCBmYWlsIG9uIHRoZSBtaXNzaW5nIHR5cGUgZGVmaW5pdGlvbiBmaWxlcy5cbiAgY29uc3QgdHNjb25maWdGaWxlbmFtZSA9IHBhdGguam9pbihjb250ZXh0LmludGVnVGVzdERpciwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgdHNjb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHRzY29uZmlnRmlsZW5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpO1xuICBkZWxldGUgdHNjb25maWcuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICBhd2FpdCBmcy53cml0ZUZpbGUodHNjb25maWdGaWxlbmFtZSwgSlNPTi5zdHJpbmdpZnkodHNjb25maWcsIHVuZGVmaW5lZCwgMiksIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG59XG4iXX0=