UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

222 lines 26.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const util_1 = require("./util"); const assets_1 = require("../lib/assets"); const asset_manifest_builder_1 = require("../lib/util/asset-manifest-builder"); const environment_resources_1 = require("../lib/api/environment-resources"); const mock_sdk_1 = require("./util/mock-sdk"); const mock_toolkitinfo_1 = require("./util/mock-toolkitinfo"); let assets; let envRegistry; let envResources; let toolkitMock; beforeEach(() => { assets = new asset_manifest_builder_1.AssetManifestBuilder(); envRegistry = new environment_resources_1.EnvironmentResourcesRegistry(); const sdk = new mock_sdk_1.MockSdk(); envResources = envRegistry.for({ account: '11111111', region: 'us-nowhere', name: 'aws://11111111/us-nowhere' }, sdk); toolkitMock = mock_toolkitinfo_1.MockToolkitInfo.setup(); }); afterEach(() => { toolkitMock.dispose(); }); describe('file assets', () => { test('convert to manifest and parameters', async () => { // GIVEN const ext = __filename.match(/\.([tj]s)$/)?.[1]; const stack = stackWithAssets([ { sourceHash: 'source-hash', path: __filename, id: 'SomeStackSomeResource4567', packaging: 'file', s3BucketParameter: 'BucketParameter', s3KeyParameter: 'KeyParameter', artifactHashParameter: 'ArtifactHashParameter', }, ]); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(params).toEqual({ BucketParameter: 'MockToolkitBucketName', KeyParameter: `assets/SomeStackSomeResource4567/||source-hash.${ext}`, ArtifactHashParameter: 'source-hash', }); expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ destination: { bucketName: 'MockToolkitBucketName', objectKey: `assets/SomeStackSomeResource4567/source-hash.${ext}`, }, source: { packaging: 'file', path: __filename, }, }), ]); }); test('hash and ID the same => only one path component', async () => { // GIVEN const ext = __filename.match(/\.([tj]s)$/)?.[1]; const stack = stackWithAssets([ { sourceHash: 'source-hash', path: __filename, id: 'source-hash', packaging: 'file', s3BucketParameter: 'BucketParameter', s3KeyParameter: 'KeyParameter', artifactHashParameter: 'ArtifactHashParameter', }, ]); // WHEN await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ destination: { bucketName: 'MockToolkitBucketName', objectKey: `assets/source-hash.${ext}`, }, }), ]); }); test('reuse', async () => { // GIVEN const stack = stackWithAssets([ { path: __filename, id: 'SomeStackSomeResource4567', packaging: 'file', s3BucketParameter: 'BucketParameter', s3KeyParameter: 'KeyParameter', artifactHashParameter: 'ArtifactHashParameter', sourceHash: 'boom', }, ]); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources, ['SomeStackSomeResource4567']); // THEN expect(params).toEqual({}); expect(assets.toManifest('.').entries).toEqual([]); }); }); describe('docker assets', () => { test('parameter and no repository name (old)', async () => { await (0, util_1.withMocked)(envResources, 'prepareEcrRepository', async () => { // GIVEN const stack = stackWithAssets([ { id: 'Stack:Construct/ABC123', imageNameParameter: 'MyParameter', packaging: 'container-image', path: '/foo', sourceHash: '0123456789abcdef', }, ]); mockFn(envResources.prepareEcrRepository).mockResolvedValue({ repositoryUri: 'docker.uri' }); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(envResources.prepareEcrRepository).toHaveBeenCalledWith('cdk/stack-construct-abc123'); expect(params).toEqual({ MyParameter: 'docker.uri:0123456789abcdef', }); expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ type: 'docker-image', destination: { imageTag: '0123456789abcdef', repositoryName: 'cdk/stack-construct-abc123', }, source: { directory: '/foo', }, }), ]); }); }); test('if parameter is left out then repo and tag are required', async () => { // GIVEN const stack = stackWithAssets([ { id: 'Stack:Construct/ABC123', packaging: 'container-image', path: '/foo', sourceHash: '0123456789abcdef', }, ]); await expect((0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources)).rejects.toThrow('Invalid Docker image asset'); }); test('no parameter and repo/tag name (new)', async () => { await (0, util_1.withMocked)(envResources, 'prepareEcrRepository', async () => { // GIVEN const stack = stackWithAssets([ { id: 'Stack:Construct/ABC123', repositoryName: 'reponame', imageTag: '12345', packaging: 'container-image', path: '/foo', sourceHash: '0123456789abcdef', }, ]); mockFn(envResources.prepareEcrRepository).mockResolvedValue({ repositoryUri: 'docker.uri' }); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(envResources.prepareEcrRepository).toHaveBeenCalledWith('reponame'); expect(params).toEqual({}); // No parameters! expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ type: 'docker-image', destination: { imageTag: '12345', repositoryName: 'reponame', }, source: { directory: '/foo', }, }), ]); }); }); test('reuse', async () => { // GIVEN const stack = stackWithAssets([ { path: __dirname, id: 'SomeStackSomeResource4567', packaging: 'container-image', imageNameParameter: 'asdf', sourceHash: 'source-hash', }, ]); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources, ['SomeStackSomeResource4567']); // THEN expect(params).toEqual({}); expect(assets.toManifest('.').entries).toEqual([]); }); }); function stackWithAssets(assetEntries) { return (0, util_1.testStack)({ stackName: 'SomeStack', assets: assetEntries, template: { Resources: { SomeResource: { Type: 'AWS::Something::Something', }, }, }, }); } function mockFn(fn) { if (!jest.isMockFunction(fn)) { throw new Error(`Not a mock function: ${fn}`); } return fn; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhc3NldHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGlDQUErQztBQUMvQywwQ0FBNEQ7QUFDNUQsK0VBQTBFO0FBQzFFLDRFQUFzRztBQUN0Ryw4Q0FBMEM7QUFDMUMsOERBQTBEO0FBRTFELElBQUksTUFBNEIsQ0FBQztBQUNqQyxJQUFJLFdBQXlDLENBQUM7QUFDOUMsSUFBSSxZQUFrQyxDQUFDO0FBQ3ZDLElBQUksV0FBcUQsQ0FBQztBQUMxRCxVQUFVLENBQUMsR0FBRyxFQUFFO0lBQ2QsTUFBTSxHQUFHLElBQUksNkNBQW9CLEVBQUUsQ0FBQztJQUNwQyxXQUFXLEdBQUcsSUFBSSxvREFBNEIsRUFBRSxDQUFDO0lBRWpELE1BQU0sR0FBRyxHQUFHLElBQUksa0JBQU8sRUFBRSxDQUFDO0lBQzFCLFlBQVksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RILFdBQVcsR0FBRyxrQ0FBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN4QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO0lBQzNCLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRCxRQUFRO1FBQ1IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQztZQUM1QjtnQkFDRSxVQUFVLEVBQUUsYUFBYTtn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LENBQUMsQ0FBQztRQUU3RyxPQUFPO1FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUN0QixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsZUFBZSxDQUFDLFlBQWtDO0lBQ3pELE9BQU8sSUFBQSxnQkFBUyxFQUFDO1FBQ2YsU0FBUyxFQUFFLFdBQVc7UUFDdEIsTUFBTSxFQUFFLFlBQVk7UUFDcEIsUUFBUSxFQUFFO1lBQ1IsU0FBUyxFQUFFO2dCQUNULFlBQVksRUFBRTtvQkFDWixJQUFJLEVBQUUsMkJBQTJCO2lCQUNsQzthQUNGO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQWtDLEVBQUs7SUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUMvQztJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9vcmRlciAqL1xuaW1wb3J0IHsgQXNzZXRNZXRhZGF0YUVudHJ5IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IHRlc3RTdGFjaywgd2l0aE1vY2tlZCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3QgfSBmcm9tICcuLi9saWIvYXNzZXRzJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3RCdWlsZGVyIH0gZnJvbSAnLi4vbGliL3V0aWwvYXNzZXQtbWFuaWZlc3QtYnVpbGRlcic7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFJlc291cmNlcywgRW52aXJvbm1lbnRSZXNvdXJjZXNSZWdpc3RyeSB9IGZyb20gJy4uL2xpYi9hcGkvZW52aXJvbm1lbnQtcmVzb3VyY2VzJztcbmltcG9ydCB7IE1vY2tTZGsgfSBmcm9tICcuL3V0aWwvbW9jay1zZGsnO1xuaW1wb3J0IHsgTW9ja1Rvb2xraXRJbmZvIH0gZnJvbSAnLi91dGlsL21vY2stdG9vbGtpdGluZm8nO1xuXG5sZXQgYXNzZXRzOiBBc3NldE1hbmlmZXN0QnVpbGRlcjtcbmxldCBlbnZSZWdpc3RyeTogRW52aXJvbm1lbnRSZXNvdXJjZXNSZWdpc3RyeTtcbmxldCBlbnZSZXNvdXJjZXM6IEVudmlyb25tZW50UmVzb3VyY2VzO1xubGV0IHRvb2xraXRNb2NrOiBSZXR1cm5UeXBlPHR5cGVvZiBNb2NrVG9vbGtpdEluZm8uc2V0dXA+O1xuYmVmb3JlRWFjaCgoKSA9PiB7XG4gIGFzc2V0cyA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICBlbnZSZWdpc3RyeSA9IG5ldyBFbnZpcm9ubWVudFJlc291cmNlc1JlZ2lzdHJ5KCk7XG5cbiAgY29uc3Qgc2RrID0gbmV3IE1vY2tTZGsoKTtcbiAgZW52UmVzb3VyY2VzID0gZW52UmVnaXN0cnkuZm9yKHsgYWNjb3VudDogJzExMTExMTExJywgcmVnaW9uOiAndXMtbm93aGVyZScsIG5hbWU6ICdhd3M6Ly8xMTExMTExMS91cy1ub3doZXJlJyB9LCBzZGspO1xuICB0b29sa2l0TW9jayA9IE1vY2tUb29sa2l0SW5mby5zZXR1cCgpO1xufSk7XG5cbmFmdGVyRWFjaCgoKSA9PiB7XG4gIHRvb2xraXRNb2NrLmRpc3Bvc2UoKTtcbn0pO1xuXG5kZXNjcmliZSgnZmlsZSBhc3NldHMnLCAoKSA9PiB7XG4gIHRlc3QoJ2NvbnZlcnQgdG8gbWFuaWZlc3QgYW5kIHBhcmFtZXRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBleHQgPSBfX2ZpbGVuYW1lLm1hdGNoKC9cXC4oW3RqXXMpJC8pPy5bMV07XG4gICAgY29uc3Qgc3RhY2sgPSBzdGFja1dpdGhBc3NldHMoW1xuICAgICAge1xuICAgICAgICBzb3VyY2VIYXNoOiAnc291cmNlLWhhc2gnLFxuICAgICAgICBwYXRoOiBfX2ZpbGVuYW1lLFxuICAgICAgICBpZDogJ1NvbWVTdGFja1NvbWVSZXNvdXJjZTQ1NjcnLFxuICAgICAgICBwYWNrYWdpbmc6ICdmaWxlJyxcbiAgICAgICAgczNCdWNrZXRQYXJhbWV0ZXI6ICdCdWNrZXRQYXJhbWV0ZXInLFxuICAgICAgICBzM0tleVBhcmFtZXRlcjogJ0tleVBhcmFtZXRlcicsXG4gICAgICAgIGFydGlmYWN0SGFzaFBhcmFtZXRlcjogJ0FydGlmYWN0SGFzaFBhcmFtZXRlcicsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFjaywgYXNzZXRzLCBlbnZSZXNvdXJjZXMpO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChwYXJhbXMpLnRvRXF1YWwoe1xuICAgICAgQnVja2V0UGFyYW1ldGVyOiAnTW9ja1Rvb2xraXRCdWNrZXROYW1lJyxcbiAgICAgIEtleVBhcmFtZXRlcjogYGFzc2V0cy9Tb21lU3RhY2tTb21lUmVzb3VyY2U0NTY3L3x8c291cmNlLWhhc2guJHtleHR9YCxcbiAgICAgIEFydGlmYWN0SGFzaFBhcmFtZXRlcjogJ3NvdXJjZS1oYXNoJyxcbiAgICB9KTtcblxuICAgIGV4cGVjdChhc3NldHMudG9NYW5pZmVzdCgnLicpLmVudHJpZXMpLnRvRXF1YWwoW1xuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICAgIGJ1Y2tldE5hbWU6ICdNb2NrVG9vbGtpdEJ1Y2tldE5hbWUnLFxuICAgICAgICAgIG9iamVjdEtleTogYGFzc2V0cy9Tb21lU3RhY2tTb21lUmVzb3VyY2U0NTY3L3NvdXJjZS1oYXNoLiR7ZXh0fWAsXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZToge1xuICAgICAgICAgIHBhY2thZ2luZzogJ2ZpbGUnLFxuICAgICAgICAgIHBhdGg6IF9fZmlsZW5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgdGVzdCgnaGFzaCBhbmQgSUQgdGhlIHNhbWUgPT4gb25seSBvbmUgcGF0aCBjb21wb25lbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBleHQgPSBfX2ZpbGVuYW1lLm1hdGNoKC9cXC4oW3RqXXMpJC8pPy5bMV07XG4gICAgY29uc3Qgc3RhY2sgPSBzdGFja1dpdGhBc3NldHMoW1xuICAgICAge1xuICAgICAgICBzb3VyY2VIYXNoOiAnc291cmNlLWhhc2gnLFxuICAgICAgICBwYXRoOiBfX2ZpbGVuYW1lLFxuICAgICAgICBpZDogJ3NvdXJjZS1oYXNoJyxcbiAgICAgICAgcGFja2FnaW5nOiAnZmlsZScsXG4gICAgICAgIHMzQnVja2V0UGFyYW1ldGVyOiAnQnVja2V0UGFyYW1ldGVyJyxcbiAgICAgICAgczNLZXlQYXJhbWV0ZXI6ICdLZXlQYXJhbWV0ZXInLFxuICAgICAgICBhcnRpZmFjdEhhc2hQYXJhbWV0ZXI6ICdBcnRpZmFjdEhhc2hQYXJhbWV0ZXInLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIC8vIFdIRU5cbiAgICBhd2FpdCBhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3Qoc3RhY2ssIGFzc2V0cywgZW52UmVzb3VyY2VzKTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QoYXNzZXRzLnRvTWFuaWZlc3QoJy4nKS5lbnRyaWVzKS50b0VxdWFsKFtcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICBidWNrZXROYW1lOiAnTW9ja1Rvb2xraXRCdWNrZXROYW1lJyxcbiAgICAgICAgICBvYmplY3RLZXk6IGBhc3NldHMvc291cmNlLWhhc2guJHtleHR9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9KTtcblxuICB0ZXN0KCdyZXVzZScsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gc3RhY2tXaXRoQXNzZXRzKFtcbiAgICAgIHtcbiAgICAgICAgcGF0aDogX19maWxlbmFtZSxcbiAgICAgICAgaWQ6ICdTb21lU3RhY2tTb21lUmVzb3VyY2U0NTY3JyxcbiAgICAgICAgcGFja2FnaW5nOiAnZmlsZScsXG4gICAgICAgIHMzQnVja2V0UGFyYW1ldGVyOiAnQnVja2V0UGFyYW1ldGVyJyxcbiAgICAgICAgczNLZXlQYXJhbWV0ZXI6ICdLZXlQYXJhbWV0ZXInLFxuICAgICAgICBhcnRpZmFjdEhhc2hQYXJhbWV0ZXI6ICdBcnRpZmFjdEhhc2hQYXJhbWV0ZXInLFxuICAgICAgICBzb3VyY2VIYXNoOiAnYm9vbScsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFjaywgYXNzZXRzLCBlbnZSZXNvdXJjZXMsIFsnU29tZVN0YWNrU29tZVJlc291cmNlNDU2NyddKTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QocGFyYW1zKS50b0VxdWFsKHtcbiAgICB9KTtcblxuICAgIGV4cGVjdChhc3NldHMudG9NYW5pZmVzdCgnLicpLmVudHJpZXMpLnRvRXF1YWwoW10pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnZG9ja2VyIGFzc2V0cycsICgpID0+IHtcbiAgdGVzdCgncGFyYW1ldGVyIGFuZCBubyByZXBvc2l0b3J5IG5hbWUgKG9sZCknLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgd2l0aE1vY2tlZChlbnZSZXNvdXJjZXMsICdwcmVwYXJlRWNyUmVwb3NpdG9yeScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEdJVkVOXG4gICAgICBjb25zdCBzdGFjayA9IHN0YWNrV2l0aEFzc2V0cyhbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ1N0YWNrOkNvbnN0cnVjdC9BQkMxMjMnLFxuICAgICAgICAgIGltYWdlTmFtZVBhcmFtZXRlcjogJ015UGFyYW1ldGVyJyxcbiAgICAgICAgICBwYWNrYWdpbmc6ICdjb250YWluZXItaW1hZ2UnLFxuICAgICAgICAgIHBhdGg6ICcvZm9vJyxcbiAgICAgICAgICBzb3VyY2VIYXNoOiAnMDEyMzQ1Njc4OWFiY2RlZicsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIG1vY2tGbihlbnZSZXNvdXJjZXMucHJlcGFyZUVjclJlcG9zaXRvcnkpLm1vY2tSZXNvbHZlZFZhbHVlKHsgcmVwb3NpdG9yeVVyaTogJ2RvY2tlci51cmknIH0pO1xuXG4gICAgICAvLyBXSEVOXG4gICAgICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3Qoc3RhY2ssIGFzc2V0cywgZW52UmVzb3VyY2VzKTtcblxuICAgICAgLy8gVEhFTlxuICAgICAgZXhwZWN0KGVudlJlc291cmNlcy5wcmVwYXJlRWNyUmVwb3NpdG9yeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Nkay9zdGFjay1jb25zdHJ1Y3QtYWJjMTIzJyk7XG4gICAgICBleHBlY3QocGFyYW1zKS50b0VxdWFsKHtcbiAgICAgICAgTXlQYXJhbWV0ZXI6ICdkb2NrZXIudXJpOjAxMjM0NTY3ODlhYmNkZWYnLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoYXNzZXRzLnRvTWFuaWZlc3QoJy4nKS5lbnRyaWVzKS50b0VxdWFsKFtcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHR5cGU6ICdkb2NrZXItaW1hZ2UnLFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgICBpbWFnZVRhZzogJzAxMjM0NTY3ODlhYmNkZWYnLFxuICAgICAgICAgICAgcmVwb3NpdG9yeU5hbWU6ICdjZGsvc3RhY2stY29uc3RydWN0LWFiYzEyMycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogJy9mb28nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2lmIHBhcmFtZXRlciBpcyBsZWZ0IG91dCB0aGVuIHJlcG8gYW5kIHRhZyBhcmUgcmVxdWlyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IHN0YWNrV2l0aEFzc2V0cyhbXG4gICAgICB7XG4gICAgICAgIGlkOiAnU3RhY2s6Q29uc3RydWN0L0FCQzEyMycsXG4gICAgICAgIHBhY2thZ2luZzogJ2NvbnRhaW5lci1pbWFnZScsXG4gICAgICAgIHBhdGg6ICcvZm9vJyxcbiAgICAgICAgc291cmNlSGFzaDogJzAxMjM0NTY3ODlhYmNkZWYnLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIGF3YWl0IGV4cGVjdChhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3Qoc3RhY2ssIGFzc2V0cywgZW52UmVzb3VyY2VzKSkucmVqZWN0cy50b1Rocm93KCdJbnZhbGlkIERvY2tlciBpbWFnZSBhc3NldCcpO1xuICB9KTtcblxuICB0ZXN0KCdubyBwYXJhbWV0ZXIgYW5kIHJlcG8vdGFnIG5hbWUgKG5ldyknLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgd2l0aE1vY2tlZChlbnZSZXNvdXJjZXMsICdwcmVwYXJlRWNyUmVwb3NpdG9yeScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEdJVkVOXG4gICAgICBjb25zdCBzdGFjayA9IHN0YWNrV2l0aEFzc2V0cyhbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ1N0YWNrOkNvbnN0cnVjdC9BQkMxMjMnLFxuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiAncmVwb25hbWUnLFxuICAgICAgICAgIGltYWdlVGFnOiAnMTIzNDUnLFxuICAgICAgICAgIHBhY2thZ2luZzogJ2NvbnRhaW5lci1pbWFnZScsXG4gICAgICAgICAgcGF0aDogJy9mb28nLFxuICAgICAgICAgIHNvdXJjZUhhc2g6ICcwMTIzNDU2Nzg5YWJjZGVmJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgbW9ja0ZuKGVudlJlc291cmNlcy5wcmVwYXJlRWNyUmVwb3NpdG9yeSkubW9ja1Jlc29sdmVkVmFsdWUoeyByZXBvc2l0b3J5VXJpOiAnZG9ja2VyLnVyaScgfSk7XG5cbiAgICAgIC8vIFdIRU5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFjaywgYXNzZXRzLCBlbnZSZXNvdXJjZXMpO1xuXG4gICAgICAvLyBUSEVOXG4gICAgICBleHBlY3QoZW52UmVzb3VyY2VzLnByZXBhcmVFY3JSZXBvc2l0b3J5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgncmVwb25hbWUnKTtcbiAgICAgIGV4cGVjdChwYXJhbXMpLnRvRXF1YWwoe30pOyAvLyBObyBwYXJhbWV0ZXJzIVxuICAgICAgZXhwZWN0KGFzc2V0cy50b01hbmlmZXN0KCcuJykuZW50cmllcykudG9FcXVhbChbXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICB0eXBlOiAnZG9ja2VyLWltYWdlJyxcbiAgICAgICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICAgICAgaW1hZ2VUYWc6ICcxMjM0NScsXG4gICAgICAgICAgICByZXBvc2l0b3J5TmFtZTogJ3JlcG9uYW1lJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZToge1xuICAgICAgICAgICAgZGlyZWN0b3J5OiAnL2ZvbycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgncmV1c2UnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gR0lWRU5cbiAgICBjb25zdCBzdGFjayA9IHN0YWNrV2l0aEFzc2V0cyhbXG4gICAgICB7XG4gICAgICAgIHBhdGg6IF9fZGlybmFtZSxcbiAgICAgICAgaWQ6ICdTb21lU3RhY2tTb21lUmVzb3VyY2U0NTY3JyxcbiAgICAgICAgcGFja2FnaW5nOiAnY29udGFpbmVyLWltYWdlJyxcbiAgICAgICAgaW1hZ2VOYW1lUGFyYW1ldGVyOiAnYXNkZicsXG4gICAgICAgIHNvdXJjZUhhc2g6ICdzb3VyY2UtaGFzaCcsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgLy8gV0hFTlxuICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFjaywgYXNzZXRzLCBlbnZSZXNvdXJjZXMsIFsnU29tZVN0YWNrU29tZVJlc291cmNlNDU2NyddKTtcblxuICAgIC8vIFRIRU5cbiAgICBleHBlY3QocGFyYW1zKS50b0VxdWFsKHtcbiAgICB9KTtcblxuICAgIGV4cGVjdChhc3NldHMudG9NYW5pZmVzdCgnLicpLmVudHJpZXMpLnRvRXF1YWwoW10pO1xuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBzdGFja1dpdGhBc3NldHMoYXNzZXRFbnRyaWVzOiBBc3NldE1ldGFkYXRhRW50cnlbXSkge1xuICByZXR1cm4gdGVzdFN0YWNrKHtcbiAgICBzdGFja05hbWU6ICdTb21lU3RhY2snLFxuICAgIGFzc2V0czogYXNzZXRFbnRyaWVzLFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICBSZXNvdXJjZXM6IHtcbiAgICAgICAgU29tZVJlc291cmNlOiB7XG4gICAgICAgICAgVHlwZTogJ0FXUzo6U29tZXRoaW5nOjpTb21ldGhpbmcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gbW9ja0ZuPEYgZXh0ZW5kcyAoLi4ueHM6IGFueVtdKSA9PiBhbnk+KGZuOiBGKTogamVzdC5Nb2NrPFJldHVyblR5cGU8Rj4+IHtcbiAgaWYgKCFqZXN0LmlzTW9ja0Z1bmN0aW9uKGZuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm90IGEgbW9jayBmdW5jdGlvbjogJHtmbn1gKTtcbiAgfVxuICByZXR1cm4gZm47XG59XG4iXX0=