@cloud-copilot/iam-collect 0.1.85 → 0.1.86

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.
@@ -6,13 +6,13 @@ const accountOrgs_js_1 = require("./indexers/accountOrgs.js");
6
6
  const apigateways_js_1 = require("./indexers/apigateways.js");
7
7
  const buckets_js_1 = require("./indexers/buckets.js");
8
8
  const iamPrincipalsToTrustPolicies_js_1 = require("./indexers/iamPrincipalsToTrustPolicies.js");
9
- const vpcEndpoints_js_1 = require("./indexers/vpcEndpoints.js");
9
+ const vpcs_js_1 = require("./indexers/vpcs.js");
10
10
  const allIndexers = [
11
11
  accountOrgs_js_1.AccountOrganizationIndexer,
12
12
  apigateways_js_1.ApiGatewayIndexer,
13
13
  iamPrincipalsToTrustPolicies_js_1.IamPrincipalsToTrustPoliciesIndexer,
14
14
  buckets_js_1.S3BucketIndexer,
15
- vpcEndpoints_js_1.VpcEndpointIndexer
15
+ vpcs_js_1.VpcEndpointIndexer
16
16
  ];
17
17
  const indexMap = new Map();
18
18
  for (const indexer of allIndexers) {
@@ -1 +1 @@
1
- {"version":3,"file":"indexMap.js","sourceRoot":"","sources":["../../../src/indexing/indexMap.ts"],"names":[],"mappings":";;AAgCA,sDAEC;AAlCD,gDAA6D;AAE7D,8DAAsE;AACtE,8DAA6D;AAC7D,sDAAuD;AACvD,gGAAgG;AAChG,gEAA+D;AAE/D,MAAM,WAAW,GAAmB;IAClC,2CAA0B;IAC1B,kCAAiB;IACjB,qEAAmC;IACnC,4BAAe;IACf,oCAAkB;CACnB,CAAA;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;AAElD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAA,8BAAgB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,UAAsB;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAA,8BAAgB,EAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;AACzD,CAAC"}
1
+ {"version":3,"file":"indexMap.js","sourceRoot":"","sources":["../../../src/indexing/indexMap.ts"],"names":[],"mappings":";;AAgCA,sDAEC;AAlCD,gDAA6D;AAE7D,8DAAsE;AACtE,8DAA6D;AAC7D,sDAAuD;AACvD,gGAAgG;AAChG,gDAAuD;AAEvD,MAAM,WAAW,GAAmB;IAClC,2CAA0B;IAC1B,kCAAiB;IACjB,qEAAmC;IACnC,4BAAe;IACf,4BAAkB;CACnB,CAAA;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;AAElD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAA,8BAAgB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,UAAsB;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAA,8BAAgB,EAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;AACzD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Indexer } from '../indexer.js';
2
+ export interface VpcIndex {
3
+ vpcs: Record<string, {
4
+ arn: string;
5
+ endpoints: {
6
+ id: string;
7
+ service: string;
8
+ }[];
9
+ }>;
10
+ endpoints: Record<string, {
11
+ arn: string;
12
+ vpc: string;
13
+ }>;
14
+ }
15
+ export declare const VpcEndpointIndexer: Indexer<VpcIndex>;
16
+ //# sourceMappingURL=vpcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpcs.d.ts","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAYvC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAA;IAEnF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACxD;AAID,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAgGhD,CAAA"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VpcEndpointIndexer = void 0;
4
+ const iam_utils_1 = require("@cloud-copilot/iam-utils");
5
+ const indexName = 'vpcs';
6
+ exports.VpcEndpointIndexer = {
7
+ awsService: 'ec2',
8
+ name: 'vpcs',
9
+ getCache: async (storage) => {
10
+ const data = await storage.getIndex(indexName, {
11
+ vpcs: {},
12
+ endpoints: {}
13
+ });
14
+ return data;
15
+ },
16
+ saveCache: async (storage, cache, lockId) => {
17
+ return storage.saveIndex(indexName, cache, lockId);
18
+ },
19
+ updateCache: async (existingCache, accountId, regions, storage) => {
20
+ const regionsSet = new Set(regions);
21
+ const matchesRegion = (region) => {
22
+ return region && (regionsSet.size == 0 || regionsSet.has(region));
23
+ };
24
+ const { vpcs, endpoints } = existingCache;
25
+ const currentVpcKeys = Object.keys(vpcs);
26
+ const currentEndpointKeys = Object.keys(endpoints);
27
+ // Remove all existing vpcs for the account in the specified regions
28
+ for (const key of currentVpcKeys) {
29
+ const arnParts = (0, iam_utils_1.splitArnParts)(vpcs[key].arn);
30
+ if (arnParts.accountId == accountId && matchesRegion(arnParts.region)) {
31
+ delete vpcs[key];
32
+ }
33
+ }
34
+ for (const key of currentEndpointKeys) {
35
+ const arnParts = (0, iam_utils_1.splitArnParts)(endpoints[key].arn);
36
+ if (arnParts.accountId == accountId && matchesRegion(arnParts.region)) {
37
+ delete endpoints[key];
38
+ }
39
+ }
40
+ const currentEndpoints = [];
41
+ const currentVpcs = [];
42
+ if (regions.length == 0) {
43
+ const gateways = await storage.findResourceMetadata(accountId, {
44
+ service: 'ec2',
45
+ region: '*',
46
+ resourceType: 'vpc-endpoint'
47
+ });
48
+ currentEndpoints.push(...gateways);
49
+ const vpcs = await storage.findResourceMetadata(accountId, {
50
+ service: 'ec2',
51
+ region: '*',
52
+ resourceType: 'vpc'
53
+ });
54
+ currentVpcs.push(...vpcs);
55
+ }
56
+ else {
57
+ for (const region of regions) {
58
+ const gateways = await storage.findResourceMetadata(accountId, {
59
+ service: 'ec2',
60
+ region: region,
61
+ resourceType: 'vpc-endpoint'
62
+ });
63
+ currentEndpoints.push(...gateways);
64
+ const vpcs = await storage.findResourceMetadata(accountId, {
65
+ service: 'ec2',
66
+ region: '*',
67
+ resourceType: 'vpc'
68
+ });
69
+ currentVpcs.push(...vpcs);
70
+ }
71
+ }
72
+ for (const endpoint of currentEndpoints) {
73
+ const vpcId = (0, iam_utils_1.splitArnParts)(endpoint.vpc).resourcePath;
74
+ const endpointId = (0, iam_utils_1.splitArnParts)(endpoint.arn).resourcePath;
75
+ endpoints[endpointId] = { arn: endpoint.arn, vpc: vpcId };
76
+ if (!vpcs[vpcId]) {
77
+ vpcs[vpcId] = { arn: endpoint.vpc, endpoints: [] };
78
+ }
79
+ const service = endpoint.serviceName.split('.').slice(3).join('.');
80
+ vpcs[vpcId].endpoints.push({ id: endpointId, service });
81
+ }
82
+ for (const vpc of currentVpcs) {
83
+ const vpcId = (0, iam_utils_1.splitArnParts)(vpc.arn).resourcePath;
84
+ if (!vpcs[vpcId]) {
85
+ vpcs[vpcId] = { arn: vpc.arn, endpoints: [] };
86
+ }
87
+ }
88
+ // return {
89
+ // vpcs,
90
+ // endpoints
91
+ // }
92
+ }
93
+ };
94
+ //# sourceMappingURL=vpcs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpcs.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcs.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { AccountOrganizationIndexer } from './indexers/accountOrgs.js';
3
3
  import { ApiGatewayIndexer } from './indexers/apigateways.js';
4
4
  import { S3BucketIndexer } from './indexers/buckets.js';
5
5
  import { IamPrincipalsToTrustPoliciesIndexer } from './indexers/iamPrincipalsToTrustPolicies.js';
6
- import { VpcEndpointIndexer } from './indexers/vpcEndpoints.js';
6
+ import { VpcEndpointIndexer } from './indexers/vpcs.js';
7
7
  const allIndexers = [
8
8
  AccountOrganizationIndexer,
9
9
  ApiGatewayIndexer,
@@ -1 +1 @@
1
- {"version":3,"file":"indexMap.js","sourceRoot":"","sources":["../../../src/indexing/indexMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,mCAAmC,EAAE,MAAM,4CAA4C,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAE/D,MAAM,WAAW,GAAmB;IAClC,0BAA0B;IAC1B,iBAAiB;IACjB,mCAAmC;IACnC,eAAe;IACf,kBAAkB;CACnB,CAAA;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;AAElD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAsB;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;AACzD,CAAC"}
1
+ {"version":3,"file":"indexMap.js","sourceRoot":"","sources":["../../../src/indexing/indexMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,mCAAmC,EAAE,MAAM,4CAA4C,CAAA;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,WAAW,GAAmB;IAClC,0BAA0B;IAC1B,iBAAiB;IACjB,mCAAmC;IACnC,eAAe;IACf,kBAAkB;CACnB,CAAA;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAA;AAElD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC3B,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAsB;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;AACzD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Indexer } from '../indexer.js';
2
+ export interface VpcIndex {
3
+ vpcs: Record<string, {
4
+ arn: string;
5
+ endpoints: {
6
+ id: string;
7
+ service: string;
8
+ }[];
9
+ }>;
10
+ endpoints: Record<string, {
11
+ arn: string;
12
+ vpc: string;
13
+ }>;
14
+ }
15
+ export declare const VpcEndpointIndexer: Indexer<VpcIndex>;
16
+ //# sourceMappingURL=vpcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpcs.d.ts","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAYvC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAA;IAEnF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACxD;AAID,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAgGhD,CAAA"}
@@ -0,0 +1,91 @@
1
+ import { splitArnParts } from '@cloud-copilot/iam-utils';
2
+ const indexName = 'vpcs';
3
+ export const VpcEndpointIndexer = {
4
+ awsService: 'ec2',
5
+ name: 'vpcs',
6
+ getCache: async (storage) => {
7
+ const data = await storage.getIndex(indexName, {
8
+ vpcs: {},
9
+ endpoints: {}
10
+ });
11
+ return data;
12
+ },
13
+ saveCache: async (storage, cache, lockId) => {
14
+ return storage.saveIndex(indexName, cache, lockId);
15
+ },
16
+ updateCache: async (existingCache, accountId, regions, storage) => {
17
+ const regionsSet = new Set(regions);
18
+ const matchesRegion = (region) => {
19
+ return region && (regionsSet.size == 0 || regionsSet.has(region));
20
+ };
21
+ const { vpcs, endpoints } = existingCache;
22
+ const currentVpcKeys = Object.keys(vpcs);
23
+ const currentEndpointKeys = Object.keys(endpoints);
24
+ // Remove all existing vpcs for the account in the specified regions
25
+ for (const key of currentVpcKeys) {
26
+ const arnParts = splitArnParts(vpcs[key].arn);
27
+ if (arnParts.accountId == accountId && matchesRegion(arnParts.region)) {
28
+ delete vpcs[key];
29
+ }
30
+ }
31
+ for (const key of currentEndpointKeys) {
32
+ const arnParts = splitArnParts(endpoints[key].arn);
33
+ if (arnParts.accountId == accountId && matchesRegion(arnParts.region)) {
34
+ delete endpoints[key];
35
+ }
36
+ }
37
+ const currentEndpoints = [];
38
+ const currentVpcs = [];
39
+ if (regions.length == 0) {
40
+ const gateways = await storage.findResourceMetadata(accountId, {
41
+ service: 'ec2',
42
+ region: '*',
43
+ resourceType: 'vpc-endpoint'
44
+ });
45
+ currentEndpoints.push(...gateways);
46
+ const vpcs = await storage.findResourceMetadata(accountId, {
47
+ service: 'ec2',
48
+ region: '*',
49
+ resourceType: 'vpc'
50
+ });
51
+ currentVpcs.push(...vpcs);
52
+ }
53
+ else {
54
+ for (const region of regions) {
55
+ const gateways = await storage.findResourceMetadata(accountId, {
56
+ service: 'ec2',
57
+ region: region,
58
+ resourceType: 'vpc-endpoint'
59
+ });
60
+ currentEndpoints.push(...gateways);
61
+ const vpcs = await storage.findResourceMetadata(accountId, {
62
+ service: 'ec2',
63
+ region: '*',
64
+ resourceType: 'vpc'
65
+ });
66
+ currentVpcs.push(...vpcs);
67
+ }
68
+ }
69
+ for (const endpoint of currentEndpoints) {
70
+ const vpcId = splitArnParts(endpoint.vpc).resourcePath;
71
+ const endpointId = splitArnParts(endpoint.arn).resourcePath;
72
+ endpoints[endpointId] = { arn: endpoint.arn, vpc: vpcId };
73
+ if (!vpcs[vpcId]) {
74
+ vpcs[vpcId] = { arn: endpoint.vpc, endpoints: [] };
75
+ }
76
+ const service = endpoint.serviceName.split('.').slice(3).join('.');
77
+ vpcs[vpcId].endpoints.push({ id: endpointId, service });
78
+ }
79
+ for (const vpc of currentVpcs) {
80
+ const vpcId = splitArnParts(vpc.arn).resourcePath;
81
+ if (!vpcs[vpcId]) {
82
+ vpcs[vpcId] = { arn: vpc.arn, endpoints: [] };
83
+ }
84
+ }
85
+ // return {
86
+ // vpcs,
87
+ // endpoints
88
+ // }
89
+ }
90
+ };
91
+ //# sourceMappingURL=vpcs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpcs.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloud-copilot/iam-collect",
3
- "version": "0.1.85",
3
+ "version": "0.1.86",
4
4
  "description": "Collect IAM information from AWS Accounts",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,3 +0,0 @@
1
- import { Indexer } from '../indexer.js';
2
- export declare const VpcEndpointIndexer: Indexer<Record<string, string[]>>;
3
- //# sourceMappingURL=vpcEndpoints.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vpcEndpoints.d.ts","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcEndpoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AASvC,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAqDhE,CAAA"}
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VpcEndpointIndexer = void 0;
4
- const iam_utils_1 = require("@cloud-copilot/iam-utils");
5
- const indexName = 'vpcs-to-endpoints';
6
- exports.VpcEndpointIndexer = {
7
- awsService: 'ec2',
8
- name: 'vpcsToEndpoints',
9
- getCache: async (storage) => {
10
- const data = await storage.getIndex(indexName, {});
11
- return data;
12
- },
13
- saveCache: async (storage, cache, lockId) => {
14
- return storage.saveIndex(indexName, cache, lockId);
15
- },
16
- updateCache: async (existingCache, accountId, regions, storage) => {
17
- const regionsSet = new Set(regions);
18
- const matchesRegion = (region) => {
19
- return region && (regionsSet.size == 0 || regionsSet.has(region));
20
- };
21
- const currentCacheKeys = Object.keys(existingCache);
22
- // Remove all existing vpcs for the account in the specified regions
23
- for (const key of currentCacheKeys) {
24
- const arnParts = (0, iam_utils_1.splitArnParts)(key);
25
- if (arnParts.accountId == accountId && matchesRegion(arnParts.region)) {
26
- delete existingCache[key];
27
- }
28
- }
29
- const currentEndpoints = [];
30
- if (regions.length == 0) {
31
- const gateways = await storage.findResourceMetadata(accountId, {
32
- service: 'ec2',
33
- region: '*',
34
- resourceType: 'vpc-endpoint'
35
- });
36
- currentEndpoints.push(...gateways);
37
- }
38
- else {
39
- for (const region of regions) {
40
- const gateways = await storage.findResourceMetadata(accountId, {
41
- service: 'ec2',
42
- region: region,
43
- resourceType: 'vpc-endpoint'
44
- });
45
- currentEndpoints.push(...gateways);
46
- }
47
- }
48
- for (const endpoint of currentEndpoints) {
49
- const vpcId = endpoint.vpc;
50
- if (!existingCache[vpcId]) {
51
- existingCache[vpcId] = [];
52
- }
53
- existingCache[vpcId].push(endpoint.arn);
54
- }
55
- }
56
- };
57
- //# sourceMappingURL=vpcEndpoints.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vpcEndpoints.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcEndpoints.ts"],"names":[],"mappings":";;;AAAA,wDAAwD;AAQxD,MAAM,SAAS,GAAG,mBAAmB,CAAA;AAExB,QAAA,kBAAkB,GAAsC;IACnE,UAAU,EAAE,KAAK;IACjB,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,aAAa,GAAG,CAAC,MAA0B,EAAE,EAAE;YACnD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACnE,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEnD,oEAAoE;QACpE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAA,yBAAa,EAAC,GAAG,CAAC,CAAA;YACnC,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAA0B,EAAE,CAAA;QAElD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAsB,SAAS,EAAE;gBAClF,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,GAAG;gBACX,YAAY,EAAE,cAAc;aAC7B,CAAC,CAAA;YACF,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;QACpC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAsB,SAAS,EAAE;oBAClF,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,cAAc;iBAC7B,CAAC,CAAA;gBACF,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAA;YAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;YAC3B,CAAC;YACD,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;CACF,CAAA"}
@@ -1,3 +0,0 @@
1
- import { Indexer } from '../indexer.js';
2
- export declare const VpcEndpointIndexer: Indexer<Record<string, string[]>>;
3
- //# sourceMappingURL=vpcEndpoints.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vpcEndpoints.d.ts","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcEndpoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AASvC,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAqDhE,CAAA"}
@@ -1,54 +0,0 @@
1
- import { splitArnParts } from '@cloud-copilot/iam-utils';
2
- const indexName = 'vpcs-to-endpoints';
3
- export const VpcEndpointIndexer = {
4
- awsService: 'ec2',
5
- name: 'vpcsToEndpoints',
6
- getCache: async (storage) => {
7
- const data = await storage.getIndex(indexName, {});
8
- return data;
9
- },
10
- saveCache: async (storage, cache, lockId) => {
11
- return storage.saveIndex(indexName, cache, lockId);
12
- },
13
- updateCache: async (existingCache, accountId, regions, storage) => {
14
- const regionsSet = new Set(regions);
15
- const matchesRegion = (region) => {
16
- return region && (regionsSet.size == 0 || regionsSet.has(region));
17
- };
18
- const currentCacheKeys = Object.keys(existingCache);
19
- // Remove all existing vpcs for the account in the specified regions
20
- for (const key of currentCacheKeys) {
21
- const arnParts = splitArnParts(key);
22
- if (arnParts.accountId == accountId && matchesRegion(arnParts.region)) {
23
- delete existingCache[key];
24
- }
25
- }
26
- const currentEndpoints = [];
27
- if (regions.length == 0) {
28
- const gateways = await storage.findResourceMetadata(accountId, {
29
- service: 'ec2',
30
- region: '*',
31
- resourceType: 'vpc-endpoint'
32
- });
33
- currentEndpoints.push(...gateways);
34
- }
35
- else {
36
- for (const region of regions) {
37
- const gateways = await storage.findResourceMetadata(accountId, {
38
- service: 'ec2',
39
- region: region,
40
- resourceType: 'vpc-endpoint'
41
- });
42
- currentEndpoints.push(...gateways);
43
- }
44
- }
45
- for (const endpoint of currentEndpoints) {
46
- const vpcId = endpoint.vpc;
47
- if (!existingCache[vpcId]) {
48
- existingCache[vpcId] = [];
49
- }
50
- existingCache[vpcId].push(endpoint.arn);
51
- }
52
- }
53
- };
54
- //# sourceMappingURL=vpcEndpoints.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vpcEndpoints.js","sourceRoot":"","sources":["../../../../src/indexing/indexers/vpcEndpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAQxD,MAAM,SAAS,GAAG,mBAAmB,CAAA;AAErC,MAAM,CAAC,MAAM,kBAAkB,GAAsC;IACnE,UAAU,EAAE,KAAK;IACjB,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1C,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,aAAa,GAAG,CAAC,MAA0B,EAAE,EAAE;YACnD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACnE,CAAC,CAAA;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEnD,oEAAoE;QACpE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;YACnC,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAA0B,EAAE,CAAA;QAElD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAsB,SAAS,EAAE;gBAClF,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,GAAG;gBACX,YAAY,EAAE,cAAc;aAC7B,CAAC,CAAA;YACF,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;QACpC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAsB,SAAS,EAAE;oBAClF,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,cAAc;iBAC7B,CAAC,CAAA;gBACF,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAA;YAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;YAC3B,CAAC;YACD,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;CACF,CAAA"}