@aws-cdk-testing/cli-integ 3.2.2 → 3.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -108,7 +108,7 @@
108
108
  "publishConfig": {
109
109
  "access": "public"
110
110
  },
111
- "version": "3.2.2",
111
+ "version": "3.2.4",
112
112
  "types": "lib/index.d.ts",
113
113
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
114
114
  }
@@ -7,11 +7,22 @@ const lib_1 = require("../../lib");
7
7
  const TIMEOUT = 1800000;
8
8
  (0, lib_1.integTest)('amplify integration', (0, with_tool_context_1.withToolContext)(async (context) => {
9
9
  const shell = lib_1.ShellHelper.fromContext(context);
10
- await shell.shell(['npm', 'create', '-y', 'amplify@latest']);
11
- await shell.shell(['npx', 'ampx', 'configure', 'telemetry', 'disable']);
10
+ ////////////////////////////////////////////////////////////////////////
11
+ // Make sure that create-amplify installs the right versions of the CLI and framework
12
+ //
13
+ // Install `create-amplify` without running it, then hack the json file with the
14
+ // package versions in it before we execute.
15
+ await shell.shell(['npm', 'init', '-y']);
16
+ await shell.shell(['npm', 'install', '--save-dev', 'create-amplify@latest']);
12
17
  // This will create 'package.json' implicating a certain version of the CDK
13
- await updateCdkDependency(context, context.packages.requestedCliVersion(), context.packages.requestedFrameworkVersion());
14
- await shell.shell(['npm', 'install']);
18
+ await shell.shell(['npm', 'config', 'set', 'save-exact', 'true']);
19
+ await mutateAmplifyDepOnCdk(context, context.packages.requestedCliVersion(), context.packages.requestedFrameworkVersion());
20
+ ////////////////////////////////////////////////////////////////////////
21
+ // Run the `npm create` workflow
22
+ //
23
+ // I tested to confirm that this will use the locally installed `create-amplify`
24
+ await shell.shell(['npm', 'create', '-y', 'amplify']);
25
+ await shell.shell(['npx', 'ampx', 'configure', 'telemetry', 'disable']);
15
26
  await shell.shell(['npx', 'ampx', 'sandbox', '--once'], {
16
27
  modEnv: {
17
28
  AWS_REGION: context.aws.region,
@@ -29,11 +40,55 @@ const TIMEOUT = 1800000;
29
40
  });
30
41
  }
31
42
  }), TIMEOUT);
32
- async function updateCdkDependency(context, cliVersion, libVersion) {
33
- const filename = path.join(context.integTestDir, 'package.json');
34
- const pj = JSON.parse(await fs_1.promises.readFile(filename, { encoding: 'utf-8' }));
35
- pj.devDependencies['aws-cdk'] = cliVersion;
36
- pj.devDependencies['aws-cdk-lib'] = libVersion;
37
- await fs_1.promises.writeFile(filename, JSON.stringify(pj, undefined, 2), { encoding: 'utf-8' });
43
+ async function mutateAmplifyDepOnCdk(context, cliVersion, libVersion) {
44
+ // default_packages.json is where create-amplify reads when installing npm dependencies
45
+ const amplifyDepFile = path.join(context.integTestDir, 'node_modules', 'create-amplify', 'lib', 'default_packages.json');
46
+ const amplifyDepJson = JSON.parse(await fs_1.promises.readFile(amplifyDepFile, { encoding: 'utf-8' }));
47
+ // Be extra paranoid about the types here, since we don't fully control them
48
+ assertIsObject(amplifyDepJson);
49
+ assertIsStringArray(amplifyDepJson.defaultDevPackages);
50
+ replacePackageVersionIn('aws-cdk', cliVersion, amplifyDepJson.defaultDevPackages);
51
+ replacePackageVersionIn('aws-cdk-lib', libVersion, amplifyDepJson.defaultDevPackages);
52
+ await fs_1.promises.writeFile(amplifyDepFile, JSON.stringify(amplifyDepJson, undefined, 2), { encoding: 'utf-8' });
53
+ const packageJsonFile = path.join(context.integTestDir, 'package.json');
54
+ const packageJson = JSON.parse(await fs_1.promises.readFile(packageJsonFile, { encoding: 'utf-8' }));
55
+ assertIsObject(packageJson);
56
+ packageJson.overrides = {
57
+ "aws-cdk-lib": libVersion,
58
+ };
59
+ await fs_1.promises.writeFile(packageJsonFile, JSON.stringify(packageJson, undefined, 2), { encoding: 'utf-8' });
60
+ }
61
+ /**
62
+ * Mutably update the given string array, replacing the version of packages with the given name
63
+ *
64
+ * We assume the list of packages is a string array of the form
65
+ *
66
+ * ```
67
+ * ["package@version", "package@version", ...]
68
+ * ```
69
+ *
70
+ * It's a failure if we don't find an entry to update.
71
+ */
72
+ function replacePackageVersionIn(packName, version, xs) {
73
+ let didUpdate = false;
74
+ for (let i = 0; i < xs.length; i++) {
75
+ if (xs[i].startsWith(`${packName}@`)) {
76
+ xs[i] = `${packName}@${version}`;
77
+ didUpdate = true;
78
+ }
79
+ }
80
+ if (!didUpdate) {
81
+ throw new Error(`Did not find a package version to update for ${packName} in ${JSON.stringify(xs)}`);
82
+ }
83
+ }
84
+ function assertIsObject(xs) {
85
+ if (typeof xs !== 'object' || xs === null) {
86
+ throw new Error(`Expected object, got ${JSON.stringify(xs)}`);
87
+ }
88
+ }
89
+ function assertIsStringArray(xs) {
90
+ if (!Array.isArray(xs) || xs.length === 0 || typeof xs[0] !== 'string') {
91
+ throw new Error(`Expected list of strings, got ${JSON.stringify(xs)}`);
92
+ }
38
93
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wbGlmeS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhbXBsaWZ5LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJCQUFvQztBQUNwQyw2QkFBNkI7QUFDN0IsMkRBQXNEO0FBQ3RELG1DQUE4RTtBQUU5RSxNQUFNLE9BQU8sR0FBRyxPQUFRLENBQUM7QUFFekIsSUFBQSxlQUFTLEVBQUMscUJBQXFCLEVBQUUsSUFBQSxtQ0FBZSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNqRSxNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFeEUsMkVBQTJFO0lBQzNFLE1BQU0sbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQztJQUN6SCxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUV0QyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtRQUN0RCxNQUFNLEVBQUU7WUFDTixVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1NBQy9CO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBRUgsNEVBQTRFO1FBQzVFLGlCQUFpQjtJQUVuQixDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUMvRCxNQUFNLEVBQUU7Z0JBQ04sVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTthQUMvQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUViLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxPQUFrQyxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7SUFDM0csTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxhQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDM0MsRUFBRSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDL0MsTUFBTSxhQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUN4RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgd2l0aFRvb2xDb250ZXh0IH0gZnJvbSAnLi93aXRoLXRvb2wtY29udGV4dCc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIFNoZWxsSGVscGVyLCBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0IH0gZnJvbSAnLi4vLi4vbGliJztcblxuY29uc3QgVElNRU9VVCA9IDE4MDBfMDAwO1xuXG5pbnRlZ1Rlc3QoJ2FtcGxpZnkgaW50ZWdyYXRpb24nLCB3aXRoVG9vbENvbnRleHQoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgY29uc3Qgc2hlbGwgPSBTaGVsbEhlbHBlci5mcm9tQ29udGV4dChjb250ZXh0KTtcblxuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdjcmVhdGUnLCAnLXknLCAnYW1wbGlmeUBsYXRlc3QnXSk7XG4gIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnB4JywgJ2FtcHgnLCAnY29uZmlndXJlJywgJ3RlbGVtZXRyeScsICdkaXNhYmxlJ10pO1xuXG4gIC8vIFRoaXMgd2lsbCBjcmVhdGUgJ3BhY2thZ2UuanNvbicgaW1wbGljYXRpbmcgYSBjZXJ0YWluIHZlcnNpb24gb2YgdGhlIENES1xuICBhd2FpdCB1cGRhdGVDZGtEZXBlbmRlbmN5KGNvbnRleHQsIGNvbnRleHQucGFja2FnZXMucmVxdWVzdGVkQ2xpVmVyc2lvbigpLCBjb250ZXh0LnBhY2thZ2VzLnJlcXVlc3RlZEZyYW1ld29ya1ZlcnNpb24oKSk7XG4gIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnBtJywgJ2luc3RhbGwnXSk7XG5cbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducHgnLCAnYW1weCcsICdzYW5kYm94JywgJy0tb25jZSddLCB7XG4gICAgbW9kRW52OiB7XG4gICAgICBBV1NfUkVHSU9OOiBjb250ZXh0LmF3cy5yZWdpb24sXG4gICAgfSxcbiAgfSk7XG4gIHRyeSB7XG5cbiAgICAvLyBGdXR1cmUgY29kZSBnb2VzIGhlcmUsIHB1dHRpbmcgdGhlIHRyeS9maW5hbGx5IGhlcmUgYWxyZWFkeSBzbyBpdCBkb2Vzbid0XG4gICAgLy8gZ2V0IGZvcmdvdHRlbi5cblxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnB4JywgJ2FtcHgnLCAnc2FuZGJveCcsICdkZWxldGUnLCAnLS15ZXMnXSwge1xuICAgICAgbW9kRW52OiB7XG4gICAgICAgIEFXU19SRUdJT046IGNvbnRleHQuYXdzLnJlZ2lvbixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn0pLCBUSU1FT1VUKTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2RrRGVwZW5kZW5jeShjb250ZXh0OiBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0LCBjbGlWZXJzaW9uOiBzdHJpbmcsIGxpYlZlcnNpb246IHN0cmluZykge1xuICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihjb250ZXh0LmludGVnVGVzdERpciwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBwaiA9IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUoZmlsZW5hbWUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpO1xuICBwai5kZXZEZXBlbmRlbmNpZXNbJ2F3cy1jZGsnXSA9IGNsaVZlcnNpb247XG4gIHBqLmRldkRlcGVuZGVuY2llc1snYXdzLWNkay1saWInXSA9IGxpYlZlcnNpb247XG4gIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlbmFtZSwgSlNPTi5zdHJpbmdpZnkocGosIHVuZGVmaW5lZCwgMiksIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG59XG4iXX0=
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wbGlmeS5pbnRlZ3Rlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhbXBsaWZ5LmludGVndGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDJCQUFvQztBQUNwQyw2QkFBNkI7QUFDN0IsMkRBQXNEO0FBQ3RELG1DQUE4RTtBQUU5RSxNQUFNLE9BQU8sR0FBRyxPQUFRLENBQUM7QUFFekIsSUFBQSxlQUFTLEVBQUMscUJBQXFCLEVBQUUsSUFBQSxtQ0FBZSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNqRSxNQUFNLEtBQUssR0FBRyxpQkFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQyx3RUFBd0U7SUFDeEUsc0ZBQXNGO0lBQ3RGLEVBQUU7SUFFRixnRkFBZ0Y7SUFDaEYsNENBQTRDO0lBQzVDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7SUFDN0UsMkVBQTJFO0lBQzNFLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQztJQUUzSCx3RUFBd0U7SUFDeEUsaUNBQWlDO0lBQ2pDLEVBQUU7SUFFRixnRkFBZ0Y7SUFDaEYsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxD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QUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDakMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELFFBQVEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEVBQVc7SUFDakMsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxFQUFXO0lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgd2l0aFRvb2xDb250ZXh0IH0gZnJvbSAnLi93aXRoLXRvb2wtY29udGV4dCc7XG5pbXBvcnQgeyBpbnRlZ1Rlc3QsIFNoZWxsSGVscGVyLCBUZW1wb3JhcnlEaXJlY3RvcnlDb250ZXh0IH0gZnJvbSAnLi4vLi4vbGliJztcblxuY29uc3QgVElNRU9VVCA9IDE4MDBfMDAwO1xuXG5pbnRlZ1Rlc3QoJ2FtcGxpZnkgaW50ZWdyYXRpb24nLCB3aXRoVG9vbENvbnRleHQoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgY29uc3Qgc2hlbGwgPSBTaGVsbEhlbHBlci5mcm9tQ29udGV4dChjb250ZXh0KTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gIE1ha2Ugc3VyZSB0aGF0IGNyZWF0ZS1hbXBsaWZ5IGluc3RhbGxzIHRoZSByaWdodCB2ZXJzaW9ucyBvZiB0aGUgQ0xJIGFuZCBmcmFtZXdvcmtcbiAgLy9cblxuICAvLyBJbnN0YWxsIGBjcmVhdGUtYW1wbGlmeWAgd2l0aG91dCBydW5uaW5nIGl0LCB0aGVuIGhhY2sgdGhlIGpzb24gZmlsZSB3aXRoIHRoZVxuICAvLyBwYWNrYWdlIHZlcnNpb25zIGluIGl0IGJlZm9yZSB3ZSBleGVjdXRlLlxuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdpbml0JywgJy15J10pO1xuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdpbnN0YWxsJywgJy0tc2F2ZS1kZXYnLCAnY3JlYXRlLWFtcGxpZnlAbGF0ZXN0J10pO1xuICAvLyBUaGlzIHdpbGwgY3JlYXRlICdwYWNrYWdlLmpzb24nIGltcGxpY2F0aW5nIGEgY2VydGFpbiB2ZXJzaW9uIG9mIHRoZSBDREtcbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducG0nLCAnY29uZmlnJywgJ3NldCcsICdzYXZlLWV4YWN0JywgJ3RydWUnXSk7XG4gIGF3YWl0IG11dGF0ZUFtcGxpZnlEZXBPbkNkayhjb250ZXh0LCBjb250ZXh0LnBhY2thZ2VzLnJlcXVlc3RlZENsaVZlcnNpb24oKSwgY29udGV4dC5wYWNrYWdlcy5yZXF1ZXN0ZWRGcmFtZXdvcmtWZXJzaW9uKCkpO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyAgUnVuIHRoZSBgbnBtIGNyZWF0ZWAgd29ya2Zsb3dcbiAgLy9cblxuICAvLyBJIHRlc3RlZCB0byBjb25maXJtIHRoYXQgdGhpcyB3aWxsIHVzZSB0aGUgbG9jYWxseSBpbnN0YWxsZWQgYGNyZWF0ZS1hbXBsaWZ5YFxuICBhd2FpdCBzaGVsbC5zaGVsbChbJ25wbScsICdjcmVhdGUnLCAnLXknLCAnYW1wbGlmeSddKTtcbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducHgnLCAnYW1weCcsICdjb25maWd1cmUnLCAndGVsZW1ldHJ5JywgJ2Rpc2FibGUnXSk7XG5cbiAgYXdhaXQgc2hlbGwuc2hlbGwoWyducHgnLCAnYW1weCcsICdzYW5kYm94JywgJy0tb25jZSddLCB7XG4gICAgbW9kRW52OiB7XG4gICAgICBBV1NfUkVHSU9OOiBjb250ZXh0LmF3cy5yZWdpb24sXG4gICAgfSxcbiAgfSk7XG4gIHRyeSB7XG5cbiAgICAvLyBGdXR1cmUgY29kZSBnb2VzIGhlcmUsIHB1dHRpbmcgdGhlIHRyeS9maW5hbGx5IGhlcmUgYWxyZWFkeSBzbyBpdCBkb2Vzbid0XG4gICAgLy8gZ2V0IGZvcmdvdHRlbi5cblxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHNoZWxsLnNoZWxsKFsnbnB4JywgJ2FtcHgnLCAnc2FuZGJveCcsICdkZWxldGUnLCAnLS15ZXMnXSwge1xuICAgICAgbW9kRW52OiB7XG4gICAgICAgIEFXU19SRUdJT046IGNvbnRleHQuYXdzLnJlZ2lvbixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn0pLCBUSU1FT1VUKTtcblxuYXN5bmMgZnVuY3Rpb24gbXV0YXRlQW1wbGlmeURlcE9uQ2RrKGNvbnRleHQ6IFRlbXBvcmFyeURpcmVjdG9yeUNvbnRleHQsIGNsaVZlcnNpb246IHN0cmluZywgbGliVmVyc2lvbjogc3RyaW5nKSB7XG4gIC8vIGRlZmF1bHRfcGFja2FnZXMuanNvbiBpcyB3aGVyZSBjcmVhdGUtYW1wbGlmeSByZWFkcyB3aGVuIGluc3RhbGxpbmcgbnBtIGRlcGVuZGVuY2llc1xuICBjb25zdCBhbXBsaWZ5RGVwRmlsZSA9IHBhdGguam9pbihjb250ZXh0LmludGVnVGVzdERpciwgJ25vZGVfbW9kdWxlcycsICdjcmVhdGUtYW1wbGlmeScsICdsaWInLCAnZGVmYXVsdF9wYWNrYWdlcy5qc29uJyk7XG4gIGNvbnN0IGFtcGxpZnlEZXBKc29uOiB1bmtub3duID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShhbXBsaWZ5RGVwRmlsZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSk7XG5cbiAgLy8gQmUgZXh0cmEgcGFyYW5vaWQgYWJvdXQgdGhlIHR5cGVzIGhlcmUsIHNpbmNlIHdlIGRvbid0IGZ1bGx5IGNvbnRyb2wgdGhlbVxuICBhc3NlcnRJc09iamVjdChhbXBsaWZ5RGVwSnNvbik7XG4gIGFzc2VydElzU3RyaW5nQXJyYXkoYW1wbGlmeURlcEpzb24uZGVmYXVsdERldlBhY2thZ2VzKTtcblxuICByZXBsYWNlUGFja2FnZVZlcnNpb25JbignYXdzLWNkaycsIGNsaVZlcnNpb24sIGFtcGxpZnlEZXBKc29uLmRlZmF1bHREZXZQYWNrYWdlcyk7XG4gIHJlcGxhY2VQYWNrYWdlVmVyc2lvbkluKCdhd3MtY2RrLWxpYicsIGxpYlZlcnNpb24sIGFtcGxpZnlEZXBKc29uLmRlZmF1bHREZXZQYWNrYWdlcyk7XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKGFtcGxpZnlEZXBGaWxlLCBKU09OLnN0cmluZ2lmeShhbXBsaWZ5RGVwSnNvbiwgdW5kZWZpbmVkLCAyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICBjb25zdCBwYWNrYWdlSnNvbkZpbGUgPSBwYXRoLmpvaW4oY29udGV4dC5pbnRlZ1Rlc3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QgcGFja2FnZUpzb246IHVua25vd24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhY2thZ2VKc29uRmlsZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSk7XG5cbiAgYXNzZXJ0SXNPYmplY3QocGFja2FnZUpzb24pO1xuICBwYWNrYWdlSnNvbi5vdmVycmlkZXMgPSB7XG4gICAgXCJhd3MtY2RrLWxpYlwiOiBsaWJWZXJzaW9uLFxuICB9O1xuICBhd2FpdCBmcy53cml0ZUZpbGUocGFja2FnZUpzb25GaWxlLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxufVxuXG4vKipcbiAqIE11dGFibHkgdXBkYXRlIHRoZSBnaXZlbiBzdHJpbmcgYXJyYXksIHJlcGxhY2luZyB0aGUgdmVyc2lvbiBvZiBwYWNrYWdlcyB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gKlxuICogV2UgYXNzdW1lIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGlzIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBmb3JtXG4gKlxuICogYGBgXG4gKiBbXCJwYWNrYWdlQHZlcnNpb25cIiwgXCJwYWNrYWdlQHZlcnNpb25cIiwgLi4uXVxuICogYGBgXG4gKlxuICogSXQncyBhIGZhaWx1cmUgaWYgd2UgZG9uJ3QgZmluZCBhbiBlbnRyeSB0byB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VQYWNrYWdlVmVyc2lvbkluKHBhY2tOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgeHM6IHN0cmluZ1tdKSB7XG4gIGxldCBkaWRVcGRhdGUgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh4c1tpXS5zdGFydHNXaXRoKGAke3BhY2tOYW1lfUBgKSkge1xuICAgICAgeHNbaV0gPSBgJHtwYWNrTmFtZX1AJHt2ZXJzaW9ufWA7XG4gICAgICBkaWRVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkVXBkYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGZpbmQgYSBwYWNrYWdlIHZlcnNpb24gdG8gdXBkYXRlIGZvciAke3BhY2tOYW1lfSBpbiAke0pTT04uc3RyaW5naWZ5KHhzKX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRJc09iamVjdCh4czogdW5rbm93bik6IGFzc2VydHMgeHMgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodHlwZW9mIHhzICE9PSAnb2JqZWN0JyB8fCB4cyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2JqZWN0LCBnb3QgJHtKU09OLnN0cmluZ2lmeSh4cyl9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNTdHJpbmdBcnJheSh4czogdW5rbm93bik6IGFzc2VydHMgeHMgaXMgc3RyaW5nW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoeHMpIHx8IHhzLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgeHNbMF0gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsaXN0IG9mIHN0cmluZ3MsIGdvdCAke0pTT04uc3RyaW5naWZ5KHhzKX1gKTtcbiAgfVxufVxuIl19
@@ -8,12 +8,25 @@ const TIMEOUT = 1800_000;
8
8
  integTest('amplify integration', withToolContext(async (context) => {
9
9
  const shell = ShellHelper.fromContext(context);
10
10
 
11
- await shell.shell(['npm', 'create', '-y', 'amplify@latest']);
12
- await shell.shell(['npx', 'ampx', 'configure', 'telemetry', 'disable']);
11
+ ////////////////////////////////////////////////////////////////////////
12
+ // Make sure that create-amplify installs the right versions of the CLI and framework
13
+ //
13
14
 
15
+ // Install `create-amplify` without running it, then hack the json file with the
16
+ // package versions in it before we execute.
17
+ await shell.shell(['npm', 'init', '-y']);
18
+ await shell.shell(['npm', 'install', '--save-dev', 'create-amplify@latest']);
14
19
  // This will create 'package.json' implicating a certain version of the CDK
15
- await updateCdkDependency(context, context.packages.requestedCliVersion(), context.packages.requestedFrameworkVersion());
16
- await shell.shell(['npm', 'install']);
20
+ await shell.shell(['npm', 'config', 'set', 'save-exact', 'true']);
21
+ await mutateAmplifyDepOnCdk(context, context.packages.requestedCliVersion(), context.packages.requestedFrameworkVersion());
22
+
23
+ ////////////////////////////////////////////////////////////////////////
24
+ // Run the `npm create` workflow
25
+ //
26
+
27
+ // I tested to confirm that this will use the locally installed `create-amplify`
28
+ await shell.shell(['npm', 'create', '-y', 'amplify']);
29
+ await shell.shell(['npx', 'ampx', 'configure', 'telemetry', 'disable']);
17
30
 
18
31
  await shell.shell(['npx', 'ampx', 'sandbox', '--once'], {
19
32
  modEnv: {
@@ -34,10 +47,63 @@ integTest('amplify integration', withToolContext(async (context) => {
34
47
  }
35
48
  }), TIMEOUT);
36
49
 
37
- async function updateCdkDependency(context: TemporaryDirectoryContext, cliVersion: string, libVersion: string) {
38
- const filename = path.join(context.integTestDir, 'package.json');
39
- const pj = JSON.parse(await fs.readFile(filename, { encoding: 'utf-8' }));
40
- pj.devDependencies['aws-cdk'] = cliVersion;
41
- pj.devDependencies['aws-cdk-lib'] = libVersion;
42
- await fs.writeFile(filename, JSON.stringify(pj, undefined, 2), { encoding: 'utf-8' });
50
+ async function mutateAmplifyDepOnCdk(context: TemporaryDirectoryContext, cliVersion: string, libVersion: string) {
51
+ // default_packages.json is where create-amplify reads when installing npm dependencies
52
+ const amplifyDepFile = path.join(context.integTestDir, 'node_modules', 'create-amplify', 'lib', 'default_packages.json');
53
+ const amplifyDepJson: unknown = JSON.parse(await fs.readFile(amplifyDepFile, { encoding: 'utf-8' }));
54
+
55
+ // Be extra paranoid about the types here, since we don't fully control them
56
+ assertIsObject(amplifyDepJson);
57
+ assertIsStringArray(amplifyDepJson.defaultDevPackages);
58
+
59
+ replacePackageVersionIn('aws-cdk', cliVersion, amplifyDepJson.defaultDevPackages);
60
+ replacePackageVersionIn('aws-cdk-lib', libVersion, amplifyDepJson.defaultDevPackages);
61
+
62
+ await fs.writeFile(amplifyDepFile, JSON.stringify(amplifyDepJson, undefined, 2), { encoding: 'utf-8' });
63
+
64
+ const packageJsonFile = path.join(context.integTestDir, 'package.json');
65
+ const packageJson: unknown = JSON.parse(await fs.readFile(packageJsonFile, { encoding: 'utf-8' }));
66
+
67
+ assertIsObject(packageJson);
68
+ packageJson.overrides = {
69
+ "aws-cdk-lib": libVersion,
70
+ };
71
+ await fs.writeFile(packageJsonFile, JSON.stringify(packageJson, undefined, 2), { encoding: 'utf-8' })
72
+ }
73
+
74
+ /**
75
+ * Mutably update the given string array, replacing the version of packages with the given name
76
+ *
77
+ * We assume the list of packages is a string array of the form
78
+ *
79
+ * ```
80
+ * ["package@version", "package@version", ...]
81
+ * ```
82
+ *
83
+ * It's a failure if we don't find an entry to update.
84
+ */
85
+ function replacePackageVersionIn(packName: string, version: string, xs: string[]) {
86
+ let didUpdate = false;
87
+ for (let i = 0; i < xs.length; i++) {
88
+ if (xs[i].startsWith(`${packName}@`)) {
89
+ xs[i] = `${packName}@${version}`;
90
+ didUpdate = true;
91
+ }
92
+ }
93
+
94
+ if (!didUpdate) {
95
+ throw new Error(`Did not find a package version to update for ${packName} in ${JSON.stringify(xs)}`);
96
+ }
97
+ }
98
+
99
+ function assertIsObject(xs: unknown): asserts xs is Record<string, unknown> {
100
+ if (typeof xs !== 'object' || xs === null) {
101
+ throw new Error(`Expected object, got ${JSON.stringify(xs)}`);
102
+ }
103
+ }
104
+
105
+ function assertIsStringArray(xs: unknown): asserts xs is string[] {
106
+ if (!Array.isArray(xs) || xs.length === 0 || typeof xs[0] !== 'string') {
107
+ throw new Error(`Expected list of strings, got ${JSON.stringify(xs)}`);
108
+ }
43
109
  }