@jcoreio/aws-ecr-utils 1.0.0

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/es/index.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "copyECRImage", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _copyECRImage.default;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "ecrImageExists", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _ecrImageExists.default;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "loginToECR", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _loginToECR.default;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "parseECRImageUri", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _parseECRImageUri.default;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "tagECRImage", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _tagECRImage.default;
34
+ }
35
+ });
36
+
37
+ var _copyECRImage = _interopRequireDefault(require("./copyECRImage"));
38
+
39
+ var _ecrImageExists = _interopRequireDefault(require("./ecrImageExists"));
40
+
41
+ var _loginToECR = _interopRequireDefault(require("./loginToECR"));
42
+
43
+ var _tagECRImage = _interopRequireDefault(require("./tagECRImage"));
44
+
45
+ var _parseECRImageUri = _interopRequireDefault(require("./parseECRImageUri"));
46
+
47
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgY29weUVDUkltYWdlIH0gZnJvbSAnLi9jb3B5RUNSSW1hZ2UnXG5leHBvcnQgeyBkZWZhdWx0IGFzIGVjckltYWdlRXhpc3RzIH0gZnJvbSAnLi9lY3JJbWFnZUV4aXN0cydcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbG9naW5Ub0VDUiB9IGZyb20gJy4vbG9naW5Ub0VDUidcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdGFnRUNSSW1hZ2UgfSBmcm9tICcuL3RhZ0VDUkltYWdlJ1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZUVDUkltYWdlVXJpIH0gZnJvbSAnLi9wYXJzZUVDUkltYWdlVXJpJ1xuIl19
@@ -0,0 +1,7 @@
1
+ // @flow
2
+
3
+ export { default as copyECRImage } from './copyECRImage'
4
+ export { default as ecrImageExists } from './ecrImageExists'
5
+ export { default as loginToECR } from './loginToECR'
6
+ export { default as tagECRImage } from './tagECRImage'
7
+ export { default as parseECRImageUri } from './parseECRImageUri'
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @prettier
3
+ */
4
+ import AWS from 'aws-sdk';
5
+ export default function loginToECR({ ecr, awsConfig, }: {
6
+ ecr?: AWS.ECR;
7
+ awsConfig?: AWS.ConfigurationOptions;
8
+ }): Promise<void>;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = loginToECR;
7
+
8
+ var _awsSdk = _interopRequireDefault(require("aws-sdk"));
9
+
10
+ var _promisifyChildProcess = require("promisify-child-process");
11
+
12
+ var _base64Js = _interopRequireDefault(require("base64-js"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ /**
17
+ * @prettier
18
+ */
19
+ async function loginToECR({
20
+ ecr,
21
+ awsConfig
22
+ }) {
23
+ if (!ecr) ecr = new _awsSdk.default.ECR(awsConfig);
24
+ const {
25
+ authorizationData
26
+ } = await ecr.getAuthorizationToken().promise();
27
+ const {
28
+ authorizationToken,
29
+ proxyEndpoint
30
+ } = (authorizationData === null || authorizationData === void 0 ? void 0 : authorizationData[0]) || {};
31
+
32
+ if (!authorizationToken) {
33
+ throw new Error('failed to get authorizationToken from ECR');
34
+ }
35
+
36
+ if (!proxyEndpoint) {
37
+ throw new Error('failed to get proxyEndpoint from ECR');
38
+ } // this is silly...
39
+
40
+
41
+ const decoded = new Buffer(_base64Js.default.toByteArray(authorizationToken)).toString('utf8');
42
+ const [user, password] = decoded.split(/:/);
43
+ const child = (0, _promisifyChildProcess.spawn)('docker', ['login', '-u', user, '--password-stdin', proxyEndpoint], {
44
+ stdio: 'pipe',
45
+ encoding: 'utf8'
46
+ });
47
+
48
+ if (!child.stdin) {
49
+ throw new Error('expected child.stdin to be defined');
50
+ }
51
+
52
+ child.stdin.write(password);
53
+ child.stdin.end();
54
+ await child;
55
+ }
56
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dpblRvRUNSLnRzIl0sIm5hbWVzIjpbImxvZ2luVG9FQ1IiLCJlY3IiLCJhd3NDb25maWciLCJBV1MiLCJFQ1IiLCJhdXRob3JpemF0aW9uRGF0YSIsImdldEF1dGhvcml6YXRpb25Ub2tlbiIsInByb21pc2UiLCJhdXRob3JpemF0aW9uVG9rZW4iLCJwcm94eUVuZHBvaW50IiwiRXJyb3IiLCJkZWNvZGVkIiwiQnVmZmVyIiwiYmFzZTY0IiwidG9CeXRlQXJyYXkiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzd29yZCIsInNwbGl0IiwiY2hpbGQiLCJzdGRpbyIsImVuY29kaW5nIiwic3RkaW4iLCJ3cml0ZSIsImVuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBOztBQUNBOztBQUNBOzs7O0FBTEE7QUFDQTtBQUNBO0FBS2UsZUFBZUEsVUFBZixDQUEwQjtBQUN2Q0MsRUFBQUEsR0FEdUM7QUFFdkNDLEVBQUFBO0FBRnVDLENBQTFCLEVBTUc7QUFDaEIsTUFBSSxDQUFDRCxHQUFMLEVBQVVBLEdBQUcsR0FBRyxJQUFJRSxnQkFBSUMsR0FBUixDQUFZRixTQUFaLENBQU47QUFDVixRQUFNO0FBQUVHLElBQUFBO0FBQUYsTUFBd0IsTUFBTUosR0FBRyxDQUFDSyxxQkFBSixHQUE0QkMsT0FBNUIsRUFBcEM7QUFDQSxRQUFNO0FBQUVDLElBQUFBLGtCQUFGO0FBQXNCQyxJQUFBQTtBQUF0QixNQUF3QyxDQUFBSixpQkFBaUIsU0FBakIsSUFBQUEsaUJBQWlCLFdBQWpCLFlBQUFBLGlCQUFpQixDQUFHLENBQUgsQ0FBakIsS0FBMEIsRUFBeEU7O0FBQ0EsTUFBSSxDQUFDRyxrQkFBTCxFQUF5QjtBQUN2QixVQUFNLElBQUlFLEtBQUosQ0FBVSwyQ0FBVixDQUFOO0FBQ0Q7O0FBQ0QsTUFBSSxDQUFDRCxhQUFMLEVBQW9CO0FBQ2xCLFVBQU0sSUFBSUMsS0FBSixDQUFVLHNDQUFWLENBQU47QUFDRCxHQVRlLENBVWhCOzs7QUFDQSxRQUFNQyxPQUFPLEdBQUcsSUFBSUMsTUFBSixDQUFXQyxrQkFBT0MsV0FBUCxDQUFtQk4sa0JBQW5CLENBQVgsRUFBbURPLFFBQW5ELENBQ2QsTUFEYyxDQUFoQjtBQUdBLFFBQU0sQ0FBQ0MsSUFBRCxFQUFPQyxRQUFQLElBQW1CTixPQUFPLENBQUNPLEtBQVIsQ0FBYyxHQUFkLENBQXpCO0FBQ0EsUUFBTUMsS0FBSyxHQUFHLGtDQUNaLFFBRFksRUFFWixDQUFDLE9BQUQsRUFBVSxJQUFWLEVBQWdCSCxJQUFoQixFQUFzQixrQkFBdEIsRUFBMENQLGFBQTFDLENBRlksRUFHWjtBQUNFVyxJQUFBQSxLQUFLLEVBQUUsTUFEVDtBQUVFQyxJQUFBQSxRQUFRLEVBQUU7QUFGWixHQUhZLENBQWQ7O0FBUUEsTUFBSSxDQUFDRixLQUFLLENBQUNHLEtBQVgsRUFBa0I7QUFDaEIsVUFBTSxJQUFJWixLQUFKLENBQVUsb0NBQVYsQ0FBTjtBQUNEOztBQUNEUyxFQUFBQSxLQUFLLENBQUNHLEtBQU4sQ0FBWUMsS0FBWixDQUFrQk4sUUFBbEI7QUFDQUUsRUFBQUEsS0FBSyxDQUFDRyxLQUFOLENBQVlFLEdBQVo7QUFDQSxRQUFNTCxLQUFOO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgQVdTIGZyb20gJ2F3cy1zZGsnXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ3Byb21pc2lmeS1jaGlsZC1wcm9jZXNzJ1xuaW1wb3J0IGJhc2U2NCBmcm9tICdiYXNlNjQtanMnXG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGxvZ2luVG9FQ1Ioe1xuICBlY3IsXG4gIGF3c0NvbmZpZyxcbn06IHtcbiAgZWNyPzogQVdTLkVDUlxuICBhd3NDb25maWc/OiBBV1MuQ29uZmlndXJhdGlvbk9wdGlvbnNcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFlY3IpIGVjciA9IG5ldyBBV1MuRUNSKGF3c0NvbmZpZylcbiAgY29uc3QgeyBhdXRob3JpemF0aW9uRGF0YSB9ID0gYXdhaXQgZWNyLmdldEF1dGhvcml6YXRpb25Ub2tlbigpLnByb21pc2UoKVxuICBjb25zdCB7IGF1dGhvcml6YXRpb25Ub2tlbiwgcHJveHlFbmRwb2ludCB9ID0gYXV0aG9yaXphdGlvbkRhdGE/LlswXSB8fCB7fVxuICBpZiAoIWF1dGhvcml6YXRpb25Ub2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCBhdXRob3JpemF0aW9uVG9rZW4gZnJvbSBFQ1InKVxuICB9XG4gIGlmICghcHJveHlFbmRwb2ludCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCBwcm94eUVuZHBvaW50IGZyb20gRUNSJylcbiAgfVxuICAvLyB0aGlzIGlzIHNpbGx5Li4uXG4gIGNvbnN0IGRlY29kZWQgPSBuZXcgQnVmZmVyKGJhc2U2NC50b0J5dGVBcnJheShhdXRob3JpemF0aW9uVG9rZW4pKS50b1N0cmluZyhcbiAgICAndXRmOCdcbiAgKVxuICBjb25zdCBbdXNlciwgcGFzc3dvcmRdID0gZGVjb2RlZC5zcGxpdCgvOi8pXG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oXG4gICAgJ2RvY2tlcicsXG4gICAgWydsb2dpbicsICctdScsIHVzZXIsICctLXBhc3N3b3JkLXN0ZGluJywgcHJveHlFbmRwb2ludF0sXG4gICAge1xuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfVxuICApXG4gIGlmICghY2hpbGQuc3RkaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGNoaWxkLnN0ZGluIHRvIGJlIGRlZmluZWQnKVxuICB9XG4gIGNoaWxkLnN0ZGluLndyaXRlKHBhc3N3b3JkKVxuICBjaGlsZC5zdGRpbi5lbmQoKVxuICBhd2FpdCBjaGlsZFxufVxuIl19
@@ -0,0 +1,6 @@
1
+ // @flow
2
+
3
+ declare export default function loginToECR(options: {
4
+ ecr?: any,
5
+ awsConfig?: { ... },
6
+ }): Promise<void>
@@ -0,0 +1,6 @@
1
+ export default function parseECRImageUri(imageUri: string): {
2
+ registryId: string;
3
+ region: string;
4
+ repositoryName: string;
5
+ imageTag: string;
6
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = parseECRImageUri;
7
+
8
+ function parseECRImageUri(imageUri) {
9
+ const match = /(\d+)\.dkr\.ecr\.([^.]+)\.amazonaws\.com\/([^:]+):(.+)/.exec(imageUri);
10
+ if (!match) throw new Error(`invalid imageUri: ${imageUri}`);
11
+ const [, registryId, region, repositoryName, imageTag] = match;
12
+ return {
13
+ registryId,
14
+ region,
15
+ repositoryName,
16
+ imageTag
17
+ };
18
+ }
19
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUVDUkltYWdlVXJpLnRzIl0sIm5hbWVzIjpbInBhcnNlRUNSSW1hZ2VVcmkiLCJpbWFnZVVyaSIsIm1hdGNoIiwiZXhlYyIsIkVycm9yIiwicmVnaXN0cnlJZCIsInJlZ2lvbiIsInJlcG9zaXRvcnlOYW1lIiwiaW1hZ2VUYWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBZSxTQUFTQSxnQkFBVCxDQUEwQkMsUUFBMUIsRUFLYjtBQUNBLFFBQU1DLEtBQUssR0FBRyx5REFBeURDLElBQXpELENBQ1pGLFFBRFksQ0FBZDtBQUdBLE1BQUksQ0FBQ0MsS0FBTCxFQUFZLE1BQU0sSUFBSUUsS0FBSixDQUFXLHFCQUFvQkgsUUFBUyxFQUF4QyxDQUFOO0FBQ1osUUFBTSxHQUFHSSxVQUFILEVBQWVDLE1BQWYsRUFBdUJDLGNBQXZCLEVBQXVDQyxRQUF2QyxJQUFtRE4sS0FBekQ7QUFDQSxTQUFPO0FBQUVHLElBQUFBLFVBQUY7QUFBY0MsSUFBQUEsTUFBZDtBQUFzQkMsSUFBQUEsY0FBdEI7QUFBc0NDLElBQUFBO0FBQXRDLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlRUNSSW1hZ2VVcmkoaW1hZ2VVcmk6IHN0cmluZyk6IHtcbiAgcmVnaXN0cnlJZDogc3RyaW5nXG4gIHJlZ2lvbjogc3RyaW5nXG4gIHJlcG9zaXRvcnlOYW1lOiBzdHJpbmdcbiAgaW1hZ2VUYWc6IHN0cmluZ1xufSB7XG4gIGNvbnN0IG1hdGNoID0gLyhcXGQrKVxcLmRrclxcLmVjclxcLihbXi5dKylcXC5hbWF6b25hd3NcXC5jb21cXC8oW146XSspOiguKykvLmV4ZWMoXG4gICAgaW1hZ2VVcmlcbiAgKVxuICBpZiAoIW1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW1hZ2VVcmk6ICR7aW1hZ2VVcml9YClcbiAgY29uc3QgWywgcmVnaXN0cnlJZCwgcmVnaW9uLCByZXBvc2l0b3J5TmFtZSwgaW1hZ2VUYWddID0gbWF0Y2hcbiAgcmV0dXJuIHsgcmVnaXN0cnlJZCwgcmVnaW9uLCByZXBvc2l0b3J5TmFtZSwgaW1hZ2VUYWcgfVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ // @flow
2
+
3
+ declare export default function parseECRImageUri(imageUri: string): {|
4
+ registryId: string,
5
+ region: string,
6
+ repositoryName: string,
7
+ imageTag: string,
8
+ |}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @prettier
3
+ */
4
+ import AWS from 'aws-sdk';
5
+ export default function tagECRImage({ ecr, awsConfig, imageUri, tags, }: {
6
+ ecr?: AWS.ECR;
7
+ awsConfig?: AWS.ConfigurationOptions;
8
+ imageUri: string;
9
+ tags: string[];
10
+ }): Promise<void>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = tagECRImage;
7
+
8
+ var _awsSdk = _interopRequireDefault(require("aws-sdk"));
9
+
10
+ var _parseECRImageUri = _interopRequireDefault(require("./parseECRImageUri"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ /**
15
+ * @prettier
16
+ */
17
+ async function tagECRImage({
18
+ ecr,
19
+ awsConfig,
20
+ imageUri,
21
+ tags
22
+ }) {
23
+ const {
24
+ region,
25
+ repositoryName,
26
+ imageTag
27
+ } = (0, _parseECRImageUri.default)(imageUri);
28
+ if (!ecr) ecr = new _awsSdk.default.ECR({ ...awsConfig,
29
+ region
30
+ });
31
+ const imageManifest = await ecr.batchGetImage({
32
+ repositoryName,
33
+ imageIds: [{
34
+ imageTag
35
+ }]
36
+ }).promise().then(r => {
37
+ var _r$images, _r$images$;
38
+
39
+ return r === null || r === void 0 ? void 0 : (_r$images = r.images) === null || _r$images === void 0 ? void 0 : (_r$images$ = _r$images[0]) === null || _r$images$ === void 0 ? void 0 : _r$images$.imageManifest;
40
+ });
41
+
42
+ if (!imageManifest) {
43
+ throw new Error(`failed to get image manifest for ${imageUri}`);
44
+ }
45
+
46
+ if (imageManifest) {
47
+ // add other tags to ECR
48
+ for (const tag of tags) {
49
+ // eslint-disable-next-line no-console
50
+ console.error(`Adding tag ${repositoryName}:${tag}`);
51
+
52
+ try {
53
+ await ecr.putImage({
54
+ repositoryName,
55
+ imageManifest,
56
+ imageTag: tag.substring(tag.indexOf(':') + 1)
57
+ }).promise();
58
+ } catch (error) {
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ if ((error === null || error === void 0 ? void 0 : error.code) !== 'ImageAlreadyExistsException') throw error;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90YWdFQ1JJbWFnZS50cyJdLCJuYW1lcyI6WyJ0YWdFQ1JJbWFnZSIsImVjciIsImF3c0NvbmZpZyIsImltYWdlVXJpIiwidGFncyIsInJlZ2lvbiIsInJlcG9zaXRvcnlOYW1lIiwiaW1hZ2VUYWciLCJBV1MiLCJFQ1IiLCJpbWFnZU1hbmlmZXN0IiwiYmF0Y2hHZXRJbWFnZSIsImltYWdlSWRzIiwicHJvbWlzZSIsInRoZW4iLCJyIiwiaW1hZ2VzIiwiRXJyb3IiLCJ0YWciLCJjb25zb2xlIiwiZXJyb3IiLCJwdXRJbWFnZSIsInN1YnN0cmluZyIsImluZGV4T2YiLCJjb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBR0E7O0FBQ0E7Ozs7QUFKQTtBQUNBO0FBQ0E7QUFJZSxlQUFlQSxXQUFmLENBQTJCO0FBQ3hDQyxFQUFBQSxHQUR3QztBQUV4Q0MsRUFBQUEsU0FGd0M7QUFHeENDLEVBQUFBLFFBSHdDO0FBSXhDQyxFQUFBQTtBQUp3QyxDQUEzQixFQVVHO0FBQ2hCLFFBQU07QUFBRUMsSUFBQUEsTUFBRjtBQUFVQyxJQUFBQSxjQUFWO0FBQTBCQyxJQUFBQTtBQUExQixNQUF1QywrQkFBaUJKLFFBQWpCLENBQTdDO0FBQ0EsTUFBSSxDQUFDRixHQUFMLEVBQVVBLEdBQUcsR0FBRyxJQUFJTyxnQkFBSUMsR0FBUixDQUFZLEVBQUUsR0FBR1AsU0FBTDtBQUFnQkcsSUFBQUE7QUFBaEIsR0FBWixDQUFOO0FBRVYsUUFBTUssYUFBYSxHQUFHLE1BQU1ULEdBQUcsQ0FDNUJVLGFBRHlCLENBQ1g7QUFDYkwsSUFBQUEsY0FEYTtBQUViTSxJQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUFFTCxNQUFBQTtBQUFGLEtBQUQ7QUFGRyxHQURXLEVBS3pCTSxPQUx5QixHQU16QkMsSUFOeUIsQ0FNbkJDLENBQUQ7QUFBQTs7QUFBQSxXQUFPQSxDQUFQLGFBQU9BLENBQVAsb0NBQU9BLENBQUMsQ0FBRUMsTUFBViw0REFBTyxVQUFZLENBQVosQ0FBUCwrQ0FBTyxXQUFnQk4sYUFBdkI7QUFBQSxHQU5vQixDQUE1Qjs7QUFRQSxNQUFJLENBQUNBLGFBQUwsRUFBb0I7QUFDbEIsVUFBTSxJQUFJTyxLQUFKLENBQVcsb0NBQW1DZCxRQUFTLEVBQXZELENBQU47QUFDRDs7QUFFRCxNQUFJTyxhQUFKLEVBQW1CO0FBQ2pCO0FBQ0EsU0FBSyxNQUFNUSxHQUFYLElBQWtCZCxJQUFsQixFQUF3QjtBQUN0QjtBQUNBZSxNQUFBQSxPQUFPLENBQUNDLEtBQVIsQ0FBZSxjQUFhZCxjQUFlLElBQUdZLEdBQUksRUFBbEQ7O0FBQ0EsVUFBSTtBQUNGLGNBQU1qQixHQUFHLENBQ05vQixRQURHLENBQ007QUFDUmYsVUFBQUEsY0FEUTtBQUVSSSxVQUFBQSxhQUZRO0FBR1JILFVBQUFBLFFBQVEsRUFBRVcsR0FBRyxDQUFDSSxTQUFKLENBQWNKLEdBQUcsQ0FBQ0ssT0FBSixDQUFZLEdBQVosSUFBbUIsQ0FBakM7QUFIRixTQUROLEVBTUhWLE9BTkcsRUFBTjtBQU9ELE9BUkQsQ0FRRSxPQUFPTyxLQUFQLEVBQWM7QUFDZDtBQUNBLFlBQUksQ0FBQ0EsS0FBRCxhQUFDQSxLQUFELHVCQUFDQSxLQUFELENBQWdCSSxJQUFoQixNQUF5Qiw2QkFBN0IsRUFBNEQsTUFBTUosS0FBTjtBQUM3RDtBQUNGO0FBQ0Y7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBBV1MgZnJvbSAnYXdzLXNkaydcbmltcG9ydCBwYXJzZUVDUkltYWdlVXJpIGZyb20gJy4vcGFyc2VFQ1JJbWFnZVVyaSdcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gdGFnRUNSSW1hZ2Uoe1xuICBlY3IsXG4gIGF3c0NvbmZpZyxcbiAgaW1hZ2VVcmksXG4gIHRhZ3MsXG59OiB7XG4gIGVjcj86IEFXUy5FQ1JcbiAgYXdzQ29uZmlnPzogQVdTLkNvbmZpZ3VyYXRpb25PcHRpb25zXG4gIGltYWdlVXJpOiBzdHJpbmdcbiAgdGFnczogc3RyaW5nW11cbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyByZWdpb24sIHJlcG9zaXRvcnlOYW1lLCBpbWFnZVRhZyB9ID0gcGFyc2VFQ1JJbWFnZVVyaShpbWFnZVVyaSlcbiAgaWYgKCFlY3IpIGVjciA9IG5ldyBBV1MuRUNSKHsgLi4uYXdzQ29uZmlnLCByZWdpb24gfSlcblxuICBjb25zdCBpbWFnZU1hbmlmZXN0ID0gYXdhaXQgZWNyXG4gICAgLmJhdGNoR2V0SW1hZ2Uoe1xuICAgICAgcmVwb3NpdG9yeU5hbWUsXG4gICAgICBpbWFnZUlkczogW3sgaW1hZ2VUYWcgfV0sXG4gICAgfSlcbiAgICAucHJvbWlzZSgpXG4gICAgLnRoZW4oKHIpID0+IHI/LmltYWdlcz8uWzBdPy5pbWFnZU1hbmlmZXN0KVxuXG4gIGlmICghaW1hZ2VNYW5pZmVzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmFpbGVkIHRvIGdldCBpbWFnZSBtYW5pZmVzdCBmb3IgJHtpbWFnZVVyaX1gKVxuICB9XG5cbiAgaWYgKGltYWdlTWFuaWZlc3QpIHtcbiAgICAvLyBhZGQgb3RoZXIgdGFncyB0byBFQ1JcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgQWRkaW5nIHRhZyAke3JlcG9zaXRvcnlOYW1lfToke3RhZ31gKVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZWNyXG4gICAgICAgICAgLnB1dEltYWdlKHtcbiAgICAgICAgICAgIHJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAgICAgaW1hZ2VNYW5pZmVzdCxcbiAgICAgICAgICAgIGltYWdlVGFnOiB0YWcuc3Vic3RyaW5nKHRhZy5pbmRleE9mKCc6JykgKyAxKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wcm9taXNlKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KT8uY29kZSAhPT0gJ0ltYWdlQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbicpIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ // @flow
2
+
3
+ declare export default function tagECRImage(options: {|
4
+ ecr?: any,
5
+ awsConfig?: { ... },
6
+ imageUri: string,
7
+ tags: string[],
8
+ |}): Promise<void>
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export { default as copyECRImage } from './copyECRImage';
2
+ export { default as ecrImageExists } from './ecrImageExists';
3
+ export { default as loginToECR } from './loginToECR';
4
+ export { default as tagECRImage } from './tagECRImage';
5
+ export { default as parseECRImageUri } from './parseECRImageUri';
package/index.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "copyECRImage", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _copyECRImage["default"];
12
+ }
13
+ });
14
+ Object.defineProperty(exports, "ecrImageExists", {
15
+ enumerable: true,
16
+ get: function get() {
17
+ return _ecrImageExists["default"];
18
+ }
19
+ });
20
+ Object.defineProperty(exports, "loginToECR", {
21
+ enumerable: true,
22
+ get: function get() {
23
+ return _loginToECR["default"];
24
+ }
25
+ });
26
+ Object.defineProperty(exports, "parseECRImageUri", {
27
+ enumerable: true,
28
+ get: function get() {
29
+ return _parseECRImageUri["default"];
30
+ }
31
+ });
32
+ Object.defineProperty(exports, "tagECRImage", {
33
+ enumerable: true,
34
+ get: function get() {
35
+ return _tagECRImage["default"];
36
+ }
37
+ });
38
+
39
+ var _copyECRImage = _interopRequireDefault(require("./copyECRImage"));
40
+
41
+ var _ecrImageExists = _interopRequireDefault(require("./ecrImageExists"));
42
+
43
+ var _loginToECR = _interopRequireDefault(require("./loginToECR"));
44
+
45
+ var _tagECRImage = _interopRequireDefault(require("./tagECRImage"));
46
+
47
+ var _parseECRImageUri = _interopRequireDefault(require("./parseECRImageUri"));
package/index.js.flow ADDED
@@ -0,0 +1,7 @@
1
+ // @flow
2
+
3
+ export { default as copyECRImage } from './copyECRImage'
4
+ export { default as ecrImageExists } from './ecrImageExists'
5
+ export { default as loginToECR } from './loginToECR'
6
+ export { default as tagECRImage } from './tagECRImage'
7
+ export { default as parseECRImageUri } from './parseECRImageUri'
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @prettier
3
+ */
4
+ import AWS from 'aws-sdk';
5
+ export default function loginToECR({ ecr, awsConfig, }: {
6
+ ecr?: AWS.ECR;
7
+ awsConfig?: AWS.ConfigurationOptions;
8
+ }): Promise<void>;
package/loginToECR.js ADDED
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = loginToECR;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ var _awsSdk = _interopRequireDefault(require("aws-sdk"));
17
+
18
+ var _promisifyChildProcess = require("promisify-child-process");
19
+
20
+ var _base64Js = _interopRequireDefault(require("base64-js"));
21
+
22
+ /**
23
+ * @prettier
24
+ */
25
+ function loginToECR(_x) {
26
+ return _loginToECR.apply(this, arguments);
27
+ }
28
+
29
+ function _loginToECR() {
30
+ _loginToECR = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref) {
31
+ var ecr, awsConfig, _yield$ecr$getAuthori, authorizationData, _ref2, authorizationToken, proxyEndpoint, decoded, _decoded$split, _decoded$split2, user, password, child;
32
+
33
+ return _regenerator["default"].wrap(function _callee$(_context) {
34
+ while (1) {
35
+ switch (_context.prev = _context.next) {
36
+ case 0:
37
+ ecr = _ref.ecr, awsConfig = _ref.awsConfig;
38
+ if (!ecr) ecr = new _awsSdk["default"].ECR(awsConfig);
39
+ _context.next = 4;
40
+ return ecr.getAuthorizationToken().promise();
41
+
42
+ case 4:
43
+ _yield$ecr$getAuthori = _context.sent;
44
+ authorizationData = _yield$ecr$getAuthori.authorizationData;
45
+ _ref2 = (authorizationData === null || authorizationData === void 0 ? void 0 : authorizationData[0]) || {}, authorizationToken = _ref2.authorizationToken, proxyEndpoint = _ref2.proxyEndpoint;
46
+
47
+ if (authorizationToken) {
48
+ _context.next = 9;
49
+ break;
50
+ }
51
+
52
+ throw new Error('failed to get authorizationToken from ECR');
53
+
54
+ case 9:
55
+ if (proxyEndpoint) {
56
+ _context.next = 11;
57
+ break;
58
+ }
59
+
60
+ throw new Error('failed to get proxyEndpoint from ECR');
61
+
62
+ case 11:
63
+ // this is silly...
64
+ decoded = new Buffer(_base64Js["default"].toByteArray(authorizationToken)).toString('utf8');
65
+ _decoded$split = decoded.split(/:/), _decoded$split2 = (0, _slicedToArray2["default"])(_decoded$split, 2), user = _decoded$split2[0], password = _decoded$split2[1];
66
+ child = (0, _promisifyChildProcess.spawn)('docker', ['login', '-u', user, '--password-stdin', proxyEndpoint], {
67
+ stdio: 'pipe',
68
+ encoding: 'utf8'
69
+ });
70
+
71
+ if (child.stdin) {
72
+ _context.next = 16;
73
+ break;
74
+ }
75
+
76
+ throw new Error('expected child.stdin to be defined');
77
+
78
+ case 16:
79
+ child.stdin.write(password);
80
+ child.stdin.end();
81
+ _context.next = 20;
82
+ return child;
83
+
84
+ case 20:
85
+ case "end":
86
+ return _context.stop();
87
+ }
88
+ }
89
+ }, _callee);
90
+ }));
91
+ return _loginToECR.apply(this, arguments);
92
+ }
@@ -0,0 +1,6 @@
1
+ // @flow
2
+
3
+ declare export default function loginToECR(options: {
4
+ ecr?: any,
5
+ awsConfig?: { ... },
6
+ }): Promise<void>
package/package.json ADDED
@@ -0,0 +1,128 @@
1
+ {
2
+ "name": "@jcoreio/aws-ecr-utils",
3
+ "version": "1.0.0",
4
+ "description": "utilities for working with AWS Elastic Container Registry",
5
+ "main": "index.js",
6
+ "sideEffects": false,
7
+ "scripts": {
8
+ "lint": "eslint $npm_package_config_lint",
9
+ "lint:fix": "eslint $npm_package_config_lint",
10
+ "prettier": "prettier --write $npm_package_config_prettier",
11
+ "prettier:check": "prettier --list-different $npm_package_config_prettier",
12
+ "tsc": "tsc",
13
+ "tsc:watch": "npm run tsc -- --watch",
14
+ "clean": "rimraf es lib $(cd src; ls) *.js *.d.ts *.js.flow",
15
+ "build": "npm run clean && npm run build:types && npm run build:js",
16
+ "build:types": "tsc -p tsconfig.build.json && tsc -p tsconfig.build.json --outDir es && copy 'src/**/*.js.flow' . && copy 'src/**/*.js.flow' es",
17
+ "build:js": "babel src --out-dir es --extensions \".ts\" --source-maps inline && cross-env BABEL_ENV=es5 babel src --out-dir . --extensions \".ts\"",
18
+ "test": "cross-env NODE_ENV=test BABEL_ENV=es5 mocha $npm_package_config_mocha && cross-env NODE_ENV=test BABEL_ENV=coverage nyc --reporter=lcov --reporter=text mocha $npm_package_config_mocha",
19
+ "test:watch": "cross-env NODE_ENV=test BABEL_ENV=test mocha $npm_package_config_mocha --watch",
20
+ "test:debug": "cross-env NODE_ENV=test BABEL_ENV=test mocha --inspect-brk $npm_package_config_mocha",
21
+ "codecov": "nyc report --reporter=text-lcov > coverage.lcov; codecov",
22
+ "prepublishOnly": "npm run clean && npm run prettier:check && npm run lint && flow && npm test && npm run build",
23
+ "open:coverage": "open coverage/lcov-report/index.html",
24
+ "semantic-release": "semantic-release"
25
+ },
26
+ "config": {
27
+ "lint": "--cache --ext .js,.ts src test",
28
+ "mocha": "--extension js --extension ts test/configure.js 'src/**/*.spec.ts' 'test/**/*.ts'",
29
+ "prettier": ".babelrc.js *.{json,md} {src,test}/**/*.{js,ts,flow}",
30
+ "commitizen": {
31
+ "path": "cz-conventional-changelog"
32
+ }
33
+ },
34
+ "husky": {
35
+ "hooks": {
36
+ "pre-commit": "lint-staged && npm run lint && npm run tsc && flow",
37
+ "commit-msg": "commitlint -e $GIT_PARAMS",
38
+ "pre-push": "npm test"
39
+ }
40
+ },
41
+ "lint-staged": {
42
+ "*.{js,ts,json,css,md,flow}": [
43
+ "prettier --write"
44
+ ]
45
+ },
46
+ "commitlint": {
47
+ "extends": [
48
+ "@jedwards1211/commitlint-config"
49
+ ]
50
+ },
51
+ "prettier": {
52
+ "semi": false,
53
+ "singleQuote": true,
54
+ "trailingComma": "es5"
55
+ },
56
+ "nyc": {
57
+ "include": [
58
+ "src/**/*.ts"
59
+ ],
60
+ "exclude": [
61
+ "src/**/*.spec.ts"
62
+ ],
63
+ "require": [
64
+ "@babel/register"
65
+ ],
66
+ "sourceMap": false,
67
+ "instrument": false
68
+ },
69
+ "repository": {
70
+ "type": "git",
71
+ "url": "https://github.com/jcoreio/aws-ecr-utils.git"
72
+ },
73
+ "keywords": [
74
+ "aws",
75
+ "ecr",
76
+ "aws-sdk"
77
+ ],
78
+ "author": "Andy Edwards",
79
+ "license": "MIT",
80
+ "bugs": {
81
+ "url": "https://github.com/jcoreio/aws-ecr-utils/issues"
82
+ },
83
+ "homepage": "https://github.com/jcoreio/aws-ecr-utils#readme",
84
+ "devDependencies": {
85
+ "@babel/cli": "^7.15.7",
86
+ "@babel/core": "^7.15.5",
87
+ "@babel/plugin-proposal-export-default-from": "^7.14.5",
88
+ "@babel/plugin-proposal-export-namespace-from": "^7.14.5",
89
+ "@babel/plugin-transform-runtime": "^7.15.0",
90
+ "@babel/preset-env": "^7.15.6",
91
+ "@babel/preset-typescript": "^7.15.0",
92
+ "@babel/register": "^7.15.3",
93
+ "@commitlint/cli": "^13.2.0",
94
+ "@commitlint/config-conventional": "^13.2.0",
95
+ "@jedwards1211/commitlint-config": "^1.0.2",
96
+ "@jedwards1211/eslint-config": "^2.0.2",
97
+ "@jedwards1211/eslint-config-typescript": "^2.0.2",
98
+ "@types/chai": "^4.2.22",
99
+ "@types/mocha": "^9.0.0",
100
+ "@types/node": "^16.10.2",
101
+ "@typescript-eslint/eslint-plugin": "^4.32.0",
102
+ "@typescript-eslint/parser": "^4.32.0",
103
+ "@typescript-eslint/typescript-estree": "^4.32.0",
104
+ "babel-plugin-istanbul": "^6.0.0",
105
+ "chai": "^4.3.4",
106
+ "codecov": "^3.8.3",
107
+ "copy": "^0.3.2",
108
+ "cross-env": "^7.0.3",
109
+ "eslint": "^7.32.0",
110
+ "eslint-config-prettier": "^8.3.0",
111
+ "flow-bin": "^0.161.0",
112
+ "husky": "^7.0.2",
113
+ "lint-staged": "^11.1.2",
114
+ "mocha": "^9.1.2",
115
+ "nyc": "^15.1.0",
116
+ "prettier": "^2.4.1",
117
+ "prettier-eslint": "^13.0.0",
118
+ "rimraf": "^3.0.2",
119
+ "semantic-release": "^18.0.0",
120
+ "typescript": "^4.4.3"
121
+ },
122
+ "dependencies": {
123
+ "@babel/runtime": "^7.15.4",
124
+ "aws-sdk": "^2.1070.0",
125
+ "base64-js": "^1.5.1",
126
+ "promisify-child-process": "^4.1.1"
127
+ }
128
+ }
@@ -0,0 +1,6 @@
1
+ export default function parseECRImageUri(imageUri: string): {
2
+ registryId: string;
3
+ region: string;
4
+ repositoryName: string;
5
+ imageTag: string;
6
+ };
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = parseECRImageUri;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ function parseECRImageUri(imageUri) {
13
+ var match = /(\d+)\.dkr\.ecr\.([^.]+)\.amazonaws\.com\/([^:]+):(.+)/.exec(imageUri);
14
+ if (!match) throw new Error("invalid imageUri: ".concat(imageUri));
15
+
16
+ var _match = (0, _slicedToArray2["default"])(match, 5),
17
+ registryId = _match[1],
18
+ region = _match[2],
19
+ repositoryName = _match[3],
20
+ imageTag = _match[4];
21
+
22
+ return {
23
+ registryId: registryId,
24
+ region: region,
25
+ repositoryName: repositoryName,
26
+ imageTag: imageTag
27
+ };
28
+ }
@@ -0,0 +1,8 @@
1
+ // @flow
2
+
3
+ declare export default function parseECRImageUri(imageUri: string): {|
4
+ registryId: string,
5
+ region: string,
6
+ repositoryName: string,
7
+ imageTag: string,
8
+ |}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @prettier
3
+ */
4
+ import AWS from 'aws-sdk';
5
+ export default function tagECRImage({ ecr, awsConfig, imageUri, tags, }: {
6
+ ecr?: AWS.ECR;
7
+ awsConfig?: AWS.ConfigurationOptions;
8
+ imageUri: string;
9
+ tags: string[];
10
+ }): Promise<void>;