@standards-kit/conform 0.1.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.
Files changed (71) hide show
  1. package/dist/artifactregistry-QQWBMEQN.js +38 -0
  2. package/dist/artifactregistry-QQWBMEQN.js.map +1 -0
  3. package/dist/chunk-J5S6GRGW.js +314 -0
  4. package/dist/chunk-J5S6GRGW.js.map +1 -0
  5. package/dist/chunk-KHO6NIAI.js +1367 -0
  6. package/dist/chunk-KHO6NIAI.js.map +1 -0
  7. package/dist/chunk-M7G73Q6P.js +662 -0
  8. package/dist/chunk-M7G73Q6P.js.map +1 -0
  9. package/dist/chunk-P7TIZJ4C.js +85 -0
  10. package/dist/chunk-P7TIZJ4C.js.map +1 -0
  11. package/dist/chunk-RXA4FO7L.js +279 -0
  12. package/dist/chunk-RXA4FO7L.js.map +1 -0
  13. package/dist/cli.js +7432 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/cloudrun-O36R23SH.js +31 -0
  16. package/dist/cloudrun-O36R23SH.js.map +1 -0
  17. package/dist/cloudwatch-KSZ4A256.js +56 -0
  18. package/dist/cloudwatch-KSZ4A256.js.map +1 -0
  19. package/dist/dynamodb-5KVESCVJ.js +51 -0
  20. package/dist/dynamodb-5KVESCVJ.js.map +1 -0
  21. package/dist/ec2-HKPE6GZV.js +151 -0
  22. package/dist/ec2-HKPE6GZV.js.map +1 -0
  23. package/dist/ecs-OS3NJZTA.js +141 -0
  24. package/dist/ecs-OS3NJZTA.js.map +1 -0
  25. package/dist/elasticache-7TCRHYYM.js +151 -0
  26. package/dist/elasticache-7TCRHYYM.js.map +1 -0
  27. package/dist/elb-PEDLXW5R.js +151 -0
  28. package/dist/elb-PEDLXW5R.js.map +1 -0
  29. package/dist/generate-D4MFMOHP.js +28 -0
  30. package/dist/generate-D4MFMOHP.js.map +1 -0
  31. package/dist/iam-7H5HFWVQ.js +96 -0
  32. package/dist/iam-7H5HFWVQ.js.map +1 -0
  33. package/dist/iam-DJI64AGK.js +39 -0
  34. package/dist/iam-DJI64AGK.js.map +1 -0
  35. package/dist/index.js +7980 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/infra-UXM5XQX3.js +566 -0
  38. package/dist/infra-UXM5XQX3.js.map +1 -0
  39. package/dist/lambda-NFB5UILT.js +60 -0
  40. package/dist/lambda-NFB5UILT.js.map +1 -0
  41. package/dist/manifest-7AIL2FK2.js +23 -0
  42. package/dist/manifest-7AIL2FK2.js.map +1 -0
  43. package/dist/mcp-O5O7XVFG.js +204 -0
  44. package/dist/mcp-O5O7XVFG.js.map +1 -0
  45. package/dist/rds-KLG5O5SI.js +151 -0
  46. package/dist/rds-KLG5O5SI.js.map +1 -0
  47. package/dist/registry-V65CC7IN.js +15 -0
  48. package/dist/registry-V65CC7IN.js.map +1 -0
  49. package/dist/s3-2DH7PRVR.js +49 -0
  50. package/dist/s3-2DH7PRVR.js.map +1 -0
  51. package/dist/scan-EELS42BP.js +593 -0
  52. package/dist/scan-EELS42BP.js.map +1 -0
  53. package/dist/secretmanager-RDL62EFW.js +31 -0
  54. package/dist/secretmanager-RDL62EFW.js.map +1 -0
  55. package/dist/secretsmanager-MOOIHLAO.js +50 -0
  56. package/dist/secretsmanager-MOOIHLAO.js.map +1 -0
  57. package/dist/sns-Y36LVTWA.js +50 -0
  58. package/dist/sns-Y36LVTWA.js.map +1 -0
  59. package/dist/sqs-RRS3GRHK.js +61 -0
  60. package/dist/sqs-RRS3GRHK.js.map +1 -0
  61. package/dist/src-KZRTG3EU.js +45 -0
  62. package/dist/src-KZRTG3EU.js.map +1 -0
  63. package/dist/standards-RXK5G4IG.js +37 -0
  64. package/dist/standards-RXK5G4IG.js.map +1 -0
  65. package/dist/sync-RLYBGYNY.js +877 -0
  66. package/dist/sync-RLYBGYNY.js.map +1 -0
  67. package/dist/validate-AABLVQJS.js +327 -0
  68. package/dist/validate-AABLVQJS.js.map +1 -0
  69. package/dist/validator-6PL5I5EC.js +156 -0
  70. package/dist/validator-6PL5I5EC.js.map +1 -0
  71. package/package.json +91 -0
@@ -0,0 +1,151 @@
1
+ // src/infra/checkers/elb.ts
2
+ import {
3
+ DescribeLoadBalancersCommand,
4
+ DescribeTargetGroupsCommand,
5
+ DescribeListenersCommand,
6
+ ElasticLoadBalancingV2Client
7
+ } from "@aws-sdk/client-elastic-load-balancing-v2";
8
+ var clientCache = /* @__PURE__ */ new Map();
9
+ function getClient(region) {
10
+ let client = clientCache.get(region);
11
+ if (!client) {
12
+ client = new ElasticLoadBalancingV2Client({ region });
13
+ clientCache.set(region, client);
14
+ }
15
+ return client;
16
+ }
17
+ async function checkLoadBalancer(client, arn) {
18
+ const { resourceId, raw } = arn;
19
+ try {
20
+ const response = await client.send(
21
+ new DescribeLoadBalancersCommand({ LoadBalancerArns: [raw] })
22
+ );
23
+ const loadBalancer = response.LoadBalancers?.[0];
24
+ const exists = !!loadBalancer && loadBalancer.State?.Code !== "failed" && loadBalancer.State?.Code !== "active_impaired";
25
+ return {
26
+ arn: raw,
27
+ exists,
28
+ service: "elasticloadbalancing",
29
+ resourceType: "loadbalancer",
30
+ resourceId
31
+ };
32
+ } catch (error) {
33
+ const err = error;
34
+ if (err.name === "LoadBalancerNotFoundException") {
35
+ return {
36
+ arn: raw,
37
+ exists: false,
38
+ service: "elasticloadbalancing",
39
+ resourceType: "loadbalancer",
40
+ resourceId
41
+ };
42
+ }
43
+ return {
44
+ arn: raw,
45
+ exists: false,
46
+ error: err.message || "Unknown error",
47
+ service: "elasticloadbalancing",
48
+ resourceType: "loadbalancer",
49
+ resourceId
50
+ };
51
+ }
52
+ }
53
+ async function checkTargetGroup(client, arn) {
54
+ const { resourceId, raw } = arn;
55
+ try {
56
+ const response = await client.send(
57
+ new DescribeTargetGroupsCommand({ TargetGroupArns: [raw] })
58
+ );
59
+ const targetGroup = response.TargetGroups?.[0];
60
+ const exists = !!targetGroup;
61
+ return {
62
+ arn: raw,
63
+ exists,
64
+ service: "elasticloadbalancing",
65
+ resourceType: "targetgroup",
66
+ resourceId
67
+ };
68
+ } catch (error) {
69
+ const err = error;
70
+ if (err.name === "TargetGroupNotFoundException") {
71
+ return {
72
+ arn: raw,
73
+ exists: false,
74
+ service: "elasticloadbalancing",
75
+ resourceType: "targetgroup",
76
+ resourceId
77
+ };
78
+ }
79
+ return {
80
+ arn: raw,
81
+ exists: false,
82
+ error: err.message || "Unknown error",
83
+ service: "elasticloadbalancing",
84
+ resourceType: "targetgroup",
85
+ resourceId
86
+ };
87
+ }
88
+ }
89
+ async function checkListener(client, arn) {
90
+ const { resourceId, raw } = arn;
91
+ try {
92
+ const response = await client.send(
93
+ new DescribeListenersCommand({ ListenerArns: [raw] })
94
+ );
95
+ const listener = response.Listeners?.[0];
96
+ const exists = !!listener;
97
+ return {
98
+ arn: raw,
99
+ exists,
100
+ service: "elasticloadbalancing",
101
+ resourceType: "listener",
102
+ resourceId
103
+ };
104
+ } catch (error) {
105
+ const err = error;
106
+ if (err.name === "ListenerNotFoundException") {
107
+ return {
108
+ arn: raw,
109
+ exists: false,
110
+ service: "elasticloadbalancing",
111
+ resourceType: "listener",
112
+ resourceId
113
+ };
114
+ }
115
+ return {
116
+ arn: raw,
117
+ exists: false,
118
+ error: err.message || "Unknown error",
119
+ service: "elasticloadbalancing",
120
+ resourceType: "listener",
121
+ resourceId
122
+ };
123
+ }
124
+ }
125
+ var ELBChecker = {
126
+ async check(arn) {
127
+ const { resourceType, resourceId, region, raw } = arn;
128
+ const client = getClient(region);
129
+ switch (resourceType) {
130
+ case "loadbalancer":
131
+ return checkLoadBalancer(client, arn);
132
+ case "targetgroup":
133
+ return checkTargetGroup(client, arn);
134
+ case "listener":
135
+ return checkListener(client, arn);
136
+ default:
137
+ return {
138
+ arn: raw,
139
+ exists: false,
140
+ error: `Unsupported ELB resource type: ${resourceType}`,
141
+ service: "elasticloadbalancing",
142
+ resourceType,
143
+ resourceId
144
+ };
145
+ }
146
+ }
147
+ };
148
+ export {
149
+ ELBChecker
150
+ };
151
+ //# sourceMappingURL=elb-PEDLXW5R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infra/checkers/elb.ts"],"sourcesContent":["/**\n * Elastic Load Balancing v2 resource checker\n *\n * Supports:\n * - Load balancers (ALB, NLB, GLB)\n * - Target groups\n * - Listeners\n */\n\nimport {\n DescribeLoadBalancersCommand,\n DescribeTargetGroupsCommand,\n DescribeListenersCommand,\n ElasticLoadBalancingV2Client,\n} from \"@aws-sdk/client-elastic-load-balancing-v2\";\n\nimport type { ParsedArn, ResourceCheckResult } from \"../types.js\";\nimport type { ResourceChecker } from \"./types.js\";\n\n/**\n * Cache of ELBv2 clients by region\n */\nconst clientCache = new Map<string, ElasticLoadBalancingV2Client>();\n\n/**\n * Get or create an ELBv2 client for a region\n */\nfunction getClient(region: string): ElasticLoadBalancingV2Client {\n let client = clientCache.get(region);\n if (!client) {\n client = new ElasticLoadBalancingV2Client({ region });\n clientCache.set(region, client);\n }\n return client;\n}\n\n/**\n * Check if a load balancer exists\n */\nasync function checkLoadBalancer(\n client: ElasticLoadBalancingV2Client,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeLoadBalancersCommand({ LoadBalancerArns: [raw] })\n );\n\n const loadBalancer = response.LoadBalancers?.[0];\n const exists =\n !!loadBalancer &&\n loadBalancer.State?.Code !== \"failed\" &&\n loadBalancer.State?.Code !== \"active_impaired\";\n\n return {\n arn: raw,\n exists,\n service: \"elasticloadbalancing\",\n resourceType: \"loadbalancer\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"LoadBalancerNotFoundException\") {\n return {\n arn: raw,\n exists: false,\n service: \"elasticloadbalancing\",\n resourceType: \"loadbalancer\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"elasticloadbalancing\",\n resourceType: \"loadbalancer\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if a target group exists\n */\nasync function checkTargetGroup(\n client: ElasticLoadBalancingV2Client,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeTargetGroupsCommand({ TargetGroupArns: [raw] })\n );\n\n const targetGroup = response.TargetGroups?.[0];\n const exists = !!targetGroup;\n\n return {\n arn: raw,\n exists,\n service: \"elasticloadbalancing\",\n resourceType: \"targetgroup\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"TargetGroupNotFoundException\") {\n return {\n arn: raw,\n exists: false,\n service: \"elasticloadbalancing\",\n resourceType: \"targetgroup\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"elasticloadbalancing\",\n resourceType: \"targetgroup\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if a listener exists\n */\nasync function checkListener(\n client: ElasticLoadBalancingV2Client,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeListenersCommand({ ListenerArns: [raw] })\n );\n\n const listener = response.Listeners?.[0];\n const exists = !!listener;\n\n return {\n arn: raw,\n exists,\n service: \"elasticloadbalancing\",\n resourceType: \"listener\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"ListenerNotFoundException\") {\n return {\n arn: raw,\n exists: false,\n service: \"elasticloadbalancing\",\n resourceType: \"listener\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"elasticloadbalancing\",\n resourceType: \"listener\",\n resourceId,\n };\n }\n}\n\n/**\n * Elastic Load Balancing resource checker\n */\nexport const ELBChecker: ResourceChecker = {\n async check(arn: ParsedArn): Promise<ResourceCheckResult> {\n const { resourceType, resourceId, region, raw } = arn;\n const client = getClient(region);\n\n switch (resourceType) {\n case \"loadbalancer\":\n return checkLoadBalancer(client, arn);\n\n case \"targetgroup\":\n return checkTargetGroup(client, arn);\n\n case \"listener\":\n return checkListener(client, arn);\n\n default:\n return {\n arn: raw,\n exists: false,\n error: `Unsupported ELB resource type: ${resourceType}`,\n service: \"elasticloadbalancing\",\n resourceType,\n resourceId,\n };\n }\n },\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,28 @@
1
+ import {
2
+ DEFAULT_MANIFEST_NAME,
3
+ generateManifestFromFile,
4
+ generateManifestFromStdin,
5
+ generateMultiAccountFromFile,
6
+ generateMultiAccountFromStdin,
7
+ generateWithMerge,
8
+ mergeIntoManifest,
9
+ parseStackExport,
10
+ parseStackExportMultiAccount,
11
+ readExistingManifest,
12
+ writeManifest
13
+ } from "./chunk-J5S6GRGW.js";
14
+ import "./chunk-M7G73Q6P.js";
15
+ export {
16
+ DEFAULT_MANIFEST_NAME,
17
+ generateManifestFromFile,
18
+ generateManifestFromStdin,
19
+ generateMultiAccountFromFile,
20
+ generateMultiAccountFromStdin,
21
+ generateWithMerge,
22
+ mergeIntoManifest,
23
+ parseStackExport,
24
+ parseStackExportMultiAccount,
25
+ readExistingManifest,
26
+ writeManifest
27
+ };
28
+ //# sourceMappingURL=generate-D4MFMOHP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,96 @@
1
+ // src/infra/checkers/iam.ts
2
+ import { GetPolicyCommand, GetRoleCommand, IAMClient } from "@aws-sdk/client-iam";
3
+ var client = null;
4
+ function getClient() {
5
+ client ??= new IAMClient({ region: "us-east-1" });
6
+ return client;
7
+ }
8
+ var IAMChecker = {
9
+ async check(arn) {
10
+ const { resourceType, resourceId, raw } = arn;
11
+ switch (resourceType) {
12
+ case "role":
13
+ return checkRole(resourceId, raw);
14
+ case "policy":
15
+ return checkPolicy(raw);
16
+ default:
17
+ return {
18
+ arn: raw,
19
+ exists: false,
20
+ error: `Unsupported IAM resource type: ${resourceType}`,
21
+ service: "iam",
22
+ resourceType,
23
+ resourceId
24
+ };
25
+ }
26
+ }
27
+ };
28
+ async function checkRole(roleName, arn) {
29
+ const iamClient = getClient();
30
+ try {
31
+ await iamClient.send(new GetRoleCommand({ RoleName: roleName }));
32
+ return {
33
+ arn,
34
+ exists: true,
35
+ service: "iam",
36
+ resourceType: "role",
37
+ resourceId: roleName
38
+ };
39
+ } catch (error) {
40
+ const err = error;
41
+ if (err.name === "NoSuchEntityException") {
42
+ return {
43
+ arn,
44
+ exists: false,
45
+ service: "iam",
46
+ resourceType: "role",
47
+ resourceId: roleName
48
+ };
49
+ }
50
+ return {
51
+ arn,
52
+ exists: false,
53
+ error: err.message || "Unknown error",
54
+ service: "iam",
55
+ resourceType: "role",
56
+ resourceId: roleName
57
+ };
58
+ }
59
+ }
60
+ async function checkPolicy(policyArn) {
61
+ const iamClient = getClient();
62
+ const policyName = policyArn.split("/").pop() ?? policyArn;
63
+ try {
64
+ await iamClient.send(new GetPolicyCommand({ PolicyArn: policyArn }));
65
+ return {
66
+ arn: policyArn,
67
+ exists: true,
68
+ service: "iam",
69
+ resourceType: "policy",
70
+ resourceId: policyName
71
+ };
72
+ } catch (error) {
73
+ const err = error;
74
+ if (err.name === "NoSuchEntityException") {
75
+ return {
76
+ arn: policyArn,
77
+ exists: false,
78
+ service: "iam",
79
+ resourceType: "policy",
80
+ resourceId: policyName
81
+ };
82
+ }
83
+ return {
84
+ arn: policyArn,
85
+ exists: false,
86
+ error: err.message || "Unknown error",
87
+ service: "iam",
88
+ resourceType: "policy",
89
+ resourceId: policyName
90
+ };
91
+ }
92
+ }
93
+ export {
94
+ IAMChecker
95
+ };
96
+ //# sourceMappingURL=iam-7H5HFWVQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infra/checkers/iam.ts"],"sourcesContent":["/**\n * IAM resource checker\n */\n\nimport { GetPolicyCommand, GetRoleCommand, IAMClient } from \"@aws-sdk/client-iam\";\n\nimport type { ParsedArn, ResourceCheckResult } from \"../types.js\";\nimport type { ResourceChecker } from \"./types.js\";\n\n/**\n * IAM is global, so we only need one client\n */\nlet client: IAMClient | null = null;\n\n/**\n * Get or create the IAM client\n */\nfunction getClient(): IAMClient {\n // IAM is global, use us-east-1\n client ??= new IAMClient({ region: \"us-east-1\" });\n return client;\n}\n\n/**\n * IAM resource checker (roles and policies)\n */\nexport const IAMChecker: ResourceChecker = {\n async check(arn: ParsedArn): Promise<ResourceCheckResult> {\n const { resourceType, resourceId, raw } = arn;\n\n switch (resourceType) {\n case \"role\":\n return checkRole(resourceId, raw);\n case \"policy\":\n return checkPolicy(raw);\n default:\n return {\n arn: raw,\n exists: false,\n error: `Unsupported IAM resource type: ${resourceType}`,\n service: \"iam\",\n resourceType,\n resourceId,\n };\n }\n },\n};\n\n/**\n * Check if an IAM role exists\n */\nasync function checkRole(roleName: string, arn: string): Promise<ResourceCheckResult> {\n const iamClient = getClient();\n\n try {\n await iamClient.send(new GetRoleCommand({ RoleName: roleName }));\n return {\n arn,\n exists: true,\n service: \"iam\",\n resourceType: \"role\",\n resourceId: roleName,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"NoSuchEntityException\") {\n return {\n arn,\n exists: false,\n service: \"iam\",\n resourceType: \"role\",\n resourceId: roleName,\n };\n }\n\n return {\n arn,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"iam\",\n resourceType: \"role\",\n resourceId: roleName,\n };\n }\n}\n\n/**\n * Check if an IAM policy exists\n */\nasync function checkPolicy(policyArn: string): Promise<ResourceCheckResult> {\n const iamClient = getClient();\n\n // Extract policy name from ARN for display\n const policyName = policyArn.split(\"/\").pop() ?? policyArn;\n\n try {\n await iamClient.send(new GetPolicyCommand({ PolicyArn: policyArn }));\n return {\n arn: policyArn,\n exists: true,\n service: \"iam\",\n resourceType: \"policy\",\n resourceId: policyName,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"NoSuchEntityException\") {\n return {\n arn: policyArn,\n exists: false,\n service: \"iam\",\n resourceType: \"policy\",\n resourceId: policyName,\n };\n }\n\n return {\n arn: policyArn,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"iam\",\n resourceType: \"policy\",\n resourceId: policyName,\n };\n }\n}\n"],"mappings":";AAIA,SAAS,kBAAkB,gBAAgB,iBAAiB;AAQ5D,IAAI,SAA2B;AAK/B,SAAS,YAAuB;AAE9B,aAAW,IAAI,UAAU,EAAE,QAAQ,YAAY,CAAC;AAChD,SAAO;AACT;AAKO,IAAM,aAA8B;AAAA,EACzC,MAAM,MAAM,KAA8C;AACxD,UAAM,EAAE,cAAc,YAAY,IAAI,IAAI;AAE1C,YAAQ,cAAc;AAAA,MACpB,KAAK;AACH,eAAO,UAAU,YAAY,GAAG;AAAA,MAClC,KAAK;AACH,eAAO,YAAY,GAAG;AAAA,MACxB;AACE,eAAO;AAAA,UACL,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,OAAO,kCAAkC,YAAY;AAAA,UACrD,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AACF;AAKA,eAAe,UAAU,UAAkB,KAA2C;AACpF,QAAM,YAAY,UAAU;AAE5B,MAAI;AACF,UAAM,UAAU,KAAK,IAAI,eAAe,EAAE,UAAU,SAAS,CAAC,CAAC;AAC/D,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAM;AAEZ,QAAI,IAAI,SAAS,yBAAyB;AACxC,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,IAAI,WAAW;AAAA,MACtB,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAKA,eAAe,YAAY,WAAiD;AAC1E,QAAM,YAAY,UAAU;AAG5B,QAAM,aAAa,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK;AAEjD,MAAI;AACF,UAAM,UAAU,KAAK,IAAI,iBAAiB,EAAE,WAAW,UAAU,CAAC,CAAC;AACnE,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAM;AAEZ,QAAI,IAAI,SAAS,yBAAyB;AACxC,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,WAAW;AAAA,MACtB,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,39 @@
1
+ // src/infra/checkers/gcp/iam.ts
2
+ import { GoogleAuth } from "google-auth-library";
3
+ var auth = null;
4
+ function getAuth() {
5
+ auth ??= new GoogleAuth({ scopes: ["https://www.googleapis.com/auth/cloud-platform"] });
6
+ return auth;
7
+ }
8
+ function result(raw, resourceId, exists, error) {
9
+ return {
10
+ arn: raw,
11
+ exists,
12
+ error,
13
+ service: "iam",
14
+ resourceType: "serviceAccounts",
15
+ resourceId
16
+ };
17
+ }
18
+ var ServiceAccountChecker = {
19
+ async check(resource) {
20
+ const { project, resourceId, raw } = resource;
21
+ const url = `https://iam.googleapis.com/v1/projects/${project}/serviceAccounts/${resourceId}`;
22
+ try {
23
+ const authClient = getAuth();
24
+ const client = await authClient.getClient();
25
+ await client.request({ url, method: "GET" });
26
+ return result(raw, resourceId, true);
27
+ } catch (error) {
28
+ const err = error;
29
+ if (err.response?.status === 404 || err.code === 404 || err.message?.includes("NOT_FOUND")) {
30
+ return result(raw, resourceId, false);
31
+ }
32
+ return result(raw, resourceId, false, err.message ?? "Unknown error");
33
+ }
34
+ }
35
+ };
36
+ export {
37
+ ServiceAccountChecker
38
+ };
39
+ //# sourceMappingURL=iam-DJI64AGK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infra/checkers/gcp/iam.ts"],"sourcesContent":["/**\n * GCP IAM Service Account resource checker\n */\n\nimport { GoogleAuth } from \"google-auth-library\";\n\nimport type { ParsedGcpResource, ResourceCheckResult } from \"../../types.js\";\nimport type { GcpResourceChecker } from \"../types.js\";\n\nlet auth: GoogleAuth | null = null;\n\nfunction getAuth(): GoogleAuth {\n auth ??= new GoogleAuth({ scopes: [\"https://www.googleapis.com/auth/cloud-platform\"] });\n return auth;\n}\n\nfunction result(\n raw: string,\n resourceId: string,\n exists: boolean,\n error?: string\n): ResourceCheckResult {\n return {\n arn: raw,\n exists,\n error,\n service: \"iam\",\n resourceType: \"serviceAccounts\",\n resourceId,\n };\n}\n\nexport const ServiceAccountChecker: GcpResourceChecker = {\n async check(resource: ParsedGcpResource): Promise<ResourceCheckResult> {\n const { project, resourceId, raw } = resource;\n const url = `https://iam.googleapis.com/v1/projects/${project}/serviceAccounts/${resourceId}`;\n\n try {\n const authClient = getAuth();\n const client = await authClient.getClient();\n await client.request({ url, method: \"GET\" });\n return result(raw, resourceId, true);\n } catch (error) {\n const err = error as { code?: number; message?: string; response?: { status?: number } };\n if (err.response?.status === 404 || err.code === 404 || err.message?.includes(\"NOT_FOUND\")) {\n return result(raw, resourceId, false);\n }\n return result(raw, resourceId, false, err.message ?? \"Unknown error\");\n }\n },\n};\n"],"mappings":";AAIA,SAAS,kBAAkB;AAK3B,IAAI,OAA0B;AAE9B,SAAS,UAAsB;AAC7B,WAAS,IAAI,WAAW,EAAE,QAAQ,CAAC,gDAAgD,EAAE,CAAC;AACtF,SAAO;AACT;AAEA,SAAS,OACP,KACA,YACA,QACA,OACqB;AACrB,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,cAAc;AAAA,IACd;AAAA,EACF;AACF;AAEO,IAAM,wBAA4C;AAAA,EACvD,MAAM,MAAM,UAA2D;AACrE,UAAM,EAAE,SAAS,YAAY,IAAI,IAAI;AACrC,UAAM,MAAM,0CAA0C,OAAO,oBAAoB,UAAU;AAE3F,QAAI;AACF,YAAM,aAAa,QAAQ;AAC3B,YAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,YAAM,OAAO,QAAQ,EAAE,KAAK,QAAQ,MAAM,CAAC;AAC3C,aAAO,OAAO,KAAK,YAAY,IAAI;AAAA,IACrC,SAAS,OAAO;AACd,YAAM,MAAM;AACZ,UAAI,IAAI,UAAU,WAAW,OAAO,IAAI,SAAS,OAAO,IAAI,SAAS,SAAS,WAAW,GAAG;AAC1F,eAAO,OAAO,KAAK,YAAY,KAAK;AAAA,MACtC;AACA,aAAO,OAAO,KAAK,YAAY,OAAO,IAAI,WAAW,eAAe;AAAA,IACtE;AAAA,EACF;AACF;","names":[]}