@standards-kit/conform 0.1.3 → 0.3.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 (90) hide show
  1. package/dist/{chunk-PZ2NVKI7.js → chunk-FJZMUGYW.js} +30 -13
  2. package/dist/chunk-FJZMUGYW.js.map +1 -0
  3. package/dist/chunk-O745CMWG.js +29 -0
  4. package/dist/chunk-O745CMWG.js.map +1 -0
  5. package/dist/chunk-RHM53NLG.js +49 -0
  6. package/dist/chunk-RHM53NLG.js.map +1 -0
  7. package/dist/{chunk-RXA4FO7L.js → chunk-YKKWXHYS.js} +13 -9
  8. package/dist/chunk-YKKWXHYS.js.map +1 -0
  9. package/dist/cli/index.d.ts +3 -0
  10. package/dist/cli/process.d.ts +2 -0
  11. package/dist/cli/utils.d.ts +19 -0
  12. package/dist/cli/validate.d.ts +2 -0
  13. package/dist/cli.js +3905 -3875
  14. package/dist/cli.js.map +1 -1
  15. package/dist/{cloudwatch-KSZ4A256.js → cloudwatch-3LTDYG6G.js} +6 -10
  16. package/dist/cloudwatch-3LTDYG6G.js.map +1 -0
  17. package/dist/constants.d.ts +69 -0
  18. package/dist/core/schema.d.ts +170 -1684
  19. package/dist/{core-KB2W6SE2.js → core-LFX2BFLG.js} +3 -2
  20. package/dist/{dynamodb-5KVESCVJ.js → dynamodb-HQH3IMAI.js} +6 -10
  21. package/dist/dynamodb-HQH3IMAI.js.map +1 -0
  22. package/dist/{ec2-HKPE6GZV.js → ec2-AEPT735A.js} +6 -10
  23. package/dist/ec2-AEPT735A.js.map +1 -0
  24. package/dist/{ecs-OS3NJZTA.js → ecs-UHKCH5A7.js} +6 -10
  25. package/dist/ecs-UHKCH5A7.js.map +1 -0
  26. package/dist/{elasticache-7TCRHYYM.js → elasticache-5Y6K7GKJ.js} +6 -10
  27. package/dist/elasticache-5Y6K7GKJ.js.map +1 -0
  28. package/dist/{elb-PEDLXW5R.js → elb-CN6ELVM5.js} +6 -10
  29. package/dist/elb-CN6ELVM5.js.map +1 -0
  30. package/dist/{iam-7H5HFWVQ.js → iam-YXMHK2MV.js} +6 -2
  31. package/dist/iam-YXMHK2MV.js.map +1 -0
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.js +93 -121
  34. package/dist/index.js.map +1 -1
  35. package/dist/infra/checkers/client-factory.d.ts +45 -0
  36. package/dist/infra/schemas.d.ts +41 -533
  37. package/dist/{infra-ZQRXX7AW.js → infra-RFEWGWPW.js} +20 -18
  38. package/dist/{infra-ZQRXX7AW.js.map → infra-RFEWGWPW.js.map} +1 -1
  39. package/dist/{lambda-NFB5UILT.js → lambda-YTJOCYV5.js} +6 -10
  40. package/dist/lambda-YTJOCYV5.js.map +1 -0
  41. package/dist/mcp/standards/parser.d.ts +2 -14
  42. package/dist/{mcp-WXYRFNEV.js → mcp-T2JFU4E2.js} +4 -3
  43. package/dist/{mcp-WXYRFNEV.js.map → mcp-T2JFU4E2.js.map} +1 -1
  44. package/dist/projects/tier-loader.d.ts +10 -3
  45. package/dist/projects/types.d.ts +4 -4
  46. package/dist/{rds-KLG5O5SI.js → rds-GZ5RVPIU.js} +6 -10
  47. package/dist/rds-GZ5RVPIU.js.map +1 -0
  48. package/dist/{registry-7CDIMOLZ.js → registry-J2LVW3M2.js} +3 -2
  49. package/dist/{s3-2DH7PRVR.js → s3-53UELUWT.js} +16 -12
  50. package/dist/s3-53UELUWT.js.map +1 -0
  51. package/dist/s3-S4GXNR7H.js +53 -0
  52. package/dist/s3-S4GXNR7H.js.map +1 -0
  53. package/dist/{scan-IKEHLZXV.js → scan-BZH5IR3Z.js} +4 -3
  54. package/dist/scan-BZH5IR3Z.js.map +1 -0
  55. package/dist/{secretsmanager-MOOIHLAO.js → secretsmanager-FJKTPIXI.js} +6 -10
  56. package/dist/secretsmanager-FJKTPIXI.js.map +1 -0
  57. package/dist/{sns-Y36LVTWA.js → sns-RV64OMK2.js} +6 -10
  58. package/dist/sns-RV64OMK2.js.map +1 -0
  59. package/dist/{sqs-RRS3GRHK.js → sqs-MHBW6UFC.js} +6 -10
  60. package/dist/sqs-MHBW6UFC.js.map +1 -0
  61. package/dist/{standards-RXK5G4IG.js → standards-ALMA4VIU.js} +3 -2
  62. package/dist/{sync-XV6XBLVZ.js → sync-EGJ2CSYK.js} +3 -2
  63. package/dist/sync-EGJ2CSYK.js.map +1 -0
  64. package/dist/validate/index.d.ts +1 -1
  65. package/dist/validate/tier.d.ts +3 -0
  66. package/dist/validate/types.d.ts +3 -9
  67. package/dist/{validate-DKEJICCK.js → validate-X4K2SHYT.js} +53 -84
  68. package/dist/validate-X4K2SHYT.js.map +1 -0
  69. package/package.json +10 -16
  70. package/dist/chunk-PZ2NVKI7.js.map +0 -1
  71. package/dist/chunk-RXA4FO7L.js.map +0 -1
  72. package/dist/cloudwatch-KSZ4A256.js.map +0 -1
  73. package/dist/dynamodb-5KVESCVJ.js.map +0 -1
  74. package/dist/ec2-HKPE6GZV.js.map +0 -1
  75. package/dist/ecs-OS3NJZTA.js.map +0 -1
  76. package/dist/elasticache-7TCRHYYM.js.map +0 -1
  77. package/dist/elb-PEDLXW5R.js.map +0 -1
  78. package/dist/iam-7H5HFWVQ.js.map +0 -1
  79. package/dist/lambda-NFB5UILT.js.map +0 -1
  80. package/dist/rds-KLG5O5SI.js.map +0 -1
  81. package/dist/s3-2DH7PRVR.js.map +0 -1
  82. package/dist/scan-IKEHLZXV.js.map +0 -1
  83. package/dist/secretsmanager-MOOIHLAO.js.map +0 -1
  84. package/dist/sns-Y36LVTWA.js.map +0 -1
  85. package/dist/sqs-RRS3GRHK.js.map +0 -1
  86. package/dist/sync-XV6XBLVZ.js.map +0 -1
  87. package/dist/validate-DKEJICCK.js.map +0 -1
  88. /package/dist/{core-KB2W6SE2.js.map → core-LFX2BFLG.js.map} +0 -0
  89. /package/dist/{registry-7CDIMOLZ.js.map → registry-J2LVW3M2.js.map} +0 -0
  90. /package/dist/{standards-RXK5G4IG.js.map → standards-ALMA4VIU.js.map} +0 -0
@@ -20,7 +20,8 @@ import {
20
20
  mergeConfigs,
21
21
  parseRegistryUrl,
22
22
  resolveExtends
23
- } from "./chunk-PZ2NVKI7.js";
23
+ } from "./chunk-FJZMUGYW.js";
24
+ import "./chunk-RHM53NLG.js";
24
25
  export {
25
26
  CONFIG_FILE_NAME,
26
27
  CheckResultBuilder,
@@ -42,4 +43,4 @@ export {
42
43
  parseRegistryUrl,
43
44
  resolveExtends
44
45
  };
45
- //# sourceMappingURL=core-KB2W6SE2.js.map
46
+ //# sourceMappingURL=core-LFX2BFLG.js.map
@@ -1,14 +1,10 @@
1
+ import {
2
+ createClientFactory
3
+ } from "./chunk-O745CMWG.js";
4
+
1
5
  // src/infra/checkers/dynamodb.ts
2
6
  import { DescribeTableCommand, DynamoDBClient } from "@aws-sdk/client-dynamodb";
3
- var clientCache = /* @__PURE__ */ new Map();
4
- function getClient(region) {
5
- let client = clientCache.get(region);
6
- if (!client) {
7
- client = new DynamoDBClient({ region });
8
- clientCache.set(region, client);
9
- }
10
- return client;
11
- }
7
+ var getClient = createClientFactory(DynamoDBClient);
12
8
  var DynamoDBChecker = {
13
9
  async check(arn) {
14
10
  const { resourceType, resourceId, region, raw } = arn;
@@ -48,4 +44,4 @@ var DynamoDBChecker = {
48
44
  export {
49
45
  DynamoDBChecker
50
46
  };
51
- //# sourceMappingURL=dynamodb-5KVESCVJ.js.map
47
+ //# sourceMappingURL=dynamodb-HQH3IMAI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infra/checkers/dynamodb.ts"],"sourcesContent":["/**\n * DynamoDB resource checker\n */\n\nimport { DescribeTableCommand, DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\n\nimport type { ParsedArn, ResourceCheckResult } from \"../types.js\";\nimport { createClientFactory } from \"./client-factory.js\";\nimport type { ResourceChecker } from \"./types.js\";\n\n/**\n * Get or create a DynamoDB client for a region\n */\nconst getClient = createClientFactory(DynamoDBClient);\n\n/**\n * DynamoDB table checker\n */\nexport const DynamoDBChecker: ResourceChecker = {\n async check(arn: ParsedArn): Promise<ResourceCheckResult> {\n const { resourceType, resourceId, region, raw } = arn;\n\n // Extract table name (might be \"table-name\" or \"table-name/index/index-name\")\n const tableName = resourceId.split(\"/\")[0];\n\n const client = getClient(region);\n\n try {\n await client.send(new DescribeTableCommand({ TableName: tableName }));\n return {\n arn: raw,\n exists: true,\n service: \"dynamodb\",\n resourceType,\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"ResourceNotFoundException\") {\n return {\n arn: raw,\n exists: false,\n service: \"dynamodb\",\n resourceType,\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"dynamodb\",\n resourceType,\n resourceId,\n };\n }\n },\n};\n"],"mappings":";;;;;AAIA,SAAS,sBAAsB,sBAAsB;AASrD,IAAM,YAAY,oBAAoB,cAAc;AAK7C,IAAM,kBAAmC;AAAA,EAC9C,MAAM,MAAM,KAA8C;AACxD,UAAM,EAAE,cAAc,YAAY,QAAQ,IAAI,IAAI;AAGlD,UAAM,YAAY,WAAW,MAAM,GAAG,EAAE,CAAC;AAEzC,UAAM,SAAS,UAAU,MAAM;AAE/B,QAAI;AACF,YAAM,OAAO,KAAK,IAAI,qBAAqB,EAAE,WAAW,UAAU,CAAC,CAAC;AACpE,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,MAAM;AAEZ,UAAI,IAAI,SAAS,6BAA6B;AAC5C,eAAO;AAAA,UACL,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,IAAI,WAAW;AAAA,QACtB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1,3 +1,7 @@
1
+ import {
2
+ createClientFactory
3
+ } from "./chunk-O745CMWG.js";
4
+
1
5
  // src/infra/checkers/ec2.ts
2
6
  import {
3
7
  DescribeInstancesCommand,
@@ -5,15 +9,7 @@ import {
5
9
  DescribeKeyPairsCommand,
6
10
  EC2Client
7
11
  } from "@aws-sdk/client-ec2";
8
- var clientCache = /* @__PURE__ */ new Map();
9
- function getClient(region) {
10
- let client = clientCache.get(region);
11
- if (!client) {
12
- client = new EC2Client({ region });
13
- clientCache.set(region, client);
14
- }
15
- return client;
16
- }
12
+ var getClient = createClientFactory(EC2Client);
17
13
  async function checkInstance(client, arn) {
18
14
  const { resourceId, raw } = arn;
19
15
  try {
@@ -148,4 +144,4 @@ var EC2Checker = {
148
144
  export {
149
145
  EC2Checker
150
146
  };
151
- //# sourceMappingURL=ec2-HKPE6GZV.js.map
147
+ //# sourceMappingURL=ec2-AEPT735A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infra/checkers/ec2.ts"],"sourcesContent":["/**\n * EC2 resource checker\n *\n * Supports:\n * - Instances\n * - Security groups\n * - Key pairs\n */\n\nimport {\n DescribeInstancesCommand,\n DescribeSecurityGroupsCommand,\n DescribeKeyPairsCommand,\n EC2Client,\n} from \"@aws-sdk/client-ec2\";\n\nimport type { ParsedArn, ResourceCheckResult } from \"../types.js\";\nimport { createClientFactory } from \"./client-factory.js\";\nimport type { ResourceChecker } from \"./types.js\";\n\n/**\n * Get or create an EC2 client for a region\n */\nconst getClient = createClientFactory(EC2Client);\n\n/**\n * Check if an EC2 instance exists\n */\nasync function checkInstance(\n client: EC2Client,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeInstancesCommand({ InstanceIds: [resourceId] })\n );\n\n const instance = response.Reservations?.[0]?.Instances?.[0];\n const exists = !!instance && instance.State?.Name !== \"terminated\";\n\n return {\n arn: raw,\n exists,\n service: \"ec2\",\n resourceType: \"instance\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"InvalidInstanceID.NotFound\") {\n return {\n arn: raw,\n exists: false,\n service: \"ec2\",\n resourceType: \"instance\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"ec2\",\n resourceType: \"instance\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if an EC2 security group exists\n */\nasync function checkSecurityGroup(\n client: EC2Client,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeSecurityGroupsCommand({ GroupIds: [resourceId] })\n );\n\n const securityGroup = response.SecurityGroups?.[0];\n const exists = !!securityGroup;\n\n return {\n arn: raw,\n exists,\n service: \"ec2\",\n resourceType: \"security-group\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"InvalidGroup.NotFound\") {\n return {\n arn: raw,\n exists: false,\n service: \"ec2\",\n resourceType: \"security-group\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"ec2\",\n resourceType: \"security-group\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if an EC2 key pair exists\n */\nasync function checkKeyPair(\n client: EC2Client,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeKeyPairsCommand({ KeyNames: [resourceId] })\n );\n\n const keyPair = response.KeyPairs?.[0];\n const exists = !!keyPair;\n\n return {\n arn: raw,\n exists,\n service: \"ec2\",\n resourceType: \"key-pair\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"InvalidKeyPair.NotFound\") {\n return {\n arn: raw,\n exists: false,\n service: \"ec2\",\n resourceType: \"key-pair\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"ec2\",\n resourceType: \"key-pair\",\n resourceId,\n };\n }\n}\n\n/**\n * EC2 resource checker\n */\nexport const EC2Checker: 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 \"instance\":\n return checkInstance(client, arn);\n\n case \"security-group\":\n return checkSecurityGroup(client, arn);\n\n case \"key-pair\":\n return checkKeyPair(client, arn);\n\n default:\n return {\n arn: raw,\n exists: false,\n error: `Unsupported EC2 resource type: ${resourceType}`,\n service: \"ec2\",\n resourceType,\n resourceId,\n };\n }\n },\n};\n"],"mappings":"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","names":[]}
@@ -1,3 +1,7 @@
1
+ import {
2
+ createClientFactory
3
+ } from "./chunk-O745CMWG.js";
4
+
1
5
  // src/infra/checkers/ecs.ts
2
6
  import {
3
7
  DescribeClustersCommand,
@@ -5,15 +9,7 @@ import {
5
9
  DescribeTaskDefinitionCommand,
6
10
  ECSClient
7
11
  } from "@aws-sdk/client-ecs";
8
- var clientCache = /* @__PURE__ */ new Map();
9
- function getClient(region) {
10
- let client = clientCache.get(region);
11
- if (!client) {
12
- client = new ECSClient({ region });
13
- clientCache.set(region, client);
14
- }
15
- return client;
16
- }
12
+ var getClient = createClientFactory(ECSClient);
17
13
  async function checkCluster(client, arn) {
18
14
  const { resourceId, raw } = arn;
19
15
  try {
@@ -138,4 +134,4 @@ var ECSChecker = {
138
134
  export {
139
135
  ECSChecker
140
136
  };
141
- //# sourceMappingURL=ecs-OS3NJZTA.js.map
137
+ //# sourceMappingURL=ecs-UHKCH5A7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infra/checkers/ecs.ts"],"sourcesContent":["/**\n * ECS resource checker\n *\n * Supports:\n * - Clusters\n * - Services\n * - Task definitions\n */\n\nimport {\n DescribeClustersCommand,\n DescribeServicesCommand,\n DescribeTaskDefinitionCommand,\n ECSClient,\n} from \"@aws-sdk/client-ecs\";\n\nimport type { ParsedArn, ResourceCheckResult } from \"../types.js\";\nimport { createClientFactory } from \"./client-factory.js\";\nimport type { ResourceChecker } from \"./types.js\";\n\n/**\n * Get or create an ECS client for a region\n */\nconst getClient = createClientFactory(ECSClient);\n\n/**\n * Check if an ECS cluster exists\n */\nasync function checkCluster(\n client: ECSClient,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeClustersCommand({ clusters: [raw] })\n );\n\n const cluster = response.clusters?.[0];\n const exists = cluster?.status === \"ACTIVE\";\n\n return {\n arn: raw,\n exists,\n service: \"ecs\",\n resourceType: \"cluster\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error;\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"ecs\",\n resourceType: \"cluster\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if an ECS service exists\n *\n * Service ARN format: arn:aws:ecs:region:account:service/cluster/service-name\n */\nasync function checkService(\n client: ECSClient,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw, accountId, region } = arn;\n\n // resourceId format: cluster-name/service-name\n const parts = resourceId.split(\"/\");\n if (parts.length < 2) {\n return {\n arn: raw,\n exists: false,\n error: \"Invalid service ARN format\",\n service: \"ecs\",\n resourceType: \"service\",\n resourceId,\n };\n }\n\n const clusterName = parts[0];\n const serviceName = parts[1];\n const clusterArn = `arn:aws:ecs:${region}:${accountId}:cluster/${clusterName}`;\n\n try {\n const response = await client.send(\n new DescribeServicesCommand({\n cluster: clusterArn,\n services: [serviceName],\n })\n );\n\n const service = response.services?.[0];\n const exists = service?.status === \"ACTIVE\";\n\n return {\n arn: raw,\n exists,\n service: \"ecs\",\n resourceType: \"service\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error;\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"ecs\",\n resourceType: \"service\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if an ECS task definition exists\n *\n * Task definition ARN format: arn:aws:ecs:region:account:task-definition/name:revision\n * or: arn:aws:ecs:region:account:task-definition/name (latest)\n */\nasync function checkTaskDefinition(\n client: ECSClient,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeTaskDefinitionCommand({ taskDefinition: raw })\n );\n\n const taskDef = response.taskDefinition;\n const exists = taskDef?.status === \"ACTIVE\";\n\n return {\n arn: raw,\n exists,\n service: \"ecs\",\n resourceType: \"task-definition\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error;\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"ecs\",\n resourceType: \"task-definition\",\n resourceId,\n };\n }\n}\n\n/**\n * ECS resource checker\n */\nexport const ECSChecker: 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 \"cluster\":\n return checkCluster(client, arn);\n\n case \"service\":\n return checkService(client, arn);\n\n case \"task-definition\":\n return checkTaskDefinition(client, arn);\n\n default:\n return {\n arn: raw,\n exists: false,\n error: `Unsupported ECS resource type: ${resourceType}`,\n service: \"ecs\",\n resourceType,\n resourceId,\n };\n }\n },\n};\n"],"mappings":"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","names":[]}
@@ -1,3 +1,7 @@
1
+ import {
2
+ createClientFactory
3
+ } from "./chunk-O745CMWG.js";
4
+
1
5
  // src/infra/checkers/elasticache.ts
2
6
  import {
3
7
  DescribeCacheClustersCommand,
@@ -5,15 +9,7 @@ import {
5
9
  DescribeReplicationGroupsCommand,
6
10
  ElastiCacheClient
7
11
  } from "@aws-sdk/client-elasticache";
8
- var clientCache = /* @__PURE__ */ new Map();
9
- function getClient(region) {
10
- let client = clientCache.get(region);
11
- if (!client) {
12
- client = new ElastiCacheClient({ region });
13
- clientCache.set(region, client);
14
- }
15
- return client;
16
- }
12
+ var getClient = createClientFactory(ElastiCacheClient);
17
13
  async function checkCacheCluster(client, arn) {
18
14
  const { resourceId, raw } = arn;
19
15
  try {
@@ -148,4 +144,4 @@ var ElastiCacheChecker = {
148
144
  export {
149
145
  ElastiCacheChecker
150
146
  };
151
- //# sourceMappingURL=elasticache-7TCRHYYM.js.map
147
+ //# sourceMappingURL=elasticache-5Y6K7GKJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infra/checkers/elasticache.ts"],"sourcesContent":["/**\n * ElastiCache resource checker\n *\n * Supports:\n * - Cache clusters\n * - Subnet groups\n * - Replication groups\n */\n\nimport {\n DescribeCacheClustersCommand,\n DescribeCacheSubnetGroupsCommand,\n DescribeReplicationGroupsCommand,\n ElastiCacheClient,\n} from \"@aws-sdk/client-elasticache\";\n\nimport type { ParsedArn, ResourceCheckResult } from \"../types.js\";\nimport { createClientFactory } from \"./client-factory.js\";\nimport type { ResourceChecker } from \"./types.js\";\n\n/**\n * Get or create an ElastiCache client for a region\n */\nconst getClient = createClientFactory(ElastiCacheClient);\n\n/**\n * Check if an ElastiCache cluster exists\n */\nasync function checkCacheCluster(\n client: ElastiCacheClient,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeCacheClustersCommand({ CacheClusterId: resourceId })\n );\n\n const cluster = response.CacheClusters?.[0];\n const exists = !!cluster && cluster.CacheClusterStatus !== \"deleting\";\n\n return {\n arn: raw,\n exists,\n service: \"elasticache\",\n resourceType: \"cluster\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"CacheClusterNotFoundFault\") {\n return {\n arn: raw,\n exists: false,\n service: \"elasticache\",\n resourceType: \"cluster\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"elasticache\",\n resourceType: \"cluster\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if an ElastiCache subnet group exists\n */\nasync function checkSubnetGroup(\n client: ElastiCacheClient,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeCacheSubnetGroupsCommand({ CacheSubnetGroupName: resourceId })\n );\n\n const subnetGroup = response.CacheSubnetGroups?.[0];\n const exists = !!subnetGroup;\n\n return {\n arn: raw,\n exists,\n service: \"elasticache\",\n resourceType: \"subnetgroup\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"CacheSubnetGroupNotFoundFault\") {\n return {\n arn: raw,\n exists: false,\n service: \"elasticache\",\n resourceType: \"subnetgroup\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"elasticache\",\n resourceType: \"subnetgroup\",\n resourceId,\n };\n }\n}\n\n/**\n * Check if an ElastiCache replication group exists\n */\nasync function checkReplicationGroup(\n client: ElastiCacheClient,\n arn: ParsedArn\n): Promise<ResourceCheckResult> {\n const { resourceId, raw } = arn;\n\n try {\n const response = await client.send(\n new DescribeReplicationGroupsCommand({ ReplicationGroupId: resourceId })\n );\n\n const replicationGroup = response.ReplicationGroups?.[0];\n const exists = !!replicationGroup && replicationGroup.Status !== \"deleting\";\n\n return {\n arn: raw,\n exists,\n service: \"elasticache\",\n resourceType: \"replicationgroup\",\n resourceId,\n };\n } catch (error) {\n const err = error as Error & { name?: string };\n\n if (err.name === \"ReplicationGroupNotFoundFault\") {\n return {\n arn: raw,\n exists: false,\n service: \"elasticache\",\n resourceType: \"replicationgroup\",\n resourceId,\n };\n }\n\n return {\n arn: raw,\n exists: false,\n error: err.message || \"Unknown error\",\n service: \"elasticache\",\n resourceType: \"replicationgroup\",\n resourceId,\n };\n }\n}\n\n/**\n * ElastiCache resource checker\n */\nexport const ElastiCacheChecker: 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 \"cluster\":\n return checkCacheCluster(client, arn);\n\n case \"subnetgroup\":\n return checkSubnetGroup(client, arn);\n\n case \"replicationgroup\":\n return checkReplicationGroup(client, arn);\n\n default:\n return {\n arn: raw,\n exists: false,\n error: `Unsupported ElastiCache resource type: ${resourceType}`,\n service: \"elasticache\",\n resourceType,\n resourceId,\n };\n }\n },\n};\n"],"mappings":";;;;;AASA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,IAAM,YAAY,oBAAoB,iBAAiB;AAKvD,eAAe,kBACb,QACA,KAC8B;AAC9B,QAAM,EAAE,YAAY,IAAI,IAAI;AAE5B,MAAI;AACF,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B,IAAI,6BAA6B,EAAE,gBAAgB,WAAW,CAAC;AAAA,IACjE;AAEA,UAAM,UAAU,SAAS,gBAAgB,CAAC;AAC1C,UAAM,SAAS,CAAC,CAAC,WAAW,QAAQ,uBAAuB;AAE3D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAM;AAEZ,QAAI,IAAI,SAAS,6BAA6B;AAC5C,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,WAAW;AAAA,MACtB,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAe,iBACb,QACA,KAC8B;AAC9B,QAAM,EAAE,YAAY,IAAI,IAAI;AAE5B,MAAI;AACF,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B,IAAI,iCAAiC,EAAE,sBAAsB,WAAW,CAAC;AAAA,IAC3E;AAEA,UAAM,cAAc,SAAS,oBAAoB,CAAC;AAClD,UAAM,SAAS,CAAC,CAAC;AAEjB,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAM;AAEZ,QAAI,IAAI,SAAS,iCAAiC;AAChD,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,WAAW;AAAA,MACtB,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAe,sBACb,QACA,KAC8B;AAC9B,QAAM,EAAE,YAAY,IAAI,IAAI;AAE5B,MAAI;AACF,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B,IAAI,iCAAiC,EAAE,oBAAoB,WAAW,CAAC;AAAA,IACzE;AAEA,UAAM,mBAAmB,SAAS,oBAAoB,CAAC;AACvD,UAAM,SAAS,CAAC,CAAC,oBAAoB,iBAAiB,WAAW;AAEjE,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAM;AAEZ,QAAI,IAAI,SAAS,iCAAiC;AAChD,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,WAAW;AAAA,MACtB,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,qBAAsC;AAAA,EACjD,MAAM,MAAM,KAA8C;AACxD,UAAM,EAAE,cAAc,YAAY,QAAQ,IAAI,IAAI;AAClD,UAAM,SAAS,UAAU,MAAM;AAE/B,YAAQ,cAAc;AAAA,MACpB,KAAK;AACH,eAAO,kBAAkB,QAAQ,GAAG;AAAA,MAEtC,KAAK;AACH,eAAO,iBAAiB,QAAQ,GAAG;AAAA,MAErC,KAAK;AACH,eAAO,sBAAsB,QAAQ,GAAG;AAAA,MAE1C;AACE,eAAO;AAAA,UACL,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,OAAO,0CAA0C,YAAY;AAAA,UAC7D,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
@@ -1,3 +1,7 @@
1
+ import {
2
+ createClientFactory
3
+ } from "./chunk-O745CMWG.js";
4
+
1
5
  // src/infra/checkers/elb.ts
2
6
  import {
3
7
  DescribeLoadBalancersCommand,
@@ -5,15 +9,7 @@ import {
5
9
  DescribeListenersCommand,
6
10
  ElasticLoadBalancingV2Client
7
11
  } 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
- }
12
+ var getClient = createClientFactory(ElasticLoadBalancingV2Client);
17
13
  async function checkLoadBalancer(client, arn) {
18
14
  const { resourceId, raw } = arn;
19
15
  try {
@@ -148,4 +144,4 @@ var ELBChecker = {
148
144
  export {
149
145
  ELBChecker
150
146
  };
151
- //# sourceMappingURL=elb-PEDLXW5R.js.map
147
+ //# sourceMappingURL=elb-CN6ELVM5.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 { createClientFactory } from \"./client-factory.js\";\nimport type { ResourceChecker } from \"./types.js\";\n\n/**\n * Get or create an ELBv2 client for a region\n */\nconst getClient = createClientFactory(ElasticLoadBalancingV2Client);\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":[]}
@@ -1,8 +1,12 @@
1
+ import {
2
+ AWS_DEFAULTS
3
+ } from "./chunk-RHM53NLG.js";
4
+
1
5
  // src/infra/checkers/iam.ts
2
6
  import { GetPolicyCommand, GetRoleCommand, IAMClient } from "@aws-sdk/client-iam";
3
7
  var client = null;
4
8
  function getClient() {
5
- client ??= new IAMClient({ region: "us-east-1" });
9
+ client ??= new IAMClient({ region: AWS_DEFAULTS.globalRegion });
6
10
  return client;
7
11
  }
8
12
  var IAMChecker = {
@@ -93,4 +97,4 @@ async function checkPolicy(policyArn) {
93
97
  export {
94
98
  IAMChecker
95
99
  };
96
- //# sourceMappingURL=iam-7H5HFWVQ.js.map
100
+ //# sourceMappingURL=iam-YXMHK2MV.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 { AWS_DEFAULTS } from \"../../constants.js\";\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 the default global region\n client ??= new IAMClient({ region: AWS_DEFAULTS.globalRegion });\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;AAS5D,IAAI,SAA2B;AAK/B,SAAS,YAAuB;AAE9B,aAAW,IAAI,UAAU,EAAE,QAAQ,aAAa,aAAa,CAAC;AAC9D,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":[]}
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export { auditProcessConfig, BaseProcessToolRunner, HooksRunner, runProcessCheck
9
9
  export { type RemoteRepoInfo, type ScanOptions, scanRepository, type ScanResult, validateProcess, type ValidateProcessOptions, type ValidateProcessResult, } from "./process/scan/index.js";
10
10
  export { formatJson, formatOutput, formatText, type OutputFormat } from "./output/index.js";
11
11
  export { type DependenciesOptions, type DependenciesResult, getDependencies, } from "./dependencies/index.js";
12
- export { formatTierResultJson, formatTierResultText, type RepoMetadata, type Tier, type TierSourceDetail, VALID_TIERS, type ValidateTierOptions, type ValidateTierResult, validateTierRuleset, } from "./validate/index.js";
12
+ export { formatTierResultJson, formatTierResultText, type Tier, type TierSourceDetail, VALID_TIERS, type ValidateTierOptions, type ValidateTierResult, validateTierRuleset, } from "./validate/index.js";
13
13
  export { createServer as createMcpServer, startServer as startMcpServer, type Guideline, type GuidelineFrontmatter, type GuidelineListItem, type Ruleset, } from "./mcp/index.js";
14
14
  export type { AccountId, AccountScanResult, Arn, CloudProvider, GcpResourcePath, InfraScanResult, InfraScanSummary, LegacyManifest, Manifest, ManifestAccount, MultiAccountManifest, ParsedArn, ParsedGcpResource, PulumiResource, PulumiStackExport, ResourceCheckResult, ResourceIdentifier, ScanInfraOptions, GenerateManifestOptions, } from "./infra/index.js";
15
15
  export { ArnSchema, AccountIdSchema, AccountKeySchema, CloudProviderSchema, GcpResourcePathSchema, InfraScanResultSchema, InfraScanSummarySchema, LegacyManifestSchema, ManifestAccountSchema, ManifestSchema, MultiAccountManifestSchema, ParsedArnSchema, ParsedGcpResourceSchema, PulumiResourceSchema, PulumiStackExportSchema, ResourceCheckResultSchema, ResourceIdentifierSchema, } from "./infra/index.js";