@cloud-copilot/iam-simulate 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 (281) hide show
  1. package/LICENSE.txt +661 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/StatementAnalysis.d.ts +27 -0
  4. package/dist/cjs/StatementAnalysis.d.ts.map +1 -0
  5. package/dist/cjs/StatementAnalysis.js +3 -0
  6. package/dist/cjs/StatementAnalysis.js.map +1 -0
  7. package/dist/cjs/action/action.d.ts +27 -0
  8. package/dist/cjs/action/action.d.ts.map +1 -0
  9. package/dist/cjs/action/action.js +72 -0
  10. package/dist/cjs/action/action.js.map +1 -0
  11. package/dist/cjs/action.d.ts +4 -0
  12. package/dist/cjs/action.d.ts.map +1 -0
  13. package/dist/cjs/action.js +21 -0
  14. package/dist/cjs/action.js.map +1 -0
  15. package/dist/cjs/condition/BaseConditionOperator.d.ts +8 -0
  16. package/dist/cjs/condition/BaseConditionOperator.d.ts.map +1 -0
  17. package/dist/cjs/condition/BaseConditionOperator.js +3 -0
  18. package/dist/cjs/condition/BaseConditionOperator.js.map +1 -0
  19. package/dist/cjs/condition/arn/ArnEquals.d.ts +3 -0
  20. package/dist/cjs/condition/arn/ArnEquals.d.ts.map +1 -0
  21. package/dist/cjs/condition/arn/ArnEquals.js +11 -0
  22. package/dist/cjs/condition/arn/ArnEquals.js.map +1 -0
  23. package/dist/cjs/condition/arn/ArnLike.d.ts +3 -0
  24. package/dist/cjs/condition/arn/ArnLike.d.ts.map +1 -0
  25. package/dist/cjs/condition/arn/ArnLike.js +50 -0
  26. package/dist/cjs/condition/arn/ArnLike.js.map +1 -0
  27. package/dist/cjs/condition/arn/ArnNotEquals.d.ts +3 -0
  28. package/dist/cjs/condition/arn/ArnNotEquals.d.ts.map +1 -0
  29. package/dist/cjs/condition/arn/ArnNotEquals.js +11 -0
  30. package/dist/cjs/condition/arn/ArnNotEquals.js.map +1 -0
  31. package/dist/cjs/condition/arn/ArnNotLike.d.ts +3 -0
  32. package/dist/cjs/condition/arn/ArnNotLike.d.ts.map +1 -0
  33. package/dist/cjs/condition/arn/ArnNotLike.js +13 -0
  34. package/dist/cjs/condition/arn/ArnNotLike.js.map +1 -0
  35. package/dist/cjs/condition/baseConditionperatorTests.d.ts +12 -0
  36. package/dist/cjs/condition/baseConditionperatorTests.d.ts.map +1 -0
  37. package/dist/cjs/condition/baseConditionperatorTests.js +21 -0
  38. package/dist/cjs/condition/baseConditionperatorTests.js.map +1 -0
  39. package/dist/cjs/condition/binary/BinaryEquals.d.ts +7 -0
  40. package/dist/cjs/condition/binary/BinaryEquals.d.ts.map +1 -0
  41. package/dist/cjs/condition/binary/BinaryEquals.js +16 -0
  42. package/dist/cjs/condition/binary/BinaryEquals.js.map +1 -0
  43. package/dist/cjs/condition/boolean/Bool.d.ts +3 -0
  44. package/dist/cjs/condition/boolean/Bool.d.ts.map +1 -0
  45. package/dist/cjs/condition/boolean/Bool.js +20 -0
  46. package/dist/cjs/condition/boolean/Bool.js.map +1 -0
  47. package/dist/cjs/condition/condition.d.ts +6 -0
  48. package/dist/cjs/condition/condition.d.ts.map +1 -0
  49. package/dist/cjs/condition/condition.js +123 -0
  50. package/dist/cjs/condition/condition.js.map +1 -0
  51. package/dist/cjs/condition/date/DateEquals.d.ts +3 -0
  52. package/dist/cjs/condition/date/DateEquals.d.ts.map +1 -0
  53. package/dist/cjs/condition/date/DateEquals.js +17 -0
  54. package/dist/cjs/condition/date/DateEquals.js.map +1 -0
  55. package/dist/cjs/condition/date/DateGreaterThan.d.ts +3 -0
  56. package/dist/cjs/condition/date/DateGreaterThan.d.ts.map +1 -0
  57. package/dist/cjs/condition/date/DateGreaterThan.js +17 -0
  58. package/dist/cjs/condition/date/DateGreaterThan.js.map +1 -0
  59. package/dist/cjs/condition/date/DateGreaterThanEquals.d.ts +3 -0
  60. package/dist/cjs/condition/date/DateGreaterThanEquals.d.ts.map +1 -0
  61. package/dist/cjs/condition/date/DateGreaterThanEquals.js +17 -0
  62. package/dist/cjs/condition/date/DateGreaterThanEquals.js.map +1 -0
  63. package/dist/cjs/condition/date/DateLessThan.d.ts +3 -0
  64. package/dist/cjs/condition/date/DateLessThan.d.ts.map +1 -0
  65. package/dist/cjs/condition/date/DateLessThan.js +17 -0
  66. package/dist/cjs/condition/date/DateLessThan.js.map +1 -0
  67. package/dist/cjs/condition/date/DateLessThanEquals.d.ts +3 -0
  68. package/dist/cjs/condition/date/DateLessThanEquals.d.ts.map +1 -0
  69. package/dist/cjs/condition/date/DateLessThanEquals.js +17 -0
  70. package/dist/cjs/condition/date/DateLessThanEquals.js.map +1 -0
  71. package/dist/cjs/condition/date/DateNotEquals.d.ts +3 -0
  72. package/dist/cjs/condition/date/DateNotEquals.d.ts.map +1 -0
  73. package/dist/cjs/condition/date/DateNotEquals.js +29 -0
  74. package/dist/cjs/condition/date/DateNotEquals.js.map +1 -0
  75. package/dist/cjs/condition/date/date.d.ts +17 -0
  76. package/dist/cjs/condition/date/date.d.ts.map +1 -0
  77. package/dist/cjs/condition/date/date.js +42 -0
  78. package/dist/cjs/condition/date/date.js.map +1 -0
  79. package/dist/cjs/condition/ipaddress/IpAddress.d.ts +3 -0
  80. package/dist/cjs/condition/ipaddress/IpAddress.d.ts.map +1 -0
  81. package/dist/cjs/condition/ipaddress/IpAddress.js +27 -0
  82. package/dist/cjs/condition/ipaddress/IpAddress.js.map +1 -0
  83. package/dist/cjs/condition/ipaddress/NotIpAddress.d.ts +3 -0
  84. package/dist/cjs/condition/ipaddress/NotIpAddress.d.ts.map +1 -0
  85. package/dist/cjs/condition/ipaddress/NotIpAddress.js +31 -0
  86. package/dist/cjs/condition/ipaddress/NotIpAddress.js.map +1 -0
  87. package/dist/cjs/condition/ipaddress/ipv4.d.ts +24 -0
  88. package/dist/cjs/condition/ipaddress/ipv4.d.ts.map +1 -0
  89. package/dist/cjs/condition/ipaddress/ipv4.js +59 -0
  90. package/dist/cjs/condition/ipaddress/ipv4.js.map +1 -0
  91. package/dist/cjs/condition/ipaddress/ipv6.d.ts +24 -0
  92. package/dist/cjs/condition/ipaddress/ipv6.d.ts.map +1 -0
  93. package/dist/cjs/condition/ipaddress/ipv6.js +111 -0
  94. package/dist/cjs/condition/ipaddress/ipv6.js.map +1 -0
  95. package/dist/cjs/condition/numeric/NumericEquals.d.ts +3 -0
  96. package/dist/cjs/condition/numeric/NumericEquals.d.ts.map +1 -0
  97. package/dist/cjs/condition/numeric/NumericEquals.js +17 -0
  98. package/dist/cjs/condition/numeric/NumericEquals.js.map +1 -0
  99. package/dist/cjs/condition/numeric/NumericGreaterThan.d.ts +3 -0
  100. package/dist/cjs/condition/numeric/NumericGreaterThan.d.ts.map +1 -0
  101. package/dist/cjs/condition/numeric/NumericGreaterThan.js +17 -0
  102. package/dist/cjs/condition/numeric/NumericGreaterThan.js.map +1 -0
  103. package/dist/cjs/condition/numeric/NumericGreaterThanEquals.d.ts +3 -0
  104. package/dist/cjs/condition/numeric/NumericGreaterThanEquals.d.ts.map +1 -0
  105. package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js +17 -0
  106. package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js.map +1 -0
  107. package/dist/cjs/condition/numeric/NumericLessThan.d.ts +3 -0
  108. package/dist/cjs/condition/numeric/NumericLessThan.d.ts.map +1 -0
  109. package/dist/cjs/condition/numeric/NumericLessThan.js +17 -0
  110. package/dist/cjs/condition/numeric/NumericLessThan.js.map +1 -0
  111. package/dist/cjs/condition/numeric/NumericLessThanEquals.d.ts +3 -0
  112. package/dist/cjs/condition/numeric/NumericLessThanEquals.d.ts.map +1 -0
  113. package/dist/cjs/condition/numeric/NumericLessThanEquals.js +17 -0
  114. package/dist/cjs/condition/numeric/NumericLessThanEquals.js.map +1 -0
  115. package/dist/cjs/condition/numeric/NumericNotEquals.d.ts +3 -0
  116. package/dist/cjs/condition/numeric/NumericNotEquals.d.ts.map +1 -0
  117. package/dist/cjs/condition/numeric/NumericNotEquals.js +29 -0
  118. package/dist/cjs/condition/numeric/NumericNotEquals.js.map +1 -0
  119. package/dist/cjs/condition/numeric/numeric.d.ts +17 -0
  120. package/dist/cjs/condition/numeric/numeric.d.ts.map +1 -0
  121. package/dist/cjs/condition/numeric/numeric.js +41 -0
  122. package/dist/cjs/condition/numeric/numeric.js.map +1 -0
  123. package/dist/cjs/condition/string/StringEquals.d.ts +3 -0
  124. package/dist/cjs/condition/string/StringEquals.d.ts.map +1 -0
  125. package/dist/cjs/condition/string/StringEquals.js +14 -0
  126. package/dist/cjs/condition/string/StringEquals.js.map +1 -0
  127. package/dist/cjs/condition/string/StringEqualsIgnoreCase.d.ts +3 -0
  128. package/dist/cjs/condition/string/StringEqualsIgnoreCase.d.ts.map +1 -0
  129. package/dist/cjs/condition/string/StringEqualsIgnoreCase.js +17 -0
  130. package/dist/cjs/condition/string/StringEqualsIgnoreCase.js.map +1 -0
  131. package/dist/cjs/condition/string/StringLike.d.ts +3 -0
  132. package/dist/cjs/condition/string/StringLike.d.ts.map +1 -0
  133. package/dist/cjs/condition/string/StringLike.js +14 -0
  134. package/dist/cjs/condition/string/StringLike.js.map +1 -0
  135. package/dist/cjs/condition/string/StringNotEquals.d.ts +3 -0
  136. package/dist/cjs/condition/string/StringNotEquals.d.ts.map +1 -0
  137. package/dist/cjs/condition/string/StringNotEquals.js +14 -0
  138. package/dist/cjs/condition/string/StringNotEquals.js.map +1 -0
  139. package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.d.ts +3 -0
  140. package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.d.ts.map +1 -0
  141. package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js +13 -0
  142. package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js.map +1 -0
  143. package/dist/cjs/condition/string/StringNotLike.d.ts +3 -0
  144. package/dist/cjs/condition/string/StringNotLike.d.ts.map +1 -0
  145. package/dist/cjs/condition/string/StringNotLike.js +13 -0
  146. package/dist/cjs/condition/string/StringNotLike.js.map +1 -0
  147. package/dist/cjs/condition/strings/StringEquals.d.ts +3 -0
  148. package/dist/cjs/condition/strings/StringEquals.d.ts.map +1 -0
  149. package/dist/cjs/condition/strings/StringEquals.js +14 -0
  150. package/dist/cjs/condition/strings/StringEquals.js.map +1 -0
  151. package/dist/cjs/core_engine/coreSimulatorEngine.d.ts +44 -0
  152. package/dist/cjs/core_engine/coreSimulatorEngine.d.ts.map +1 -0
  153. package/dist/cjs/core_engine/coreSimulatorEngine.js +60 -0
  154. package/dist/cjs/core_engine/coreSimulatorEngine.js.map +1 -0
  155. package/dist/cjs/evaluate.d.ts +2 -0
  156. package/dist/cjs/evaluate.d.ts.map +1 -0
  157. package/dist/cjs/evaluate.js +3 -0
  158. package/dist/cjs/evaluate.js.map +1 -0
  159. package/dist/cjs/index.d.ts +1 -0
  160. package/dist/cjs/index.d.ts.map +1 -0
  161. package/dist/cjs/index.js +2 -0
  162. package/dist/cjs/index.js.map +1 -0
  163. package/dist/cjs/package.json +3 -0
  164. package/dist/cjs/principal/principal.d.ts +30 -0
  165. package/dist/cjs/principal/principal.d.ts.map +1 -0
  166. package/dist/cjs/principal/principal.js +107 -0
  167. package/dist/cjs/principal/principal.js.map +1 -0
  168. package/dist/cjs/request/request.d.ts +50 -0
  169. package/dist/cjs/request/request.d.ts.map +1 -0
  170. package/dist/cjs/request/request.js +41 -0
  171. package/dist/cjs/request/request.js.map +1 -0
  172. package/dist/cjs/request/requestAction.d.ts +27 -0
  173. package/dist/cjs/request/requestAction.d.ts.map +1 -0
  174. package/dist/cjs/request/requestAction.js +20 -0
  175. package/dist/cjs/request/requestAction.js.map +1 -0
  176. package/dist/cjs/request/requestPrincipal.d.ts +20 -0
  177. package/dist/cjs/request/requestPrincipal.d.ts.map +1 -0
  178. package/dist/cjs/request/requestPrincipal.js +17 -0
  179. package/dist/cjs/request/requestPrincipal.js.map +1 -0
  180. package/dist/cjs/request/requestResource.d.ts +37 -0
  181. package/dist/cjs/request/requestResource.d.ts.map +1 -0
  182. package/dist/cjs/request/requestResource.js +29 -0
  183. package/dist/cjs/request/requestResource.js.map +1 -0
  184. package/dist/cjs/request/requestSupplementalData.d.ts +19 -0
  185. package/dist/cjs/request/requestSupplementalData.d.ts.map +1 -0
  186. package/dist/cjs/request/requestSupplementalData.js +37 -0
  187. package/dist/cjs/request/requestSupplementalData.js.map +1 -0
  188. package/dist/cjs/request.d.ts +15 -0
  189. package/dist/cjs/request.d.ts.map +1 -0
  190. package/dist/cjs/request.js +17 -0
  191. package/dist/cjs/request.js.map +1 -0
  192. package/dist/cjs/requestContext.d.ts +63 -0
  193. package/dist/cjs/requestContext.d.ts.map +1 -0
  194. package/dist/cjs/requestContext.js +46 -0
  195. package/dist/cjs/requestContext.js.map +1 -0
  196. package/dist/cjs/resource/resource.d.ts +27 -0
  197. package/dist/cjs/resource/resource.d.ts.map +1 -0
  198. package/dist/cjs/resource/resource.js +100 -0
  199. package/dist/cjs/resource/resource.js.map +1 -0
  200. package/dist/cjs/services/DefaultServiceAuthorizer.d.ts +12 -0
  201. package/dist/cjs/services/DefaultServiceAuthorizer.d.ts.map +1 -0
  202. package/dist/cjs/services/DefaultServiceAuthorizer.js +79 -0
  203. package/dist/cjs/services/DefaultServiceAuthorizer.js.map +1 -0
  204. package/dist/cjs/services/ServiceAuthorizer.d.ts +11 -0
  205. package/dist/cjs/services/ServiceAuthorizer.d.ts.map +1 -0
  206. package/dist/cjs/services/ServiceAuthorizer.js +3 -0
  207. package/dist/cjs/services/ServiceAuthorizer.js.map +1 -0
  208. package/dist/cjs/util.d.ts +47 -0
  209. package/dist/cjs/util.d.ts.map +1 -0
  210. package/dist/cjs/util.js +180 -0
  211. package/dist/cjs/util.js.map +1 -0
  212. package/dist/esm/action/action.d.ts +19 -0
  213. package/dist/esm/action/action.d.ts.map +1 -0
  214. package/dist/esm/action/action.js +51 -0
  215. package/dist/esm/action/action.js.map +1 -0
  216. package/dist/esm/action.d.ts +4 -0
  217. package/dist/esm/action.d.ts.map +1 -0
  218. package/dist/esm/action.js +18 -0
  219. package/dist/esm/action.js.map +1 -0
  220. package/dist/esm/condition/BaseConditionOperator.d.ts +8 -0
  221. package/dist/esm/condition/BaseConditionOperator.d.ts.map +1 -0
  222. package/dist/esm/condition/BaseConditionOperator.js +2 -0
  223. package/dist/esm/condition/BaseConditionOperator.js.map +1 -0
  224. package/dist/esm/condition/condition.d.ts +5 -0
  225. package/dist/esm/condition/condition.d.ts.map +1 -0
  226. package/dist/esm/condition/condition.js +70 -0
  227. package/dist/esm/condition/condition.js.map +1 -0
  228. package/dist/esm/condition/strings/StringEquals.d.ts +3 -0
  229. package/dist/esm/condition/strings/StringEquals.d.ts.map +1 -0
  230. package/dist/esm/condition/strings/StringEquals.js +11 -0
  231. package/dist/esm/condition/strings/StringEquals.js.map +1 -0
  232. package/dist/esm/evaluate.d.ts +2 -0
  233. package/dist/esm/evaluate.d.ts.map +1 -0
  234. package/dist/esm/evaluate.js +2 -0
  235. package/dist/esm/evaluate.js.map +1 -0
  236. package/dist/esm/index.d.ts +1 -0
  237. package/dist/esm/index.d.ts.map +1 -0
  238. package/dist/esm/index.js +2 -0
  239. package/dist/esm/index.js.map +1 -0
  240. package/dist/esm/package.json +3 -0
  241. package/dist/esm/principal/principal.d.ts +31 -0
  242. package/dist/esm/principal/principal.d.ts.map +1 -0
  243. package/dist/esm/principal/principal.js +100 -0
  244. package/dist/esm/principal/principal.js.map +1 -0
  245. package/dist/esm/request/request.d.ts +52 -0
  246. package/dist/esm/request/request.d.ts.map +1 -0
  247. package/dist/esm/request/request.js +34 -0
  248. package/dist/esm/request/request.js.map +1 -0
  249. package/dist/esm/request/requestAction.d.ts +27 -0
  250. package/dist/esm/request/requestAction.d.ts.map +1 -0
  251. package/dist/esm/request/requestAction.js +15 -0
  252. package/dist/esm/request/requestAction.js.map +1 -0
  253. package/dist/esm/request/requestPrincipal.d.ts +20 -0
  254. package/dist/esm/request/requestPrincipal.d.ts.map +1 -0
  255. package/dist/esm/request/requestPrincipal.js +12 -0
  256. package/dist/esm/request/requestPrincipal.js.map +1 -0
  257. package/dist/esm/request/requestResource.d.ts +37 -0
  258. package/dist/esm/request/requestResource.d.ts.map +1 -0
  259. package/dist/esm/request/requestResource.js +24 -0
  260. package/dist/esm/request/requestResource.js.map +1 -0
  261. package/dist/esm/request/requestSupplementalData.d.ts +19 -0
  262. package/dist/esm/request/requestSupplementalData.d.ts.map +1 -0
  263. package/dist/esm/request/requestSupplementalData.js +30 -0
  264. package/dist/esm/request/requestSupplementalData.js.map +1 -0
  265. package/dist/esm/request.d.ts +15 -0
  266. package/dist/esm/request.d.ts.map +1 -0
  267. package/dist/esm/request.js +9 -0
  268. package/dist/esm/request.js.map +1 -0
  269. package/dist/esm/requestContext.d.ts +63 -0
  270. package/dist/esm/requestContext.d.ts.map +1 -0
  271. package/dist/esm/requestContext.js +39 -0
  272. package/dist/esm/requestContext.js.map +1 -0
  273. package/dist/esm/resource/resource.d.ts +12 -0
  274. package/dist/esm/resource/resource.d.ts.map +1 -0
  275. package/dist/esm/resource/resource.js +97 -0
  276. package/dist/esm/resource/resource.js.map +1 -0
  277. package/dist/esm/util.d.ts +15 -0
  278. package/dist/esm/util.d.ts.map +1 -0
  279. package/dist/esm/util.js +97 -0
  280. package/dist/esm/util.js.map +1 -0
  281. package/package.json +45 -0
@@ -0,0 +1,30 @@
1
+ export class RequestSupplementalDataImpl {
2
+ constructor(contextKeysForAction, contextKeysForResource, contextKeysForPrincipal) {
3
+ this.contextKeysForAction = contextKeysForAction;
4
+ this.contextKeysForResource = contextKeysForResource;
5
+ this.contextKeysForPrincipal = contextKeysForPrincipal;
6
+ this.allActions = new Set();
7
+ for (const action of contextKeysForAction) {
8
+ this.allActions.add(action);
9
+ }
10
+ for (const resource of contextKeysForResource) {
11
+ this.allActions.add(resource);
12
+ }
13
+ for (const principal of contextKeysForPrincipal) {
14
+ this.allActions.add(...[principal]);
15
+ }
16
+ }
17
+ contextKeyValidForRequest(key) {
18
+ /*
19
+ Todo: Add a way to check if the key has a slash in it such as aws:RequestKeys or aws:ResourceTagKeys
20
+ */
21
+ return this.allActions.has(key);
22
+ }
23
+ }
24
+ export const MockRequestSupplementalData = {
25
+ contextKeysForAction: [],
26
+ contextKeysForResource: [],
27
+ contextKeysForPrincipal: [],
28
+ contextKeyValidForRequest: (key) => true
29
+ };
30
+ //# sourceMappingURL=requestSupplementalData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestSupplementalData.js","sourceRoot":"","sources":["../../../src/request/requestSupplementalData.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,2BAA2B;IAItC,YAA4B,oBAA8B,EAC9B,sBAAgC,EAChC,uBAAiC;QAFjC,yBAAoB,GAApB,oBAAoB,CAAU;QAC9B,2BAAsB,GAAtB,sBAAsB,CAAU;QAChC,4BAAuB,GAAvB,uBAAuB,CAAU;QAJrD,eAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;QAK1C,KAAI,MAAM,MAAM,IAAI,oBAAoB,EAAE,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QACD,KAAI,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC/B,CAAC;QACD,KAAI,MAAM,SAAS,IAAI,uBAAuB,EAAE,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,yBAAyB,CAAC,GAAW;QACnC;;UAEE;QACF,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA4B;IAClE,oBAAoB,EAAE,EAAE;IACxB,sBAAsB,EAAE,EAAE;IAC1B,uBAAuB,EAAE,EAAE;IAC3B,yBAAyB,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI;CACjD,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { RequestContext } from "./requestContext.js";
2
+ export interface Request {
3
+ principal: string;
4
+ action: string;
5
+ resource: string;
6
+ context: RequestContext;
7
+ }
8
+ export declare class RequestImpl implements Request {
9
+ readonly principal: string;
10
+ readonly resource: string;
11
+ readonly action: string;
12
+ readonly context: RequestContext;
13
+ constructor(principal: string, resource: string, action: string, context: RequestContext);
14
+ }
15
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,WAAY,YAAW,OAAO;aAEb,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;aACd,OAAO,EAAE,cAAc;gBAHvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc;CAGpD"}
@@ -0,0 +1,9 @@
1
+ export class RequestImpl {
2
+ constructor(principal, resource, action, context) {
3
+ this.principal = principal;
4
+ this.resource = resource;
5
+ this.action = action;
6
+ this.context = context;
7
+ }
8
+ }
9
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,WAAW;IAEtB,YAA4B,SAAiB,EACjB,QAAgB,EAChB,MAAc,EACd,OAAuB;QAHvB,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAgB;IAEnD,CAAC;CACF"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The context metadata available in a request
3
+ */
4
+ export interface RequestContext {
5
+ /**
6
+ * Check if a context key exists in a request
7
+ * @param name the name of the context key to check for, case insensitive
8
+ * @returns true if the context key exists, false otherwise
9
+ */
10
+ contextKeyExists: (name: string) => boolean;
11
+ /**
12
+ * Get the value of a context key in a request
13
+ *
14
+ * @param name the name of the context key to get the value of, case insensitive
15
+ * @returns the value of the context key
16
+ */
17
+ contextKeyValue: (name: string) => ContextKey;
18
+ }
19
+ /**
20
+ * A context key in a request
21
+ */
22
+ export interface ContextKey {
23
+ /**
24
+ * The name of the context key
25
+ */
26
+ name: string;
27
+ /**
28
+ * Check if the context key is a string value
29
+ */
30
+ isStringValue(): this is StringContextKey;
31
+ /**
32
+ * Check if the context key is an array value
33
+ */
34
+ isArrayValue(): this is ArrayContextKey;
35
+ }
36
+ export interface StringContextKey extends ContextKey {
37
+ /**
38
+ * The value of the context key if it is a string
39
+ */
40
+ value: string;
41
+ }
42
+ export interface ArrayContextKey extends ContextKey {
43
+ /**
44
+ * The array of values of the context key if it is an array
45
+ */
46
+ values: string[];
47
+ }
48
+ export declare class RequestContextImpl implements RequestContext {
49
+ private context;
50
+ constructor(values: Record<string, string | string[]>);
51
+ contextKeyExists(name: string): boolean;
52
+ contextKeyValue(name: string): ContextKey;
53
+ }
54
+ export declare class ContextKeyImpl implements ContextKey, StringContextKey, ArrayContextKey {
55
+ name: string;
56
+ private _val;
57
+ constructor(name: string, _val: string | string[]);
58
+ isStringValue(): this is StringContextKey;
59
+ isArrayValue(): this is ArrayContextKey;
60
+ get values(): string[];
61
+ get value(): string;
62
+ }
63
+ //# sourceMappingURL=requestContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestContext.d.ts","sourceRoot":"","sources":["../../src/requestContext.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,MAAM,WAAW,cAAc;IAE7B;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAE5C;;;;;OAKG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,aAAa,IAAI,IAAI,IAAI,gBAAgB,CAAC;IAE1C;;OAEG;IACH,YAAY,IAAI,IAAI,IAAI,eAAe,CAAC;CACzC;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAElD;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAgB,SAAQ,UAAU;IAEjD;;OAEG;IAEH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,OAAO,CAAsC;gBAEzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAO9C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIvC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;CAIjD;AAED,qBAAa,cAAe,YAAW,UAAU,EAAE,gBAAgB,EAAE,eAAe;IAC/D,IAAI,EAAE,MAAM;IAAE,OAAO,CAAC,IAAI;gBAA1B,IAAI,EAAE,MAAM,EAAU,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAEhE,aAAa,IAAI,IAAI,IAAI,gBAAgB;IAGzC,YAAY,IAAI,IAAI,IAAI,eAAe;IAIvC,IAAI,MAAM,IAAI,MAAM,EAAE,CAKrB;IAED,IAAI,KAAK,IAAI,MAAM,CAKlB;CACF"}
@@ -0,0 +1,39 @@
1
+ export class RequestContextImpl {
2
+ constructor(values) {
3
+ this.context = new Map();
4
+ for (const key in values) {
5
+ this.context.set(key.toLowerCase(), new ContextKeyImpl(key, values[key]));
6
+ }
7
+ }
8
+ contextKeyExists(name) {
9
+ return this.context.has(name.toLowerCase());
10
+ }
11
+ contextKeyValue(name) {
12
+ return this.context.get(name.toLowerCase());
13
+ }
14
+ }
15
+ export class ContextKeyImpl {
16
+ constructor(name, _val) {
17
+ this.name = name;
18
+ this._val = _val;
19
+ }
20
+ isStringValue() {
21
+ return typeof this._val === 'string';
22
+ }
23
+ isArrayValue() {
24
+ return Array.isArray(this._val);
25
+ }
26
+ get values() {
27
+ if (Array.isArray(this._val)) {
28
+ return this._val;
29
+ }
30
+ throw new Error(`ContextKey ${this.name} is not an array`);
31
+ }
32
+ get value() {
33
+ if (typeof this._val === 'string') {
34
+ return this._val;
35
+ }
36
+ throw new Error(`ContextKey ${this.name} is not a string`);
37
+ }
38
+ }
39
+ //# sourceMappingURL=requestContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestContext.js","sourceRoot":"","sources":["../../src/requestContext.ts"],"names":[],"mappings":"AA2DA,MAAM,OAAO,kBAAkB;IAG7B,YAAY,MAAyC;QAF7C,YAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;QAGnD,KAAI,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAGM,gBAAgB,CAAC,IAAY;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC;IAEM,eAAe,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAe,CAAC;IAE5D,CAAC;CACF;AAED,MAAM,OAAO,cAAc;IACzB,YAAmB,IAAY,EAAU,IAAuB;QAA7C,SAAI,GAAJ,IAAI,CAAQ;QAAU,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAEpE,aAAa;QACX,OAAO,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;IACvC,CAAC;IACD,YAAY;QACV,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,MAAM;QACR,IAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK;QACP,IAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC;IAC7D,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import { Resource } from "@cloud-copilot/iam-policy";
2
+ import { AwsRequest } from "../request/request.js";
3
+ /**
4
+ * Check if a request matches a set of resources.
5
+ *
6
+ * @param request the request to check
7
+ * @param policyResources the resources to check against
8
+ * @returns true if the request matches any of the resources, false otherwise
9
+ */
10
+ export declare function requestMatchesResources(request: AwsRequest, policyResources: Resource[]): boolean;
11
+ export declare function requestMatchesNotResources(request: AwsRequest, policyResources: Resource[]): boolean;
12
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/resource/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAmBnD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,OAAO,CAEjG;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,OAAO,CAEpG"}
@@ -0,0 +1,97 @@
1
+ import { convertIamStringToRegex } from "../util.js";
2
+ //TODO: Make a check to see if the action is a wildcard only action. This will have to happen outside of these functions.
3
+ /**
4
+ * Convert a resource segment to a regular expression. This is without variables.
5
+ *
6
+ * @param segment the segment to convert to a regular expression
7
+ * @returns a regular that replaces any wildcards in the segment with the appropriate regular expression.
8
+ */
9
+ function convertResourceSegmentToRegex(segment) {
10
+ if (segment.indexOf(':') != -1) {
11
+ throw new Error('Segment should not contain a colon');
12
+ }
13
+ const pattern = "^" + segment.replace(/\?/g, '.').replace(/\*/g, '.*?') + "$";
14
+ return new RegExp(pattern, 'i');
15
+ }
16
+ /**
17
+ * Check if a request matches a set of resources.
18
+ *
19
+ * @param request the request to check
20
+ * @param policyResources the resources to check against
21
+ * @returns true if the request matches any of the resources, false otherwise
22
+ */
23
+ export function requestMatchesResources(request, policyResources) {
24
+ return policyResources.some(policyResource => singleResourceMatchesRequest(request, policyResource));
25
+ }
26
+ export function requestMatchesNotResources(request, policyResources) {
27
+ return !requestMatchesResources(request, policyResources);
28
+ }
29
+ /**
30
+ * Check if a single resource matches a request.
31
+ *
32
+ * @param request the request to check against
33
+ * @param policyResource the resource to check against
34
+ * @returns true if the request matches the resource, false otherwise
35
+ */
36
+ function singleResourceMatchesRequest(request, policyResource) {
37
+ if (policyResource.isAllResources()) {
38
+ return true;
39
+ }
40
+ else if (policyResource.isArnResource()) {
41
+ if (!request.resource) {
42
+ return false;
43
+ }
44
+ const resource = request.resource;
45
+ if (!convertResourceSegmentToRegex(policyResource.partition()).test(resource.partition())) {
46
+ return false;
47
+ }
48
+ if (!convertResourceSegmentToRegex(policyResource.service()).test(resource.service())) {
49
+ return false;
50
+ }
51
+ if (!convertResourceSegmentToRegex(policyResource.region()).test(resource.region())) {
52
+ return false;
53
+ }
54
+ if (!convertResourceSegmentToRegex(policyResource.account()).test(resource.account())) {
55
+ return false;
56
+ }
57
+ //Wildcards and variables are not allowed in the product segment https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html "Incorrect wildcard usage"
58
+ const [policyProduct, policyResourceId] = getResourceSegments(policyResource.resource());
59
+ if (!resource.resource().startsWith(policyProduct)) {
60
+ return false;
61
+ }
62
+ const requestResourceId = resource.resource().slice(policyProduct.length);
63
+ if (!convertIamStringToRegex(policyResourceId, request).test(requestResourceId)) {
64
+ return false;
65
+ }
66
+ return true;
67
+ }
68
+ else {
69
+ throw new Error('Unknown resource type');
70
+ }
71
+ }
72
+ /**
73
+ * Splits a resource into two segments. The first segment is the product segment and the second segment is the resource id segment.
74
+ * This could be split by a colon or a slash, so it checks for both.
75
+ *
76
+ * @param resource The resource to split
77
+ * @returns a tuple with the first segment being the product segment (including the separator) and the second segment being the resource id.
78
+ */
79
+ function getResourceSegments(resource) {
80
+ const slashIndex = resource.indexOf('/');
81
+ const colonIndex = resource.indexOf(':');
82
+ let splitIndex = slashIndex;
83
+ if (slashIndex != -1 && colonIndex != -1) {
84
+ splitIndex = Math.min(slashIndex, colonIndex) + 1;
85
+ }
86
+ else if (colonIndex == -1) {
87
+ splitIndex = slashIndex + 1;
88
+ }
89
+ else if (slashIndex == -1) {
90
+ splitIndex = colonIndex + 1;
91
+ }
92
+ else {
93
+ throw new Error(`Unable to split resource ${resource}`);
94
+ }
95
+ return [resource.slice(0, splitIndex), resource.slice(splitIndex)];
96
+ }
97
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../src/resource/resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { AwsRequest } from './request/request.js';
2
+ interface StringReplaceOptions {
3
+ replaceWildcards: boolean;
4
+ }
5
+ /**
6
+ * This will convert a string to a regex that can be used to match against a string.
7
+ * This will replace any variables in the string with the value of the variable in the request context.
8
+ *
9
+ * @param value the string to convert to a regex
10
+ * @param requestContext the request context to get the variable values from
11
+ * @returns a regex that can be used to match against a string
12
+ */
13
+ export declare function convertIamStringToRegex(value: string, request: AwsRequest, replaceOptions?: Partial<StringReplaceOptions>): RegExp;
14
+ export {};
15
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAIjD,UAAU,oBAAoB;IAC5B,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAMD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,MAAM,CA2DlI"}
@@ -0,0 +1,97 @@
1
+ const matchesNothing = new RegExp('a^');
2
+ const defaultStringReplaceOptions = {
3
+ replaceWildcards: true
4
+ };
5
+ /**
6
+ * This will convert a string to a regex that can be used to match against a string.
7
+ * This will replace any variables in the string with the value of the variable in the request context.
8
+ *
9
+ * @param value the string to convert to a regex
10
+ * @param requestContext the request context to get the variable values from
11
+ * @returns a regex that can be used to match against a string
12
+ */
13
+ export function convertIamStringToRegex(value, request, replaceOptions) {
14
+ const options = { ...defaultStringReplaceOptions, ...replaceOptions };
15
+ let invalidVariableFound = false;
16
+ const newValue = value.replaceAll(/(\$\{.*?\})|(\*)|(\?)/ig, (match, args) => {
17
+ if (match == "?") {
18
+ return replacementValue('\\?', '.', options.replaceWildcards);
19
+ // return '.'
20
+ }
21
+ else if (match == "*") {
22
+ return replacementValue('\\*', ".*?", options.replaceWildcards);
23
+ // return ".*?"
24
+ }
25
+ else if (match == "${*}") {
26
+ return replacementValue("\\$\\{\\*\\}", "\\*", options.replaceWildcards);
27
+ // return "\\*"
28
+ }
29
+ else if (match == "${?}") {
30
+ return replacementValue("\\$\\{\\?\\}", "\\?", options.replaceWildcards);
31
+ // return "\\?"
32
+ }
33
+ else if (match == "${$}") {
34
+ return replacementValue("\\$\\{\\$\\}", "\\$", options.replaceWildcards);
35
+ // return "\\$"
36
+ }
37
+ //
38
+ //This means it'a a variable
39
+ const inTheBrackets = match.slice(2, -1);
40
+ let defaultValue = undefined;
41
+ const defaultParts = inTheBrackets.split(', ');
42
+ if (defaultParts.length == 2) {
43
+ const segmentAfterComma = defaultParts.at(1);
44
+ if (segmentAfterComma?.startsWith("'") && segmentAfterComma.endsWith("'")) {
45
+ defaultValue = segmentAfterComma.slice(1, -1);
46
+ }
47
+ }
48
+ const variableName = defaultParts.at(0).trim();
49
+ const requestValue = getContextSingleValue(request, variableName);
50
+ if (requestValue) {
51
+ return requestValue;
52
+ }
53
+ else if (defaultValue) {
54
+ /*
55
+ TODO: What happens in a request if a multi value context key is used in a string and there
56
+ is a default value? Will it use the default value or will it fail the condition test?
57
+ */
58
+ return defaultValue;
59
+ }
60
+ else {
61
+ invalidVariableFound = true;
62
+ /*
63
+ https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-no-value
64
+ */
65
+ return "--undefined---";
66
+ }
67
+ throw new Error('This should never happen');
68
+ });
69
+ if (invalidVariableFound) {
70
+ return matchesNothing;
71
+ }
72
+ return new RegExp('^' + newValue + '$');
73
+ }
74
+ /**
75
+ * Get the string value of a context key only if it is a single value key
76
+ *
77
+ * @param requestContext the request context to get the value from
78
+ * @param contextKeyName the name of the context key to get the value of
79
+ * @returns the value of the context key if it is a single value key, undefined otherwise
80
+ */
81
+ function getContextSingleValue(request, contextKeyName) {
82
+ if (!request.contextKeyExists(contextKeyName)) {
83
+ return undefined;
84
+ }
85
+ const keyValue = request.getContextKeyValue(contextKeyName);
86
+ if (keyValue.isStringValue()) {
87
+ return keyValue.value;
88
+ }
89
+ return undefined;
90
+ }
91
+ function replacementValue(rawString, wildcard, replaceWildcards) {
92
+ if (replaceWildcards) {
93
+ return wildcard;
94
+ }
95
+ return rawString;
96
+ }
97
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@cloud-copilot/iam-simulate",
3
+ "version": "0.1.0",
4
+ "description": "Simulate evaluation of AWS IAM policies",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/cloud-copilot/iam-simulate.git"
8
+ },
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/esm/index.js",
12
+ "require": "./dist/cjs/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist/**/*"
17
+ ],
18
+ "types": "dist/cjs/index.d.ts",
19
+ "scripts": {
20
+ "build": "npx tsc -p tsconfig.cjs.json && npx tsc -p tsconfig.esm.json && ./postbuild.sh",
21
+ "clean": "rm -rf dist",
22
+ "test": "npx vitest --run --coverage",
23
+ "release": "npm run clean && npm run build && npm run test && npm publish"
24
+ },
25
+ "keywords": [
26
+ "AWS",
27
+ "IAM"
28
+ ],
29
+ "author": "David Kerber <dave@cloudcopilot.io>",
30
+ "license": "AGPL-3.0-or-later",
31
+ "bugs": {
32
+ "url": "https://github.com/cloud-copilot/iam-simulate/issues"
33
+ },
34
+ "homepage": "https://github.com/cloud-copilot/iam-simulate#readme",
35
+ "devDependencies": {
36
+ "@types/node": "^22.5.0",
37
+ "@vitest/coverage-v8": "^2.0.5",
38
+ "typescript": "^5.5.4",
39
+ "vitest": "^2.0.5"
40
+ },
41
+ "dependencies": {
42
+ "@cloud-copilot/iam-data": ">=0.8.0 <1.0.0",
43
+ "@cloud-copilot/iam-policy": "0.0.9"
44
+ }
45
+ }