context.test.js
  1  "use strict";
  2  Object.defineProperty(exports, "__esModule", { value: true });
  3  const os = require("os");
  4  const path = require("path");
  5  const fs = require("fs-extra");
  6  const settings_1 = require("../lib/settings");
  7  const state = {};
  8  beforeAll(async (done) => {
  9      state.previousWorkingDir = process.cwd();
 10      state.tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'aws-cdk-test'));
 11      // eslint-disable-next-line no-console
 12      console.log('Temporary working directory:', state.tempDir);
 13      process.chdir(state.tempDir);
 14      done();
 15  });
 16  afterAll(async (done) => {
 17      // eslint-disable-next-line no-console
 18      console.log('Switching back to', state.previousWorkingDir, 'cleaning up', state.tempDir);
 19      process.chdir(state.previousWorkingDir);
 20      await fs.remove(state.tempDir);
 21      done();
 22  });
 23  test('load context from both files if available', async () => {
 24      // GIVEN
 25      await fs.writeJSON('cdk.context.json', { foo: 'bar' });
 26      await fs.writeJSON('cdk.json', { context: { boo: 'far' } });
 27      // WHEN
 28      const config = await new settings_1.Configuration({ readUserContext: false }).load();
 29      // THEN
 30      expect(config.context.get('foo')).toBe('bar');
 31      expect(config.context.get('boo')).toBe('far');
 32  });
 33  test('deleted context disappears from new file', async () => {
 34      // GIVEN
 35      await fs.writeJSON('cdk.context.json', { foo: 'bar' });
 36      await fs.writeJSON('cdk.json', { context: { foo: 'bar' } });
 37      const config = await new settings_1.Configuration({ readUserContext: false }).load();
 38      // WHEN
 39      config.context.unset('foo');
 40      await config.saveContext();
 41      // THEN
 42      expect(await fs.readJSON('cdk.context.json')).toEqual({});
 43      expect(await fs.readJSON('cdk.json')).toEqual({ context: { foo: 'bar' } });
 44  });
 45  test('clear deletes from new file', async () => {
 46      // GIVEN
 47      await fs.writeJSON('cdk.context.json', { foo: 'bar' });
 48      await fs.writeJSON('cdk.json', { context: { boo: 'far' } });
 49      const config = await new settings_1.Configuration({ readUserContext: false }).load();
 50      // WHEN
 51      config.context.clear();
 52      await config.saveContext();
 53      // THEN
 54      expect(await fs.readJSON('cdk.context.json')).toEqual({});
 55      expect(await fs.readJSON('cdk.json')).toEqual({ context: { boo: 'far' } });
 56  });
 57  test('context is preserved in the location from which it is read', async () => {
 58      // GIVEN
 59      await fs.writeJSON('cdk.json', { context: { 'boo:boo': 'far' } });
 60      const config = await new settings_1.Configuration({ readUserContext: false }).load();
 61      // WHEN
 62      expect(config.context.all).toEqual({ 'boo:boo': 'far' });
 63      await config.saveContext();
 64      // THEN
 65      expect(await fs.readJSON('cdk.context.json')).toEqual({});
 66      expect(await fs.readJSON('cdk.json')).toEqual({ context: { 'boo:boo': 'far' } });
 67  });
 68  test('surive no context in old file', async () => {
 69      // GIVEN
 70      await fs.writeJSON('cdk.json', {});
 71      await fs.writeJSON('cdk.context.json', { boo: 'far' });
 72      const config = await new settings_1.Configuration({ readUserContext: false }).load();
 73      // WHEN
 74      expect(config.context.all).toEqual({ boo: 'far' });
 75      await config.saveContext();
 76      // THEN
 77      expect(await fs.readJSON('cdk.context.json')).toEqual({ boo: 'far' });
 78  });
 79  test('command line context is merged with stored context', async () => {
 80      // GIVEN
 81      await fs.writeJSON('cdk.context.json', { boo: 'far' });
 82      const config = await new settings_1.Configuration({
 83          readUserContext: false,
 84          commandLineArguments: {
 85              context: ['foo=bar'],
 86              _: ['command'],
 87          },
 88      }).load();
 89      // WHEN
 90      expect(config.context.all).toEqual({ foo: 'bar', boo: 'far' });
 91  });
 92  test('can save and load', async () => {
 93      // GIVEN
 94      const config1 = await new settings_1.Configuration({ readUserContext: false }).load();
 95      config1.context.set('some_key', 'some_value');
 96      await config1.saveContext();
 97      expect(config1.context.get('some_key')).toEqual('some_value');
 98      // WHEN
 99      const config2 = await new settings_1.Configuration({ readUserContext: false }).load();
100      // THEN
101      expect(config2.context.get('some_key')).toEqual('some_value');
102  });
103  test('transient values arent saved to disk', async () => {
104      // GIVEN
105      const config1 = await new settings_1.Configuration({ readUserContext: false }).load();
106      config1.context.set('some_key', { [settings_1.TRANSIENT_CONTEXT_KEY]: true, value: 'some_value' });
107      await config1.saveContext();
108      expect(config1.context.get('some_key').value).toEqual('some_value');
109      // WHEN
110      const config2 = await new settings_1.Configuration({ readUserContext: false }).load();
111      // THEN
112      expect(config2.context.get('some_key')).toEqual(undefined);
113  });
114  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29udGV4dC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsOENBQXVFO0FBRXZFLE1BQU0sS0FBSyxHQUdQLEVBQUUsQ0FBQztBQUVQLFNBQVMsQ0FBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7SUFDckIsS0FBSyxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixJQUFJLEVBQUUsQ0FBQztBQUNULENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtJQUNwQixzQ0FBc0M7SUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBbUIsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBUSxDQUFDLENBQUM7SUFFaEMsSUFBSSxFQUFFLENBQUM7QUFDVCxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElB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QUFFLENBQUM7SUFFM0UsT0FBTztJQUNQLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM3RCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uLCBUUkFOU0lFTlRfQ09OVEVYVF9LRVkgfSBmcm9tICcuLi9saWIvc2V0dGluZ3MnO1xuXG5jb25zdCBzdGF0ZToge1xuICBwcmV2aW91c1dvcmtpbmdEaXI/OiBzdHJpbmc7XG4gIHRlbXBEaXI/OiBzdHJpbmc7XG59ID0ge307XG5cbmJlZm9yZUFsbChhc3luYyBkb25lID0+IHtcbiAgc3RhdGUucHJldmlvdXNXb3JraW5nRGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgc3RhdGUudGVtcERpciA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnYXdzLWNkay10ZXN0JykpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmxvZygnVGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5OicsIHN0YXRlLnRlbXBEaXIpO1xuICBwcm9jZXNzLmNoZGlyKHN0YXRlLnRlbXBEaXIpO1xuICBkb25lKCk7XG59KTtcblxuYWZ0ZXJBbGwoYXN5bmMgZG9uZSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKCdTd2l0Y2hpbmcgYmFjayB0bycsIHN0YXRlLnByZXZpb3VzV29ya2luZ0RpciwgJ2NsZWFuaW5nIHVwJywgc3RhdGUudGVtcERpcik7XG4gIHByb2Nlc3MuY2hkaXIoc3RhdGUucHJldmlvdXNXb3JraW5nRGlyISk7XG4gIGF3YWl0IGZzLnJlbW92ZShzdGF0ZS50ZW1wRGlyISk7XG5cbiAgZG9uZSgpO1xufSk7XG5cbnRlc3QoJ2xvYWQgY29udGV4dCBmcm9tIGJvdGggZmlsZXMgaWYgYXZhaWxhYmxlJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBhd2FpdCBmcy53cml0ZUpTT04oJ2Nkay5jb250ZXh0Lmpzb24nLCB7IGZvbzogJ2JhcicgfSk7XG4gIGF3YWl0IGZzLndyaXRlSlNPTignY2RrLmpzb24nLCB7IGNvbnRleHQ6IHsgYm9vOiAnZmFyJyB9IH0pO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbmV3IENvbmZpZ3VyYXRpb24oeyByZWFkVXNlckNvbnRleHQ6IGZhbHNlIH0pLmxvYWQoKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChjb25maWcuY29udGV4dC5nZXQoJ2ZvbycpKS50b0JlKCdiYXInKTtcbiAgZXhwZWN0KGNvbmZpZy5jb250ZXh0LmdldCgnYm9vJykpLnRvQmUoJ2ZhcicpO1xufSk7XG5cbnRlc3QoJ2RlbGV0ZWQgY29udGV4dCBkaXNhcHBlYXJzIGZyb20gbmV3IGZpbGUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGF3YWl0IGZzLndyaXRlSlNPTignY2RrLmNvbnRleHQuanNvbicsIHsgZm9vOiAnYmFyJyB9KTtcbiAgYXdhaXQgZnMud3JpdGVKU09OKCdjZGsuanNvbicsIHsgY29udGV4dDogeyBmb286ICdiYXInIH0gfSk7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG5cbiAgLy8gV0hFTlxuICBjb25maWcuY29udGV4dC51bnNldCgnZm9vJyk7XG4gIGF3YWl0IGNvbmZpZy5zYXZlQ29udGV4dCgpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGF3YWl0IGZzLnJlYWRKU09OKCdjZGsuY29udGV4dC5qc29uJykpLnRvRXF1YWwoe30pO1xuICBleHBlY3QoYXdhaXQgZnMucmVhZEpTT04oJ2Nkay5qc29uJykpLnRvRXF1YWwoeyBjb250ZXh0OiB7IGZvbzogJ2JhcicgfSB9KTtcbn0pO1xuXG50ZXN0KCdjbGVhciBkZWxldGVzIGZyb20gbmV3IGZpbGUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGF3YWl0IGZzLndyaXRlSlNPTignY2RrLmNvbnRleHQuanNvbicsIHsgZm9vOiAnYmFyJyB9KTtcbiAgYXdhaXQgZnMud3JpdGVKU09OKCdjZGsuanNvbicsIHsgY29udGV4dDogeyBib286ICdmYXInIH0gfSk7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG5cbiAgLy8gV0hFTlxuICBjb25maWcuY29udGV4dC5jbGVhcigpO1xuICBhd2FpdCBjb25maWcuc2F2ZUNvbnRleHQoKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChhd2FpdCBmcy5yZWFkSlNPTignY2RrLmNvbnRleHQuanNvbicpKS50b0VxdWFsKHt9KTtcbiAgZXhwZWN0KGF3YWl0IGZzLnJlYWRKU09OKCdjZGsuanNvbicpKS50b0VxdWFsKHsgY29udGV4dDogeyBib286ICdmYXInIH0gfSk7XG59KTtcblxudGVzdCgnY29udGV4dCBpcyBwcmVzZXJ2ZWQgaW4gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggaXQgaXMgcmVhZCcsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgYXdhaXQgZnMud3JpdGVKU09OKCdjZGsuanNvbicsIHsgY29udGV4dDogeyAnYm9vOmJvbyc6ICdmYXInIH0gfSk7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG5cbiAgLy8gV0hFTlxuICBleHBlY3QoY29uZmlnLmNvbnRleHQuYWxsKS50b0VxdWFsKHsgJ2Jvbzpib28nOiAnZmFyJyB9KTtcbiAgYXdhaXQgY29uZmlnLnNhdmVDb250ZXh0KCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoYXdhaXQgZnMucmVhZEpTT04oJ2Nkay5jb250ZXh0Lmpzb24nKSkudG9FcXVhbCh7fSk7XG4gIGV4cGVjdChhd2FpdCBmcy5yZWFkSlNPTignY2RrLmpzb24nKSkudG9FcXVhbCh7IGNvbnRleHQ6IHsgJ2Jvbzpib28nOiAnZmFyJyB9IH0pO1xufSk7XG5cbnRlc3QoJ3N1cml2ZSBubyBjb250ZXh0IGluIG9sZCBmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBhd2FpdCBmcy53cml0ZUpTT04oJ2Nkay5qc29uJywgeyB9KTtcbiAgYXdhaXQgZnMud3JpdGVKU09OKCdjZGsuY29udGV4dC5qc29uJywgeyBib286ICdmYXInIH0pO1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBuZXcgQ29uZmlndXJhdGlvbih7IHJlYWRVc2VyQ29udGV4dDogZmFsc2UgfSkubG9hZCgpO1xuXG4gIC8vIFdIRU5cbiAgZXhwZWN0KGNvbmZpZy5jb250ZXh0LmFsbCkudG9FcXVhbCh7IGJvbzogJ2ZhcicgfSk7XG4gIGF3YWl0IGNvbmZpZy5zYXZlQ29udGV4dCgpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGF3YWl0IGZzLnJlYWRKU09OKCdjZGsuY29udGV4dC5qc29uJykpLnRvRXF1YWwoeyBib286ICdmYXInIH0pO1xufSk7XG5cbnRlc3QoJ2NvbW1hbmQgbGluZSBjb250ZXh0IGlzIG1lcmdlZCB3aXRoIHN0b3JlZCBjb250ZXh0JywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBhd2FpdCBmcy53cml0ZUpTT04oJ2Nkay5jb250ZXh0Lmpzb24nLCB7IGJvbzogJ2ZhcicgfSk7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHtcbiAgICByZWFkVXNlckNvbnRleHQ6IGZhbHNlLFxuICAgIGNvbW1hbmRMaW5lQXJndW1lbnRzOiB7XG4gICAgICBjb250ZXh0OiBbJ2Zvbz1iYXInXSxcbiAgICAgIF86IFsnY29tbWFuZCddLFxuICAgIH0gYXMgYW55LFxuICB9KS5sb2FkKCk7XG5cbiAgLy8gV0hFTlxuICBleHBlY3QoY29uZmlnLmNvbnRleHQuYWxsKS50b0VxdWFsKHsgZm9vOiAnYmFyJywgYm9vOiAnZmFyJyB9KTtcbn0pO1xuXG50ZXN0KCdjYW4gc2F2ZSBhbmQgbG9hZCcsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgY29uZmlnMSA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG4gIGNvbmZpZzEuY29udGV4dC5zZXQoJ3NvbWVfa2V5JywgJ3NvbWVfdmFsdWUnKTtcbiAgYXdhaXQgY29uZmlnMS5zYXZlQ29udGV4dCgpO1xuICBleHBlY3QoY29uZmlnMS5jb250ZXh0LmdldCgnc29tZV9rZXknKSkudG9FcXVhbCgnc29tZV92YWx1ZScpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgY29uZmlnMiA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoY29uZmlnMi5jb250ZXh0LmdldCgnc29tZV9rZXknKSkudG9FcXVhbCgnc29tZV92YWx1ZScpO1xufSk7XG5cbnRlc3QoJ3RyYW5zaWVudCB2YWx1ZXMgYXJlbnQgc2F2ZWQgdG8gZGlzaycsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgY29uZmlnMSA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG4gIGNvbmZpZzEuY29udGV4dC5zZXQoJ3NvbWVfa2V5JywgeyBbVFJBTlNJRU5UX0NPTlRFWFRfS0VZXTogdHJ1ZSwgdmFsdWU6ICdzb21lX3ZhbHVlJyB9KTtcbiAgYXdhaXQgY29uZmlnMS5zYXZlQ29udGV4dCgpO1xuICBleHBlY3QoY29uZmlnMS5jb250ZXh0LmdldCgnc29tZV9rZXknKS52YWx1ZSkudG9FcXVhbCgnc29tZV92YWx1ZScpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgY29uZmlnMiA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoY29uZmlnMi5jb250ZXh0LmdldCgnc29tZV9rZXknKSkudG9FcXVhbCh1bmRlZmluZWQpO1xufSk7XG4iXX0=