@aws-cdk-testing/cli-integ
Version:
Integration tests for the AWS CDK CLI
101 lines • 16.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = require("fs");
const path = require("path");
const with_tool_context_1 = require("./with-tool-context");
const lib_1 = require("../../lib");
const TIMEOUT = 1800_000;
(0, lib_1.integTest)('amplify integration', (0, with_tool_context_1.withToolContext)(async (context) => {
const shell = lib_1.ShellHelper.fromContext(context);
////////////////////////////////////////////////////////////////////////
// Make sure that create-amplify installs the right versions of the CLI and framework
//
// Install `create-amplify` without running it, then hack the json file with the
// package versions in it before we execute.
await shell.shell(['npm', 'init', '-y']);
await shell.shell(['npm', 'install', '--save-dev', 'create-amplify@latest']);
// This will create 'package.json' implicating a certain version of the CDK
await shell.shell(['npm', 'config', 'set', 'save-exact', 'true']);
await mutateAmplifyDepOnCdk(context, context.cli.requestedVersion(), context.library.requestedVersion());
////////////////////////////////////////////////////////////////////////
// Run the `npm create` workflow
//
// I tested to confirm that this will use the locally installed `create-amplify`
await shell.shell(['npm', 'create', '-y', 'amplify']);
await shell.shell(['npx', 'ampx', 'configure', 'telemetry', 'disable']);
const awsCreds = context.aws.identityEnv();
await shell.shell(['npx', 'ampx', 'sandbox', '--once'], {
modEnv: {
AWS_REGION: context.aws.region,
...awsCreds,
},
});
try {
// Future code goes here, putting the try/finally here already so it doesn't
// get forgotten.
}
finally {
await shell.shell(['npx', 'ampx', 'sandbox', 'delete', '--yes'], {
modEnv: {
AWS_REGION: context.aws.region,
...awsCreds,
},
});
}
}), TIMEOUT);
async function mutateAmplifyDepOnCdk(context, cliVersion, libVersion) {
// default_packages.json is where create-amplify reads when installing npm dependencies
const amplifyDepFile = path.join(context.integTestDir, 'node_modules', 'create-amplify', 'lib', 'default_packages.json');
const amplifyDepJson = JSON.parse(await fs_1.promises.readFile(amplifyDepFile, { encoding: 'utf-8' }));
// Be extra paranoid about the types here, since we don't fully control them
assertIsObject(amplifyDepJson);
assertIsStringArray(amplifyDepJson.defaultDevPackages);
// Amplify is removing the dependency on aws-cdk, since Amplify is now using the toolkit-lib
// To prepare for this change, we need allow both situations: aws-cdk being listed and not being listed
// Fix is to simply allow the replace operation to also NOT replace the version
// @see https://github.com/aws-amplify/amplify-backend/pull/2614
replacePackageVersionIn('aws-cdk', cliVersion, amplifyDepJson.defaultDevPackages, false);
replacePackageVersionIn('aws-cdk-lib', libVersion, amplifyDepJson.defaultDevPackages);
await fs_1.promises.writeFile(amplifyDepFile, JSON.stringify(amplifyDepJson, undefined, 2), { encoding: 'utf-8' });
const packageJsonFile = path.join(context.integTestDir, 'package.json');
const packageJson = JSON.parse(await fs_1.promises.readFile(packageJsonFile, { encoding: 'utf-8' }));
assertIsObject(packageJson);
packageJson.overrides = {
'aws-cdk-lib': libVersion,
};
await fs_1.promises.writeFile(packageJsonFile, JSON.stringify(packageJson, undefined, 2), { encoding: 'utf-8' });
}
/**
* Mutably update the given string array, replacing the version of packages with the given name
*
* We assume the list of packages is a string array of the form
*
* ```
* ["package@version", "package@version", ...]
* ```
*
* It's a failure if we don't find an entry to update, unless we explicitly pass an option to say that's okay.
*/
function replacePackageVersionIn(packName, version, xs, failIfMissing = true) {
let didUpdate = false;
for (let i = 0; i < xs.length; i++) {
if (xs[i].startsWith(`${packName}@`)) {
xs[i] = `${packName}@${version}`;
didUpdate = true;
}
}
if (failIfMissing && !didUpdate) {
throw new Error(`Did not find a package version to update for ${packName} in ${JSON.stringify(xs)}`);
}
}
function assertIsObject(xs) {
if (typeof xs !== 'object' || xs === null) {
throw new Error(`Expected object, got ${JSON.stringify(xs)}`);
}
}
function assertIsStringArray(xs) {
if (!Array.isArray(xs) || xs.length === 0 || typeof xs[0] !== 'string') {
throw new Error(`Expected list of strings, got ${JSON.stringify(xs)}`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wbGlmeS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhbXBsaWZ5LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJCQUFvQztBQUNwQyw2QkFBNkI7QUFDN0IsMkRBQXNEO0FBRXRELG1DQUFtRDtBQUVuRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFFekIsSUFBQSxlQUFTLEVBQUMscUJBQXFCLEVBQUUsSUFBQSxtQ0FBZSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNqRSxNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQyx3RUFBd0U7SUFDeEUsc0ZBQXNGO0lBQ3RGLEVBQUU7SUFFRixnRkFBZ0Y7SUFDaEYsNENBQTRDO0lBQzVDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7SUFDN0UsMkVBQTJFO0lBQzNFLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUV6Ryx3RUFBd0U7SUFDeEUsaUNBQWlDO0lBQ2pDLEVBQUU7SUFFRixnRkFBZ0Y7SUFDaEYsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxD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Q0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgd2l0aFRvb2xDb250ZXh0IH0gZnJvbSAnLi93aXRoLXRvb2wtY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFRlbXBvcmFyeURpcmVjdG9yeUNvbnRleHQgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCBTaGVsbEhlbHBlciB9IGZyb20gJy4uLy4uL2xpYic7XG5cbmNvbnN0IFRJTUVPVVQgPSAxODAwXzAwMDtcblxuaW50ZWdUZXN0KCdhbXBsaWZ5IGludGVncmF0aW9uJywgd2l0aFRvb2xDb250ZXh0KGFzeW5jIChjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHNoZWxsID0gU2hlbGxIZWxwZXIuZnJvbUNvbnRleHQoY29udGV4dCk7XG5cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vICBNYWtlIHN1cmUgdGhhdCBjcmVhdGUtYW1wbGlmeSBpbnN0YWxscyB0aGUgcmlnaHQgdmVyc2lvbnMgb2YgdGhlIENMSSBhbmQgZnJhbWV3b3JrXG4gIC8vXG5cbiAgLy8gSW5zdGFsbCBgY3JlYXRlLWFtcGxpZnlgIHdpdGhvdXQgcnVubmluZyBpdCwgdGhlbiBoYWNrIHRoZSBqc29uIGZpbGUgd2l0aCB0aGVcbiAgLy8gcGFja2FnZSB2ZXJzaW9ucyBpbiBpdCBiZWZvcmUgd2UgZXhlY3V0ZS5cbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAnaW5pdCcsICcteSddKTtcbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAnaW5zdGFsbCcsICctLXNhdmUtZGV2JywgJ2NyZWF0ZS1hbXBsaWZ5QGxhdGVzdCddKTtcbiAgLy8gVGhpcyB3aWxsIGNyZWF0ZSAncGFja2FnZS5qc29uJyBpbXBsaWNhdGluZyBhIGNlcnRhaW4gdmVyc2lvbiBvZiB0aGUgQ0RLXG4gIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ2NvbmZpZycsICdzZXQnLCAnc2F2ZS1leGFjdCcsICd0cnVlJ10pO1xuICBhd2FpdCBtdXRhdGVBbXBsaWZ5RGVwT25DZGsoY29udGV4dCwgY29udGV4dC5jbGkucmVxdWVzdGVkVmVyc2lvbigpLCBjb250ZXh0LmxpYnJhcnkucmVxdWVzdGVkVmVyc2lvbigpKTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gIFJ1biB0aGUgYG5wbSBjcmVhdGVgIHdvcmtmbG93XG4gIC8vXG5cbiAgLy8gSSB0ZXN0ZWQgdG8gY29uZmlybSB0aGF0IHRoaXMgd2lsbCB1c2UgdGhlIGxvY2FsbHkgaW5zdGFsbGVkIGBjcmVhdGUtYW1wbGlmeWBcbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAnY3JlYXRlJywgJy15JywgJ2FtcGxpZnknXSk7XG4gIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnB4JywgJ2FtcHgnLCAnY29uZmlndXJlJywgJ3RlbGVtZXRyeScsICdkaXNhYmxlJ10pO1xuXG4gIGNvbnN0IGF3c0NyZWRzID0gY29udGV4dC5hd3MuaWRlbnRpdHlFbnYoKTtcblxuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25weCcsICdhbXB4JywgJ3NhbmRib3gnLCAnLS1vbmNlJ10sIHtcbiAgICBtb2RFbnY6IHtcbiAgICAgIEFXU19SRUdJT046IGNvbnRleHQuYXdzLnJlZ2lvbixcbiAgICAgIC4uLmF3c0NyZWRzLFxuICAgIH0sXG4gIH0pO1xuICB0cnkge1xuXG4gICAgLy8gRnV0dXJlIGNvZGUgZ29lcyBoZXJlLCBwdXR0aW5nIHRoZSB0cnkvZmluYWxseSBoZXJlIGFscmVhZHkgc28gaXQgZG9lc24ndFxuICAgIC8vIGdldCBmb3Jnb3R0ZW4uXG5cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBzaGVsbC5zaGVsbChbJ25weCcsICdhbXB4JywgJ3NhbmRib3gnLCAnZGVsZXRlJywgJy0teWVzJ10sIHtcbiAgICAgIG1vZEVudjoge1xuICAgICAgICBBV1NfUkVHSU9OOiBjb250ZXh0LmF3cy5yZWdpb24sXG4gICAgICAgIC4uLmF3c0NyZWRzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufSksIFRJTUVPVVQpO1xuXG5hc3luYyBmdW5jdGlvbiBtdXRhdGVBbXBsaWZ5RGVwT25DZGsoY29udGV4dDogVGVtcG9yYXJ5RGlyZWN0b3J5Q29udGV4dCwgY2xpVmVyc2lvbjogc3RyaW5nLCBsaWJWZXJzaW9uOiBzdHJpbmcpIHtcbiAgLy8gZGVmYXVsdF9wYWNrYWdlcy5qc29uIGlzIHdoZXJlIGNyZWF0ZS1hbXBsaWZ5IHJlYWRzIHdoZW4gaW5zdGFsbGluZyBucG0gZGVwZW5kZW5jaWVzXG4gIGNvbnN0IGFtcGxpZnlEZXBGaWxlID0gcGF0aC5qb2luKGNvbnRleHQuaW50ZWdUZXN0RGlyLCAnbm9kZV9tb2R1bGVzJywgJ2NyZWF0ZS1hbXBsaWZ5JywgJ2xpYicsICdkZWZhdWx0X3BhY2thZ2VzLmpzb24nKTtcbiAgY29uc3QgYW1wbGlmeURlcEpzb246IHVua25vd24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGFtcGxpZnlEZXBGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pKTtcblxuICAvLyBCZSBleHRyYSBwYXJhbm9pZCBhYm91dCB0aGUgdHlwZXMgaGVyZSwgc2luY2Ugd2UgZG9uJ3QgZnVsbHkgY29udHJvbCB0aGVtXG4gIGFzc2VydElzT2JqZWN0KGFtcGxpZnlEZXBKc29uKTtcbiAgYXNzZXJ0SXNTdHJpbmdBcnJheShhbXBsaWZ5RGVwSnNvbi5kZWZhdWx0RGV2UGFja2FnZXMpO1xuXG4gIC8vIEFtcGxpZnkgaXMgcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kgb24gYXdzLWNkaywgc2luY2UgQW1wbGlmeSBpcyBub3cgdXNpbmcgdGhlIHRvb2xraXQtbGliXG4gIC8vIFRvIHByZXBhcmUgZm9yIHRoaXMgY2hhbmdlLCB3ZSBuZWVkIGFsbG93IGJvdGggc2l0dWF0aW9uczogYXdzLWNkayBiZWluZyBsaXN0ZWQgYW5kIG5vdCBiZWluZyBsaXN0ZWRcbiAgLy8gRml4IGlzIHRvIHNpbXBseSBhbGxvdyB0aGUgcmVwbGFjZSBvcGVyYXRpb24gdG8gYWxzbyBOT1QgcmVwbGFjZSB0aGUgdmVyc2lvblxuICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtYW1wbGlmeS9hbXBsaWZ5LWJhY2tlbmQvcHVsbC8yNjE0XG4gIHJlcGxhY2VQYWNrYWdlVmVyc2lvbkluKCdhd3MtY2RrJywgY2xpVmVyc2lvbiwgYW1wbGlmeURlcEpzb24uZGVmYXVsdERldlBhY2thZ2VzLCBmYWxzZSk7XG4gIHJlcGxhY2VQYWNrYWdlVmVyc2lvbkluKCdhd3MtY2RrLWxpYicsIGxpYlZlcnNpb24sIGFtcGxpZnlEZXBKc29uLmRlZmF1bHREZXZQYWNrYWdlcyk7XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKGFtcGxpZnlEZXBGaWxlLCBKU09OLnN0cmluZ2lmeShhbXBsaWZ5RGVwSnNvbiwgdW5kZWZpbmVkLCAyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICBjb25zdCBwYWNrYWdlSnNvbkZpbGUgPSBwYXRoLmpvaW4oY29udGV4dC5pbnRlZ1Rlc3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QgcGFja2FnZUpzb246IHVua25vd24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhY2thZ2VKc29uRmlsZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSk7XG5cbiAgYXNzZXJ0SXNPYmplY3QocGFja2FnZUpzb24pO1xuICBwYWNrYWdlSnNvbi5vdmVycmlkZXMgPSB7XG4gICAgJ2F3cy1jZGstbGliJzogbGliVmVyc2lvbixcbiAgfTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHBhY2thZ2VKc29uRmlsZSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMiksIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG59XG5cbi8qKlxuICogTXV0YWJseSB1cGRhdGUgdGhlIGdpdmVuIHN0cmluZyBhcnJheSwgcmVwbGFjaW5nIHRoZSB2ZXJzaW9uIG9mIHBhY2thZ2VzIHdpdGggdGhlIGdpdmVuIG5hbWVcbiAqXG4gKiBXZSBhc3N1bWUgdGhlIGxpc3Qgb2YgcGFja2FnZXMgaXMgYSBzdHJpbmcgYXJyYXkgb2YgdGhlIGZvcm1cbiAqXG4gKiBgYGBcbiAqIFtcInBhY2thZ2VAdmVyc2lvblwiLCBcInBhY2thZ2VAdmVyc2lvblwiLCAuLi5dXG4gKiBgYGBcbiAqXG4gKiBJdCdzIGEgZmFpbHVyZSBpZiB3ZSBkb24ndCBmaW5kIGFuIGVudHJ5IHRvIHVwZGF0ZSwgdW5sZXNzIHdlIGV4cGxpY2l0bHkgcGFzcyBhbiBvcHRpb24gdG8gc2F5IHRoYXQncyBva2F5LlxuICovXG5mdW5jdGlvbiByZXBsYWNlUGFja2FnZVZlcnNpb25JbihwYWNrTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHhzOiBzdHJpbmdbXSwgZmFpbElmTWlzc2luZyA9IHRydWUpIHtcbiAgbGV0IGRpZFVwZGF0ZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldLnN0YXJ0c1dpdGgoYCR7cGFja05hbWV9QGApKSB7XG4gICAgICB4c1tpXSA9IGAke3BhY2tOYW1lfUAke3ZlcnNpb259YDtcbiAgICAgIGRpZFVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGZhaWxJZk1pc3NpbmcgJiYgIWRpZFVwZGF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBmaW5kIGEgcGFja2FnZSB2ZXJzaW9uIHRvIHVwZGF0ZSBmb3IgJHtwYWNrTmFtZX0gaW4gJHtKU09OLnN0cmluZ2lmeSh4cyl9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNPYmplY3QoeHM6IHVua25vd24pOiBhc3NlcnRzIHhzIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHR5cGVvZiB4cyAhPT0gJ29iamVjdCcgfHwgeHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9iamVjdCwgZ290ICR7SlNPTi5zdHJpbmdpZnkoeHMpfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzU3RyaW5nQXJyYXkoeHM6IHVua25vd24pOiBhc3NlcnRzIHhzIGlzIHN0cmluZ1tdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHhzKSB8fCB4cy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIHhzWzBdICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbGlzdCBvZiBzdHJpbmdzLCBnb3QgJHtKU09OLnN0cmluZ2lmeSh4cyl9YCk7XG4gIH1cbn1cbiJdfQ==