@cloud-copilot/iam-simulate 0.1.12 → 0.1.14

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 (329) hide show
  1. package/dist/cjs/StatementAnalysis.d.ts +14 -0
  2. package/dist/cjs/StatementAnalysis.d.ts.map +1 -1
  3. package/dist/cjs/StatementAnalysis.js +51 -0
  4. package/dist/cjs/StatementAnalysis.js.map +1 -1
  5. package/dist/cjs/action/action.d.ts +13 -3
  6. package/dist/cjs/action/action.d.ts.map +1 -1
  7. package/dist/cjs/action/action.js +43 -21
  8. package/dist/cjs/action/action.js.map +1 -1
  9. package/dist/cjs/condition/BaseConditionOperator.d.ts +6 -1
  10. package/dist/cjs/condition/BaseConditionOperator.d.ts.map +1 -1
  11. package/dist/cjs/condition/arn/ArnEquals.d.ts.map +1 -1
  12. package/dist/cjs/condition/arn/ArnEquals.js +2 -1
  13. package/dist/cjs/condition/arn/ArnEquals.js.map +1 -1
  14. package/dist/cjs/condition/arn/ArnLike.d.ts.map +1 -1
  15. package/dist/cjs/condition/arn/ArnLike.js +8 -40
  16. package/dist/cjs/condition/arn/ArnLike.js.map +1 -1
  17. package/dist/cjs/condition/arn/ArnNotEquals.d.ts.map +1 -1
  18. package/dist/cjs/condition/arn/ArnNotEquals.js +2 -1
  19. package/dist/cjs/condition/arn/ArnNotEquals.js.map +1 -1
  20. package/dist/cjs/condition/arn/ArnNotLike.d.ts.map +1 -1
  21. package/dist/cjs/condition/arn/ArnNotLike.js +8 -3
  22. package/dist/cjs/condition/arn/ArnNotLike.js.map +1 -1
  23. package/dist/cjs/condition/arn/arn.d.ts +12 -0
  24. package/dist/cjs/condition/arn/arn.d.ts.map +1 -0
  25. package/dist/cjs/condition/arn/arn.js +68 -0
  26. package/dist/cjs/condition/arn/arn.js.map +1 -0
  27. package/dist/cjs/condition/baseConditionperatorTests.d.ts +7 -1
  28. package/dist/cjs/condition/baseConditionperatorTests.d.ts.map +1 -1
  29. package/dist/cjs/condition/baseConditionperatorTests.js +17 -1
  30. package/dist/cjs/condition/baseConditionperatorTests.js.map +1 -1
  31. package/dist/cjs/condition/binary/BinaryEquals.d.ts.map +1 -1
  32. package/dist/cjs/condition/binary/BinaryEquals.js +14 -2
  33. package/dist/cjs/condition/binary/BinaryEquals.js.map +1 -1
  34. package/dist/cjs/condition/boolean/Bool.d.ts.map +1 -1
  35. package/dist/cjs/condition/boolean/Bool.js +36 -7
  36. package/dist/cjs/condition/boolean/Bool.js.map +1 -1
  37. package/dist/cjs/condition/condition.d.ts +46 -3
  38. package/dist/cjs/condition/condition.d.ts.map +1 -1
  39. package/dist/cjs/condition/condition.js +242 -48
  40. package/dist/cjs/condition/condition.js.map +1 -1
  41. package/dist/cjs/condition/conditionUtil.d.ts +10 -0
  42. package/dist/cjs/condition/conditionUtil.d.ts.map +1 -0
  43. package/dist/cjs/condition/conditionUtil.js +16 -0
  44. package/dist/cjs/condition/conditionUtil.js.map +1 -0
  45. package/dist/cjs/condition/date/DateEquals.d.ts.map +1 -1
  46. package/dist/cjs/condition/date/DateEquals.js +7 -2
  47. package/dist/cjs/condition/date/DateEquals.js.map +1 -1
  48. package/dist/cjs/condition/date/DateGreaterThan.d.ts.map +1 -1
  49. package/dist/cjs/condition/date/DateGreaterThan.js +7 -2
  50. package/dist/cjs/condition/date/DateGreaterThan.js.map +1 -1
  51. package/dist/cjs/condition/date/DateGreaterThanEquals.d.ts.map +1 -1
  52. package/dist/cjs/condition/date/DateGreaterThanEquals.js +7 -2
  53. package/dist/cjs/condition/date/DateGreaterThanEquals.js.map +1 -1
  54. package/dist/cjs/condition/date/DateLessThan.d.ts.map +1 -1
  55. package/dist/cjs/condition/date/DateLessThan.js +7 -2
  56. package/dist/cjs/condition/date/DateLessThan.js.map +1 -1
  57. package/dist/cjs/condition/date/DateLessThanEquals.d.ts.map +1 -1
  58. package/dist/cjs/condition/date/DateLessThanEquals.js +7 -2
  59. package/dist/cjs/condition/date/DateLessThanEquals.js.map +1 -1
  60. package/dist/cjs/condition/date/DateNotEquals.d.ts.map +1 -1
  61. package/dist/cjs/condition/date/DateNotEquals.js +11 -18
  62. package/dist/cjs/condition/date/DateNotEquals.js.map +1 -1
  63. package/dist/cjs/condition/date/date.d.ts +2 -1
  64. package/dist/cjs/condition/date/date.d.ts.map +1 -1
  65. package/dist/cjs/condition/date/date.js +20 -5
  66. package/dist/cjs/condition/date/date.js.map +1 -1
  67. package/dist/cjs/condition/ipaddress/IpAddress.d.ts.map +1 -1
  68. package/dist/cjs/condition/ipaddress/IpAddress.js +9 -16
  69. package/dist/cjs/condition/ipaddress/IpAddress.js.map +1 -1
  70. package/dist/cjs/condition/ipaddress/NotIpAddress.d.ts.map +1 -1
  71. package/dist/cjs/condition/ipaddress/NotIpAddress.js +9 -20
  72. package/dist/cjs/condition/ipaddress/NotIpAddress.js.map +1 -1
  73. package/dist/cjs/condition/ipaddress/ip.d.ts +10 -0
  74. package/dist/cjs/condition/ipaddress/ip.d.ts.map +1 -0
  75. package/dist/cjs/condition/ipaddress/ip.js +57 -0
  76. package/dist/cjs/condition/ipaddress/ip.js.map +1 -0
  77. package/dist/cjs/condition/numeric/NumericEquals.d.ts.map +1 -1
  78. package/dist/cjs/condition/numeric/NumericEquals.js +7 -2
  79. package/dist/cjs/condition/numeric/NumericEquals.js.map +1 -1
  80. package/dist/cjs/condition/numeric/NumericGreaterThan.d.ts.map +1 -1
  81. package/dist/cjs/condition/numeric/NumericGreaterThan.js +7 -2
  82. package/dist/cjs/condition/numeric/NumericGreaterThan.js.map +1 -1
  83. package/dist/cjs/condition/numeric/NumericGreaterThanEquals.d.ts.map +1 -1
  84. package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js +7 -2
  85. package/dist/cjs/condition/numeric/NumericGreaterThanEquals.js.map +1 -1
  86. package/dist/cjs/condition/numeric/NumericLessThan.d.ts.map +1 -1
  87. package/dist/cjs/condition/numeric/NumericLessThan.js +7 -2
  88. package/dist/cjs/condition/numeric/NumericLessThan.js.map +1 -1
  89. package/dist/cjs/condition/numeric/NumericLessThanEquals.d.ts.map +1 -1
  90. package/dist/cjs/condition/numeric/NumericLessThanEquals.js +7 -2
  91. package/dist/cjs/condition/numeric/NumericLessThanEquals.js.map +1 -1
  92. package/dist/cjs/condition/numeric/NumericNotEquals.d.ts.map +1 -1
  93. package/dist/cjs/condition/numeric/NumericNotEquals.js +11 -18
  94. package/dist/cjs/condition/numeric/NumericNotEquals.js.map +1 -1
  95. package/dist/cjs/condition/numeric/numeric.d.ts +2 -1
  96. package/dist/cjs/condition/numeric/numeric.d.ts.map +1 -1
  97. package/dist/cjs/condition/numeric/numeric.js +18 -3
  98. package/dist/cjs/condition/numeric/numeric.js.map +1 -1
  99. package/dist/cjs/condition/string/StringEquals.d.ts.map +1 -1
  100. package/dist/cjs/condition/string/StringEquals.js +24 -3
  101. package/dist/cjs/condition/string/StringEquals.js.map +1 -1
  102. package/dist/cjs/condition/string/StringEqualsIgnoreCase.d.ts.map +1 -1
  103. package/dist/cjs/condition/string/StringEqualsIgnoreCase.js +23 -5
  104. package/dist/cjs/condition/string/StringEqualsIgnoreCase.js.map +1 -1
  105. package/dist/cjs/condition/string/StringLike.d.ts.map +1 -1
  106. package/dist/cjs/condition/string/StringLike.js +24 -3
  107. package/dist/cjs/condition/string/StringLike.js.map +1 -1
  108. package/dist/cjs/condition/string/StringNotEquals.d.ts.map +1 -1
  109. package/dist/cjs/condition/string/StringNotEquals.js +24 -3
  110. package/dist/cjs/condition/string/StringNotEquals.js.map +1 -1
  111. package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.d.ts.map +1 -1
  112. package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js +25 -3
  113. package/dist/cjs/condition/string/StringNotEqualsIgnoreCase.js.map +1 -1
  114. package/dist/cjs/condition/string/StringNotLike.d.ts.map +1 -1
  115. package/dist/cjs/condition/string/StringNotLike.js +25 -3
  116. package/dist/cjs/condition/string/StringNotLike.js.map +1 -1
  117. package/dist/cjs/core_engine/coreSimulatorEngine.d.ts +10 -7
  118. package/dist/cjs/core_engine/coreSimulatorEngine.d.ts.map +1 -1
  119. package/dist/cjs/core_engine/coreSimulatorEngine.js +148 -28
  120. package/dist/cjs/core_engine/coreSimulatorEngine.js.map +1 -1
  121. package/dist/cjs/evaluate.d.ts +47 -0
  122. package/dist/cjs/evaluate.d.ts.map +1 -1
  123. package/dist/cjs/explain/displayExplainCli.d.ts +3 -0
  124. package/dist/cjs/explain/displayExplainCli.d.ts.map +1 -0
  125. package/dist/cjs/explain/displayExplainCli.js +249 -0
  126. package/dist/cjs/explain/displayExplainCli.js.map +1 -0
  127. package/dist/cjs/explain/statementExplain.d.ts +51 -0
  128. package/dist/cjs/explain/statementExplain.d.ts.map +1 -0
  129. package/dist/cjs/explain/statementExplain.js +7 -0
  130. package/dist/cjs/explain/statementExplain.js.map +1 -0
  131. package/dist/cjs/index.d.ts +1 -0
  132. package/dist/cjs/index.d.ts.map +1 -1
  133. package/dist/cjs/index.js.map +1 -1
  134. package/dist/cjs/principal/principal.d.ts +28 -6
  135. package/dist/cjs/principal/principal.d.ts.map +1 -1
  136. package/dist/cjs/principal/principal.js +146 -40
  137. package/dist/cjs/principal/principal.js.map +1 -1
  138. package/dist/cjs/resource/resource.d.ts +13 -3
  139. package/dist/cjs/resource/resource.d.ts.map +1 -1
  140. package/dist/cjs/resource/resource.js +68 -15
  141. package/dist/cjs/resource/resource.js.map +1 -1
  142. package/dist/cjs/services/DefaultServiceAuthorizer.d.ts +2 -34
  143. package/dist/cjs/services/DefaultServiceAuthorizer.d.ts.map +1 -1
  144. package/dist/cjs/services/DefaultServiceAuthorizer.js +95 -131
  145. package/dist/cjs/services/DefaultServiceAuthorizer.js.map +1 -1
  146. package/dist/cjs/services/ServiceAuthorizer.d.ts +6 -7
  147. package/dist/cjs/services/ServiceAuthorizer.d.ts.map +1 -1
  148. package/dist/cjs/simulation_engine/simulation.d.ts +4 -0
  149. package/dist/cjs/simulation_engine/simulation.d.ts.map +1 -1
  150. package/dist/cjs/simulation_engine/simulationEngine.d.ts +2 -4
  151. package/dist/cjs/simulation_engine/simulationEngine.d.ts.map +1 -1
  152. package/dist/cjs/simulation_engine/simulationEngine.js +16 -4
  153. package/dist/cjs/simulation_engine/simulationEngine.js.map +1 -1
  154. package/dist/cjs/simulation_engine/unsafeSimulationEngine.d.ts.map +1 -1
  155. package/dist/cjs/simulation_engine/unsafeSimulationEngine.js +5 -2
  156. package/dist/cjs/simulation_engine/unsafeSimulationEngine.js.map +1 -1
  157. package/dist/cjs/util.d.ts +31 -3
  158. package/dist/cjs/util.d.ts.map +1 -1
  159. package/dist/cjs/util.js +74 -32
  160. package/dist/cjs/util.js.map +1 -1
  161. package/dist/esm/StatementAnalysis.d.ts +14 -0
  162. package/dist/esm/StatementAnalysis.d.ts.map +1 -1
  163. package/dist/esm/StatementAnalysis.js +48 -1
  164. package/dist/esm/StatementAnalysis.js.map +1 -1
  165. package/dist/esm/action/action.d.ts +13 -3
  166. package/dist/esm/action/action.d.ts.map +1 -1
  167. package/dist/esm/action/action.js +43 -21
  168. package/dist/esm/action/action.js.map +1 -1
  169. package/dist/esm/condition/BaseConditionOperator.d.ts +6 -1
  170. package/dist/esm/condition/BaseConditionOperator.d.ts.map +1 -1
  171. package/dist/esm/condition/arn/ArnEquals.d.ts.map +1 -1
  172. package/dist/esm/condition/arn/ArnEquals.js +2 -1
  173. package/dist/esm/condition/arn/ArnEquals.js.map +1 -1
  174. package/dist/esm/condition/arn/ArnLike.d.ts.map +1 -1
  175. package/dist/esm/condition/arn/ArnLike.js +8 -40
  176. package/dist/esm/condition/arn/ArnLike.js.map +1 -1
  177. package/dist/esm/condition/arn/ArnNotEquals.d.ts.map +1 -1
  178. package/dist/esm/condition/arn/ArnNotEquals.js +2 -1
  179. package/dist/esm/condition/arn/ArnNotEquals.js.map +1 -1
  180. package/dist/esm/condition/arn/ArnNotLike.d.ts.map +1 -1
  181. package/dist/esm/condition/arn/ArnNotLike.js +8 -3
  182. package/dist/esm/condition/arn/ArnNotLike.js.map +1 -1
  183. package/dist/esm/condition/arn/arn.d.ts +12 -0
  184. package/dist/esm/condition/arn/arn.d.ts.map +1 -0
  185. package/dist/esm/condition/arn/arn.js +65 -0
  186. package/dist/esm/condition/arn/arn.js.map +1 -0
  187. package/dist/esm/condition/baseConditionperatorTests.d.ts +7 -1
  188. package/dist/esm/condition/baseConditionperatorTests.d.ts.map +1 -1
  189. package/dist/esm/condition/baseConditionperatorTests.js +17 -1
  190. package/dist/esm/condition/baseConditionperatorTests.js.map +1 -1
  191. package/dist/esm/condition/binary/BinaryEquals.d.ts.map +1 -1
  192. package/dist/esm/condition/binary/BinaryEquals.js +14 -2
  193. package/dist/esm/condition/binary/BinaryEquals.js.map +1 -1
  194. package/dist/esm/condition/boolean/Bool.d.ts.map +1 -1
  195. package/dist/esm/condition/boolean/Bool.js +37 -8
  196. package/dist/esm/condition/boolean/Bool.js.map +1 -1
  197. package/dist/esm/condition/condition.d.ts +46 -3
  198. package/dist/esm/condition/condition.d.ts.map +1 -1
  199. package/dist/esm/condition/condition.js +239 -48
  200. package/dist/esm/condition/condition.js.map +1 -1
  201. package/dist/esm/condition/conditionUtil.d.ts +10 -0
  202. package/dist/esm/condition/conditionUtil.d.ts.map +1 -0
  203. package/dist/esm/condition/conditionUtil.js +13 -0
  204. package/dist/esm/condition/conditionUtil.js.map +1 -0
  205. package/dist/esm/condition/date/DateEquals.d.ts.map +1 -1
  206. package/dist/esm/condition/date/DateEquals.js +7 -2
  207. package/dist/esm/condition/date/DateEquals.js.map +1 -1
  208. package/dist/esm/condition/date/DateGreaterThan.d.ts.map +1 -1
  209. package/dist/esm/condition/date/DateGreaterThan.js +7 -2
  210. package/dist/esm/condition/date/DateGreaterThan.js.map +1 -1
  211. package/dist/esm/condition/date/DateGreaterThanEquals.d.ts.map +1 -1
  212. package/dist/esm/condition/date/DateGreaterThanEquals.js +7 -2
  213. package/dist/esm/condition/date/DateGreaterThanEquals.js.map +1 -1
  214. package/dist/esm/condition/date/DateLessThan.d.ts.map +1 -1
  215. package/dist/esm/condition/date/DateLessThan.js +7 -2
  216. package/dist/esm/condition/date/DateLessThan.js.map +1 -1
  217. package/dist/esm/condition/date/DateLessThanEquals.d.ts.map +1 -1
  218. package/dist/esm/condition/date/DateLessThanEquals.js +7 -2
  219. package/dist/esm/condition/date/DateLessThanEquals.js.map +1 -1
  220. package/dist/esm/condition/date/DateNotEquals.d.ts.map +1 -1
  221. package/dist/esm/condition/date/DateNotEquals.js +12 -19
  222. package/dist/esm/condition/date/DateNotEquals.js.map +1 -1
  223. package/dist/esm/condition/date/date.d.ts +2 -1
  224. package/dist/esm/condition/date/date.d.ts.map +1 -1
  225. package/dist/esm/condition/date/date.js +20 -5
  226. package/dist/esm/condition/date/date.js.map +1 -1
  227. package/dist/esm/condition/ipaddress/IpAddress.d.ts.map +1 -1
  228. package/dist/esm/condition/ipaddress/IpAddress.js +9 -16
  229. package/dist/esm/condition/ipaddress/IpAddress.js.map +1 -1
  230. package/dist/esm/condition/ipaddress/NotIpAddress.d.ts.map +1 -1
  231. package/dist/esm/condition/ipaddress/NotIpAddress.js +9 -20
  232. package/dist/esm/condition/ipaddress/NotIpAddress.js.map +1 -1
  233. package/dist/esm/condition/ipaddress/ip.d.ts +10 -0
  234. package/dist/esm/condition/ipaddress/ip.d.ts.map +1 -0
  235. package/dist/esm/condition/ipaddress/ip.js +54 -0
  236. package/dist/esm/condition/ipaddress/ip.js.map +1 -0
  237. package/dist/esm/condition/numeric/NumericEquals.d.ts.map +1 -1
  238. package/dist/esm/condition/numeric/NumericEquals.js +7 -2
  239. package/dist/esm/condition/numeric/NumericEquals.js.map +1 -1
  240. package/dist/esm/condition/numeric/NumericGreaterThan.d.ts.map +1 -1
  241. package/dist/esm/condition/numeric/NumericGreaterThan.js +7 -2
  242. package/dist/esm/condition/numeric/NumericGreaterThan.js.map +1 -1
  243. package/dist/esm/condition/numeric/NumericGreaterThanEquals.d.ts.map +1 -1
  244. package/dist/esm/condition/numeric/NumericGreaterThanEquals.js +7 -2
  245. package/dist/esm/condition/numeric/NumericGreaterThanEquals.js.map +1 -1
  246. package/dist/esm/condition/numeric/NumericLessThan.d.ts.map +1 -1
  247. package/dist/esm/condition/numeric/NumericLessThan.js +7 -2
  248. package/dist/esm/condition/numeric/NumericLessThan.js.map +1 -1
  249. package/dist/esm/condition/numeric/NumericLessThanEquals.d.ts.map +1 -1
  250. package/dist/esm/condition/numeric/NumericLessThanEquals.js +7 -2
  251. package/dist/esm/condition/numeric/NumericLessThanEquals.js.map +1 -1
  252. package/dist/esm/condition/numeric/NumericNotEquals.d.ts.map +1 -1
  253. package/dist/esm/condition/numeric/NumericNotEquals.js +12 -19
  254. package/dist/esm/condition/numeric/NumericNotEquals.js.map +1 -1
  255. package/dist/esm/condition/numeric/numeric.d.ts +2 -1
  256. package/dist/esm/condition/numeric/numeric.d.ts.map +1 -1
  257. package/dist/esm/condition/numeric/numeric.js +18 -3
  258. package/dist/esm/condition/numeric/numeric.js.map +1 -1
  259. package/dist/esm/condition/string/StringEquals.d.ts.map +1 -1
  260. package/dist/esm/condition/string/StringEquals.js +25 -4
  261. package/dist/esm/condition/string/StringEquals.js.map +1 -1
  262. package/dist/esm/condition/string/StringEqualsIgnoreCase.d.ts.map +1 -1
  263. package/dist/esm/condition/string/StringEqualsIgnoreCase.js +24 -6
  264. package/dist/esm/condition/string/StringEqualsIgnoreCase.js.map +1 -1
  265. package/dist/esm/condition/string/StringLike.d.ts.map +1 -1
  266. package/dist/esm/condition/string/StringLike.js +25 -4
  267. package/dist/esm/condition/string/StringLike.js.map +1 -1
  268. package/dist/esm/condition/string/StringNotEquals.d.ts.map +1 -1
  269. package/dist/esm/condition/string/StringNotEquals.js +25 -4
  270. package/dist/esm/condition/string/StringNotEquals.js.map +1 -1
  271. package/dist/esm/condition/string/StringNotEqualsIgnoreCase.d.ts.map +1 -1
  272. package/dist/esm/condition/string/StringNotEqualsIgnoreCase.js +25 -3
  273. package/dist/esm/condition/string/StringNotEqualsIgnoreCase.js.map +1 -1
  274. package/dist/esm/condition/string/StringNotLike.d.ts.map +1 -1
  275. package/dist/esm/condition/string/StringNotLike.js +25 -3
  276. package/dist/esm/condition/string/StringNotLike.js.map +1 -1
  277. package/dist/esm/core_engine/coreSimulatorEngine.d.ts +10 -7
  278. package/dist/esm/core_engine/coreSimulatorEngine.d.ts.map +1 -1
  279. package/dist/esm/core_engine/coreSimulatorEngine.js +147 -28
  280. package/dist/esm/core_engine/coreSimulatorEngine.js.map +1 -1
  281. package/dist/esm/evaluate.d.ts +47 -0
  282. package/dist/esm/evaluate.d.ts.map +1 -1
  283. package/dist/esm/explain/displayExplainCli.d.ts +3 -0
  284. package/dist/esm/explain/displayExplainCli.d.ts.map +1 -0
  285. package/dist/esm/explain/displayExplainCli.js +246 -0
  286. package/dist/esm/explain/displayExplainCli.js.map +1 -0
  287. package/dist/esm/explain/statementExplain.d.ts +51 -0
  288. package/dist/esm/explain/statementExplain.d.ts.map +1 -0
  289. package/dist/esm/explain/statementExplain.js +6 -0
  290. package/dist/esm/explain/statementExplain.js.map +1 -0
  291. package/dist/esm/index.d.ts +1 -0
  292. package/dist/esm/index.d.ts.map +1 -1
  293. package/dist/esm/index.js.map +1 -1
  294. package/dist/esm/principal/principal.d.ts +28 -6
  295. package/dist/esm/principal/principal.d.ts.map +1 -1
  296. package/dist/esm/principal/principal.js +144 -38
  297. package/dist/esm/principal/principal.js.map +1 -1
  298. package/dist/esm/resource/resource.d.ts +13 -3
  299. package/dist/esm/resource/resource.d.ts.map +1 -1
  300. package/dist/esm/resource/resource.js +69 -16
  301. package/dist/esm/resource/resource.js.map +1 -1
  302. package/dist/esm/services/DefaultServiceAuthorizer.d.ts +2 -34
  303. package/dist/esm/services/DefaultServiceAuthorizer.d.ts.map +1 -1
  304. package/dist/esm/services/DefaultServiceAuthorizer.js +95 -131
  305. package/dist/esm/services/DefaultServiceAuthorizer.js.map +1 -1
  306. package/dist/esm/services/ServiceAuthorizer.d.ts +6 -7
  307. package/dist/esm/services/ServiceAuthorizer.d.ts.map +1 -1
  308. package/dist/esm/simulation_engine/simulation.d.ts +4 -0
  309. package/dist/esm/simulation_engine/simulation.d.ts.map +1 -1
  310. package/dist/esm/simulation_engine/simulationEngine.d.ts +2 -4
  311. package/dist/esm/simulation_engine/simulationEngine.d.ts.map +1 -1
  312. package/dist/esm/simulation_engine/simulationEngine.js +16 -4
  313. package/dist/esm/simulation_engine/simulationEngine.js.map +1 -1
  314. package/dist/esm/simulation_engine/unsafeSimulationEngine.d.ts.map +1 -1
  315. package/dist/esm/simulation_engine/unsafeSimulationEngine.js +5 -2
  316. package/dist/esm/simulation_engine/unsafeSimulationEngine.js.map +1 -1
  317. package/dist/esm/util.d.ts +31 -3
  318. package/dist/esm/util.d.ts.map +1 -1
  319. package/dist/esm/util.js +70 -31
  320. package/dist/esm/util.js.map +1 -1
  321. package/package.json +2 -2
  322. package/dist/cjs/SCPAnalysis.d.ts +0 -6
  323. package/dist/cjs/SCPAnalysis.d.ts.map +0 -1
  324. package/dist/cjs/SCPAnalysis.js +0 -3
  325. package/dist/cjs/SCPAnalysis.js.map +0 -1
  326. package/dist/esm/SCPAnalysis.d.ts +0 -6
  327. package/dist/esm/SCPAnalysis.d.ts.map +0 -1
  328. package/dist/esm/SCPAnalysis.js +0 -2
  329. package/dist/esm/SCPAnalysis.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ import { ConditionValueExplain } from "../../explain/statementExplain.js";
2
+ import { AwsRequest } from "../../request/request.js";
3
+ /**
4
+ * Checks to see if a single ARN matches in ArnLike format
5
+ *
6
+ * @param policyArn the ARN to check against
7
+ * @param requestArn the ARN to check
8
+ * @param request the request to check
9
+ * @returns if the ARN matches
10
+ */
11
+ export declare function arnMatches(policyArn: string, requestArn: string, request: AwsRequest, expectMatch: boolean): ConditionValueExplain;
12
+ //# sourceMappingURL=arn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arn.d.ts","sourceRoot":"","sources":["../../../../src/condition/arn/arn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAGrD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,GAAG,qBAAqB,CA6DlI"}
@@ -0,0 +1,65 @@
1
+ import { convertIamString, isNotDefined, splitArnParts } from "../../util.js";
2
+ /**
3
+ * Checks to see if a single ARN matches in ArnLike format
4
+ *
5
+ * @param policyArn the ARN to check against
6
+ * @param requestArn the ARN to check
7
+ * @param request the request to check
8
+ * @returns if the ARN matches
9
+ */
10
+ export function arnMatches(policyArn, requestArn, request, expectMatch) {
11
+ const policyParts = splitArnParts(policyArn);
12
+ const requestParts = splitArnParts(requestArn);
13
+ // If any of the parts are missing, return false
14
+ if (isNotDefined(policyParts.partition) ||
15
+ isNotDefined(policyParts.service) ||
16
+ isNotDefined(policyParts.region) ||
17
+ isNotDefined(policyParts.accountId) ||
18
+ isNotDefined(policyParts.resource)) {
19
+ return {
20
+ matches: false,
21
+ value: policyArn,
22
+ errors: ['Invalid ARN']
23
+ };
24
+ }
25
+ const resolvedPolicyArn = [
26
+ 'arn',
27
+ policyParts.partition,
28
+ policyParts.service,
29
+ policyParts.region,
30
+ policyParts.accountId,
31
+ policyParts.resource
32
+ ].map(part => convertIamString(part, request, { convertToRegex: false, replaceWildcards: false })).join(':');
33
+ const resolvedValue = resolvedPolicyArn == policyArn ? undefined : resolvedPolicyArn;
34
+ // If any of the parts are missing, return false
35
+ if (isNotDefined(requestParts.partition) ||
36
+ isNotDefined(requestParts.service) ||
37
+ isNotDefined(requestParts.region) ||
38
+ isNotDefined(requestParts.accountId) ||
39
+ isNotDefined(requestParts.resource)) {
40
+ return {
41
+ matches: false,
42
+ value: policyArn,
43
+ resolvedValue,
44
+ errors: [`request ARN '${requestArn}' is not a valid ARN`]
45
+ };
46
+ }
47
+ const allErrors = [];
48
+ const replaceAndMatch = (policyPart, requestPart) => {
49
+ const { pattern, errors } = convertIamString(policyPart, request, { replaceWildcards: true });
50
+ allErrors.push(...(errors || []));
51
+ return pattern.test(requestPart);
52
+ };
53
+ const matches = replaceAndMatch(policyParts.partition, requestParts.partition) &&
54
+ replaceAndMatch(policyParts.service, requestParts.service) &&
55
+ replaceAndMatch(policyParts.region, requestParts.region) &&
56
+ replaceAndMatch(policyParts.accountId, requestParts.accountId) &&
57
+ replaceAndMatch(policyParts.resource, requestParts.resource);
58
+ return {
59
+ matches: matches == expectMatch && allErrors.length == 0,
60
+ value: policyArn,
61
+ resolvedValue,
62
+ errors: allErrors.length > 0 ? allErrors : undefined
63
+ };
64
+ }
65
+ //# sourceMappingURL=arn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arn.js","sourceRoot":"","sources":["../../../../src/condition/arn/arn.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7E;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,UAAkB,EAAE,OAAmB,EAAE,WAAoB;IACzG,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IAC9C,gDAAgD;IAChD,IAAG,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC;QACnC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC;QACjC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC;QAChC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC;QACnC,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,CAAC,aAAa,CAAC;SACxB,CAAA;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG;QACxB,KAAK;QACL,WAAW,CAAC,SAAS;QACrB,WAAW,CAAC,OAAO;QACnB,WAAW,CAAC,MAAM;QAClB,WAAW,CAAC,SAAS;QACrB,WAAW,CAAC,QAAQ;KACrB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAC,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE1G,MAAM,aAAa,GAAG,iBAAiB,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAEpF,gDAAgD;IAChD,IAAG,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC;QAClC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC;QACjC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC;QACpC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,SAAS;YAChB,aAAa;YACb,MAAM,EAAE,CAAC,gBAAgB,UAAU,sBAAsB,CAAC;SAC3D,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,WAAmB,EAAW,EAAE;QAC3E,MAAM,EAAC,OAAO,EAAE,MAAM,EAAC,GAAG,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,IAAI,EAAC,CAAC,CAAA;QACzF,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAA;QACjC,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAClC,CAAC,CAAA;IAGD,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;QAC9D,eAAe,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;QAC1D,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;QACxD,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;QAC9D,eAAe,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;IAE5E,OAAO;QACL,OAAO,EAAE,OAAO,IAAI,WAAW,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;QACxD,KAAK,EAAE,SAAS;QAChB,aAAa;QACb,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACrD,CAAA;AACH,CAAC"}
@@ -2,11 +2,17 @@ import { BaseConditionOperator } from "./BaseConditionOperator.js";
2
2
  export interface BaseOperatorTest {
3
3
  name: string;
4
4
  requestContext?: {
5
- [key: string]: string;
5
+ [key: string]: string | string[];
6
6
  };
7
7
  policyValues: string[];
8
8
  testValue: string;
9
9
  expected: boolean;
10
+ explains?: {
11
+ value: string;
12
+ matches: boolean;
13
+ resolvedValue?: string;
14
+ errors?: string[];
15
+ }[];
10
16
  }
11
17
  export declare function testOperator(name: string, tests: BaseOperatorTest[], operator: BaseConditionOperator): void;
12
18
  //# sourceMappingURL=baseConditionperatorTests.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"baseConditionperatorTests.d.ts","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,qBAAqB,QAcpG"}
1
+ {"version":3,"file":"baseConditionperatorTests.d.ts","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;IACrD,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,OAAO,CAAA;QAChB,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAClB,EAAE,CAAA;CACJ;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,qBAAqB,QA6BpG"}
@@ -10,7 +10,23 @@ export function testOperator(name, tests, operator) {
10
10
  //When the condition is evaluated
11
11
  const result = operator.matches(request, test.testValue, test.policyValues);
12
12
  //Then the result should be as expected
13
- expect(result).toBe(test.expected);
13
+ expect(result.matches).toBe(test.expected);
14
+ if (test.explains) {
15
+ for (const explain of test.explains) {
16
+ const found = result.explains.find(e => e.value === explain.value);
17
+ expect(found, `Missing explain for ${explain.value}`).toBeDefined();
18
+ expect(found?.matches, `${explain.value} match`).toBe(explain.matches);
19
+ if (explain.resolvedValue) {
20
+ expect(found?.resolvedValue, `${explain.value} resolved value`).toBe(explain.resolvedValue);
21
+ }
22
+ else {
23
+ expect(found?.resolvedValue, `${explain.value} resolved value to be undefined`).toBeUndefined();
24
+ }
25
+ if (explain.errors) {
26
+ expect(found?.errors, `${explain.value} errors`).toEqual(explain.errors.sort());
27
+ }
28
+ }
29
+ }
14
30
  });
15
31
  }
16
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"baseConditionperatorTests.js","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAWzD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAyB,EAAE,QAA+B;IACnG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;QAClB,KAAI,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACjB,mBAAmB;gBACnB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAC,EAAE,EAAE,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC5H,iCAAiC;gBACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;gBAE3E,uCAAuC;gBACvC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpC,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"baseConditionperatorTests.js","sourceRoot":"","sources":["../../../src/condition/baseConditionperatorTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAiBzD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAyB,EAAE,QAA+B;IACnG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;QAClB,KAAI,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACjB,mBAAmB;gBACnB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAC,EAAE,EAAE,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC5H,iCAAiC;gBACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;gBAE3E,uCAAuC;gBACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAC1C,IAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACjB,KAAI,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACnC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;wBAClE,MAAM,CAAC,KAAK,EAAE,uBAAuB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;wBACnE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;wBACtE,IAAG,OAAO,CAAC,aAAa,EAAE,CAAC;4BACzB,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,KAAK,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;wBAC7F,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,KAAK,iCAAiC,CAAC,CAAC,aAAa,EAAE,CAAA;wBACjG,CAAC;wBACD,IAAG,OAAO,CAAC,MAAM,EAAE,CAAC;4BAClB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;wBACjF,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BinaryEquals.d.ts","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,qBAO1B,CAAA"}
1
+ {"version":3,"file":"BinaryEquals.d.ts","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGpE;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,qBAmB1B,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { resolvedValue } from "../conditionUtil.js";
1
2
  /**
2
3
  * For Binary we don't really have the ability to accept binary
3
4
  * values right now, so just do a string match.
@@ -5,9 +6,20 @@
5
6
  export const BinaryEquals = {
6
7
  name: 'BinaryEquals',
7
8
  matches: (request, keyValue, policyValues) => {
8
- return policyValues.includes(keyValue);
9
+ const explains = policyValues.map((policyValue) => {
10
+ return {
11
+ value: policyValue,
12
+ matches: policyValue === keyValue,
13
+ resolvedValue: resolvedValue(policyValue, request),
14
+ };
15
+ });
16
+ return {
17
+ matches: explains.some((explain) => explain.matches),
18
+ explains
19
+ };
9
20
  },
10
21
  allowsVariables: true,
11
- allowsWildcards: false
22
+ allowsWildcards: false,
23
+ isNegative: false
12
24
  };
13
25
  //# sourceMappingURL=BinaryEquals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BinaryEquals.js","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAC3C,OAAO,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,KAAK;CACvB,CAAA"}
1
+ {"version":3,"file":"BinaryEquals.js","sourceRoot":"","sources":["../../../../src/condition/binary/BinaryEquals.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAA4B,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;YACzE,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,WAAW,KAAK,QAAQ;gBACjC,aAAa,EAAE,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC;aACnD,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;YACpD,QAAQ;SACT,CAAA;IACH,CAAC;IACD,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,KAAK;IACtB,UAAU,EAAE,KAAK;CAClB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Bool.d.ts","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,eAAO,MAAM,IAAI,EAAE,qBAclB,CAAA"}
1
+ {"version":3,"file":"Bool.d.ts","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,eAAO,MAAM,IAAI,EAAE,qBAiDlB,CAAA"}
@@ -1,17 +1,46 @@
1
- import { convertIamStringToRegex } from "../../util.js";
1
+ import { convertIamString } from "../../util.js";
2
2
  export const Bool = {
3
3
  name: 'Bool',
4
4
  matches: (request, keyValue, policyValues) => {
5
- return policyValues.some(policyValue => {
6
- const pattern = convertIamStringToRegex(policyValue, request, { replaceWildcards: false });
7
- const lowercasePattern = pattern.source.toLowerCase();
8
- if (lowercasePattern != '^true$' && lowercasePattern != '^false$') {
9
- return false;
5
+ const explains = policyValues.map(policyValue => {
6
+ const { pattern, errors } = convertIamString(policyValue, request, { replaceWildcards: false });
7
+ if (errors && errors.length > 0) {
8
+ return {
9
+ value: policyValue,
10
+ matches: false,
11
+ errors
12
+ };
10
13
  }
11
- return new RegExp(pattern, 'i').test(keyValue);
14
+ const resolvedValue = convertIamString(policyValue, request, { replaceWildcards: false, convertToRegex: false });
15
+ const lowercaseResolvedValue = resolvedValue.toLowerCase();
16
+ if (lowercaseResolvedValue != 'true' && lowercaseResolvedValue != 'false') {
17
+ return {
18
+ matches: false,
19
+ value: policyValue,
20
+ errors: ['Invalid boolean pattern'],
21
+ resolvedValue: resolvedValue == policyValue ? undefined : resolvedValue
22
+ };
23
+ }
24
+ if (keyValue.toLowerCase() != 'true' && keyValue.toLowerCase() != 'false') {
25
+ return {
26
+ matches: false,
27
+ value: policyValue,
28
+ errors: [`request value '${keyValue}' is not a boolean`],
29
+ };
30
+ }
31
+ return {
32
+ matches: new RegExp(pattern, 'i').test(keyValue),
33
+ value: policyValue,
34
+ resolvedValue: resolvedValue == policyValue ? undefined : resolvedValue
35
+ };
12
36
  });
37
+ return {
38
+ matches: explains.some(explain => explain.matches),
39
+ explains
40
+ };
13
41
  },
14
42
  allowsVariables: true,
15
- allowsWildcards: false
43
+ allowsWildcards: false,
44
+ isNegative: false
16
45
  };
17
46
  //# sourceMappingURL=Bool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Bool.js","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,CAAC,MAAM,IAAI,GAA0B;IACzC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACrC,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,KAAK,EAAC,CAAC,CAAA;YACxF,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YACrD,IAAG,gBAAgB,IAAI,QAAQ,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;gBACjE,OAAO,KAAK,CAAA;YACd,CAAC;YACD,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,KAAK;CACvB,CAAA"}
1
+ {"version":3,"file":"Bool.js","sourceRoot":"","sources":["../../../../src/condition/boolean/Bool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,MAAM,CAAC,MAAM,IAAI,GAA0B;IACzC,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAE3C,MAAM,QAAQ,GAA4B,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YACvE,MAAM,EAAC,OAAO,EAAE,MAAM,EAAC,GAAG,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,KAAK,EAAC,CAAC,CAAA;YAC3F,IAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO;oBACL,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,KAAK;oBACd,MAAM;iBACP,CAAA;YACH,CAAC;YAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAC,CAAC,CAAA;YAC9G,MAAM,sBAAsB,GAAG,aAAa,CAAC,WAAW,EAAE,CAAA;YAE1D,IAAG,sBAAsB,IAAI,MAAM,IAAI,sBAAsB,IAAI,OAAO,EAAE,CAAC;gBACzE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,CAAC,yBAAyB,CAAC;oBACnC,aAAa,EAAE,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;iBACxE,CAAA;YACH,CAAC;YAED,IAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,CAAC,kBAAkB,QAAQ,oBAAoB,CAAC;iBACzD,CAAA;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAChD,KAAK,EAAE,WAAW;gBAClB,aAAa,EAAE,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;aACxE,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;YAClD,QAAQ;SACT,CAAA;IACH,CAAC;IACD,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,KAAK;IACtB,UAAU,EAAE,KAAK;CAClB,CAAA"}
@@ -1,6 +1,49 @@
1
1
  import { Condition } from '@cloud-copilot/iam-policy';
2
+ import { ConditionExplain, StatementExplain } from '../explain/statementExplain.js';
2
3
  import { AwsRequest } from '../request/request';
3
- export type ConditionMatchResult = 'Match' | 'NoMatch' | 'Unknown';
4
- export declare function requestMatchesConditions(request: AwsRequest, conditions: Condition[]): ConditionMatchResult;
5
- export declare function singleConditionMatchesRequest(request: AwsRequest, condition: Condition): ConditionMatchResult;
4
+ import { ContextKey } from '../requestContext.js';
5
+ import { BaseConditionOperator } from './BaseConditionOperator.js';
6
+ export type ConditionMatchResult = 'Match' | 'NoMatch';
7
+ /**
8
+ * Evaluate a set of conditions against a request
9
+ *
10
+ * @param request the request to test
11
+ * @param conditions the conditions to test
12
+ * @returns Match if all conditions match, NoMatch if any do not. Also returns all the details of the evaluation
13
+ */
14
+ export declare function requestMatchesConditions(request: AwsRequest, conditions: Condition[]): {
15
+ matches: ConditionMatchResult;
16
+ details: Pick<StatementExplain, 'conditions'>;
17
+ };
18
+ /**
19
+ * Checks to see if a single condition matches a request
20
+ *
21
+ * @param request the request to test
22
+ * @param condition the condition to test
23
+ * @returns the result of evaluating the condition
24
+ */
25
+ export declare function singleConditionMatchesRequest(request: AwsRequest, condition: Condition): ConditionExplain;
26
+ export declare function singleValueMatch(request: AwsRequest, condition: Condition, baseOperation: BaseConditionOperator, keyValue: ContextKey | undefined): ConditionExplain;
27
+ /**
28
+ * Tests a condition with a ForAllValues set operator
29
+ *
30
+ * @param request the request to test
31
+ * @param condition the condition with ForAllValues set operator
32
+ * @param keyExists whether the key exists in the request
33
+ * @param keyValue the value of the key in the request
34
+ * @param baseOperation the base operation to test the key against
35
+ * @returns the result of evaluating the ForAllValues set operator
36
+ */
37
+ export declare function forAllValuesMatch(request: AwsRequest, condition: Condition, keyValue: ContextKey | undefined, baseOperation: BaseConditionOperator): ConditionExplain;
38
+ /**
39
+ * Test a condition with a ForAnyValue set operator
40
+ *
41
+ * @param request the request to test
42
+ * @param condition the condition with ForAnyValue set operator
43
+ * @param keyExists whether the key exists in the request
44
+ * @param keyValue the value of the key in the request
45
+ * @param baseOperation the base operation to test the key against
46
+ * @returns the result of evaluating the ForAnyValue set operator
47
+ */
48
+ export declare function forAnyValueMatch(request: AwsRequest, condition: Condition, keyValue: ContextKey | undefined, baseOperation: BaseConditionOperator): ConditionExplain;
6
49
  //# sourceMappingURL=condition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../../src/condition/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AA4BhD,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;AAiBlE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAW3G;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,oBAAoB,CAiE7G"}
1
+ {"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../../src/condition/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAyB,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAC3G,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAuBnE,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,SAAS,CAAA;AAiBtD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG;IAAE,OAAO,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;CAAE,CASvK;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAuBzG;AA0BD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,qBAAqB,EACpC,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,gBAAgB,CA8CnF;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,aAAa,EAAE,qBAAqB,GAAG,gBAAgB,CA+ExF;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,aAAa,EAAE,qBAAqB,GAAG,gBAAgB,CAiEvF"}
@@ -36,22 +36,33 @@ const baseOperations = {};
36
36
  for (const operator of allOperators) {
37
37
  baseOperations[operator.name.toLowerCase()] = operator;
38
38
  }
39
+ /**
40
+ * Evaluate a set of conditions against a request
41
+ *
42
+ * @param request the request to test
43
+ * @param conditions the conditions to test
44
+ * @returns Match if all conditions match, NoMatch if any do not. Also returns all the details of the evaluation
45
+ */
39
46
  export function requestMatchesConditions(request, conditions) {
40
47
  const results = conditions.map(condition => singleConditionMatchesRequest(request, condition));
41
- const unknowns = results.filter(result => result === 'Unknown');
42
- if (unknowns.length > 0) {
43
- return 'Unknown';
44
- }
45
- const noMatches = results.filter(result => result === 'NoMatch');
46
- if (noMatches.length > 0) {
47
- return 'NoMatch';
48
- }
49
- return 'Match';
48
+ const nonMatch = results.some(result => !result.matches);
49
+ return {
50
+ matches: nonMatch ? 'NoMatch' : 'Match',
51
+ details: {
52
+ conditions: results
53
+ }
54
+ };
50
55
  }
56
+ /**
57
+ * Checks to see if a single condition matches a request
58
+ *
59
+ * @param request the request to test
60
+ * @param condition the condition to test
61
+ * @returns the result of evaluating the condition
62
+ */
51
63
  export function singleConditionMatchesRequest(request, condition) {
52
64
  const key = condition.conditionKey();
53
- const policyValues = condition.conditionValues();
54
- const baseOperation = baseOperations[condition.operation().baseOperator().toLowerCase()]?.matches;
65
+ const baseOperation = baseOperations[condition.operation().baseOperator().toLowerCase()];
55
66
  const keyExists = request.contextKeyExists(key);
56
67
  const keyValue = keyExists ? request.getContextKeyValue(key) : undefined;
57
68
  if (condition.operation().value().toLowerCase() == 'null' || condition.operation().baseOperator()?.toLowerCase() == 'null') {
@@ -60,60 +71,240 @@ export function singleConditionMatchesRequest(request, condition) {
60
71
  if (condition.operation().setOperator()) {
61
72
  const setOperator = condition.operation().setOperator();
62
73
  if (setOperator === 'ForAnyValue') {
63
- if (!keyExists || !keyValue || !keyValue.isArrayValue()) {
64
- return 'NoMatch';
65
- }
66
- if (!baseOperation) {
67
- return 'Unknown';
68
- }
69
- //Do the loop
70
- const anyMatch = keyValue.values.some(value => {
71
- return baseOperation(request, value, policyValues);
72
- });
73
- return anyMatch ? 'Match' : 'NoMatch';
74
+ return forAnyValueMatch(request, condition, keyValue, baseOperation);
74
75
  }
75
76
  else if (setOperator === 'ForAllValues') {
76
- if (!keyExists) {
77
- return 'Match';
78
- }
79
- if (!keyValue || !keyValue.isArrayValue()) {
80
- return 'NoMatch';
81
- }
82
- if (!baseOperation) {
83
- return 'Unknown';
84
- }
85
- //Do the loop
86
- const anyNotMatch = keyValue.values.some(value => {
87
- return !baseOperation(request, value, policyValues);
88
- });
89
- return anyNotMatch ? 'NoMatch' : 'Match';
77
+ return forAllValuesMatch(request, condition, keyValue, baseOperation);
90
78
  }
91
79
  else {
92
80
  throw new Error(`Unknown set operator: ${setOperator}`);
93
81
  }
94
82
  }
95
- if (condition.operation().isIfExists() || condition.operation().baseOperator().toLowerCase().includes('not')) {
83
+ return singleValueMatch(request, condition, baseOperation, keyValue);
84
+ }
85
+ /**
86
+ * Tests a condition with a null operator
87
+ *
88
+ * @param condition the condition to test
89
+ * @param keyExists whether the key exists in the request
90
+ * @returns the result of evaluating the null operator
91
+ */
92
+ function testNull(condition, keyExists) {
93
+ const goalValue = keyExists ? 'false' : 'true';
94
+ const conditionValues = condition.conditionValues().map(value => {
95
+ return {
96
+ value,
97
+ matches: value.toLowerCase() === goalValue
98
+ };
99
+ });
100
+ return {
101
+ operator: condition.operation().value(),
102
+ conditionKeyValue: condition.conditionKey(),
103
+ values: conditionValues,
104
+ matches: conditionValues.some(value => value.matches)
105
+ };
106
+ }
107
+ export function singleValueMatch(request, condition, baseOperation, keyValue) {
108
+ const isNotOperator = condition.operation().baseOperator().toLowerCase().includes('not');
109
+ if (condition.operation().isIfExists() || isNotOperator) {
96
110
  //Check if it exists, return true if it doesn't
97
111
  //Double check what happens here if the key is not a valid key or is of the wrong type
98
- if (!keyExists) {
99
- return 'Match';
112
+ if (!keyValue) {
113
+ return {
114
+ operator: condition.operation().value(),
115
+ conditionKeyValue: condition.conditionKey(),
116
+ values: [],
117
+ matches: true,
118
+ matchedBecauseMissing: true
119
+ };
100
120
  }
101
121
  }
102
122
  if (!keyValue || !keyValue.isStringValue()) {
103
123
  //Set operator is required for a multi-value key
104
- return 'NoMatch';
124
+ return {
125
+ operator: condition.operation().value(),
126
+ conditionKeyValue: condition.conditionKey(),
127
+ values: [],
128
+ matches: false,
129
+ failedBecauseMissing: !keyValue,
130
+ failedBecauseArray: keyValue?.isArrayValue(),
131
+ };
105
132
  }
106
133
  if (!baseOperation) {
107
- return 'Unknown';
134
+ return {
135
+ operator: condition.operation().value(),
136
+ conditionKeyValue: condition.conditionKey(),
137
+ values: [],
138
+ matches: false,
139
+ missingOperator: true
140
+ };
108
141
  }
109
- const matches = baseOperation(request, keyValue.value, policyValues);
110
- return matches ? 'Match' : 'NoMatch';
142
+ const { matches, explains } = baseOperation.matches(request, keyValue.value, condition.conditionValues());
143
+ return {
144
+ matches,
145
+ operator: condition.operation().value(),
146
+ conditionKeyValue: condition.conditionKey(),
147
+ values: condition.valueIsArray() ? explains : explains[0]
148
+ };
111
149
  }
112
- function testNull(condition, keyExists) {
113
- const lowerCaseValues = condition.conditionValues().map(value => value.toLowerCase());
114
- if (keyExists) {
115
- return lowerCaseValues.includes('false') ? 'Match' : 'NoMatch';
150
+ /**
151
+ * Tests a condition with a ForAllValues set operator
152
+ *
153
+ * @param request the request to test
154
+ * @param condition the condition with ForAllValues set operator
155
+ * @param keyExists whether the key exists in the request
156
+ * @param keyValue the value of the key in the request
157
+ * @param baseOperation the base operation to test the key against
158
+ * @returns the result of evaluating the ForAllValues set operator
159
+ */
160
+ export function forAllValuesMatch(request, condition, keyValue, baseOperation) {
161
+ if (!keyValue) {
162
+ return {
163
+ operator: condition.operation().value(),
164
+ conditionKeyValue: condition.conditionKey(),
165
+ values: [],
166
+ matches: true,
167
+ matchedBecauseMissing: true
168
+ };
169
+ // return 'Match'
170
+ }
171
+ if (!keyValue || !keyValue.isArrayValue()) {
172
+ return {
173
+ operator: condition.operation().value(),
174
+ conditionKeyValue: condition.conditionKey(),
175
+ values: [],
176
+ matches: false,
177
+ failedBecauseMissing: !keyValue,
178
+ failedBecauseNotArray: !!keyValue && !keyValue.isArrayValue()
179
+ };
180
+ // return 'NoMatch'
181
+ }
182
+ if (!baseOperation) {
183
+ //TODO: This should return a nomatch rather than throw an error
184
+ return {
185
+ operator: condition.operation().value(),
186
+ conditionKeyValue: condition.conditionKey(),
187
+ values: [],
188
+ matches: false,
189
+ missingOperator: true
190
+ };
191
+ }
192
+ const valueExplains = keyValue.values.map(value => {
193
+ const { matches, explains } = baseOperation.matches(request, value, condition.conditionValues());
194
+ return {
195
+ requestValue: value,
196
+ matches,
197
+ explains
198
+ };
199
+ });
200
+ const anyNonMatches = valueExplains.some(valueExplain => !valueExplain.matches);
201
+ const overallMatch = !anyNonMatches;
202
+ const unmatchedValues = [];
203
+ const explains = {};
204
+ for (const valueExplain of valueExplains) {
205
+ if (!baseOperation.isNegative && !valueExplain.matches) {
206
+ unmatchedValues.push(valueExplain.requestValue);
207
+ }
208
+ else if (baseOperation.isNegative && valueExplain.matches) {
209
+ unmatchedValues.push(valueExplain.requestValue);
210
+ }
211
+ for (const explain of valueExplain.explains) {
212
+ let theExplain = explains[explain.value];
213
+ if (!theExplain) {
214
+ explains[explain.value] = {
215
+ value: explain.value,
216
+ matches: overallMatch
217
+ };
218
+ theExplain = explains[explain.value];
219
+ }
220
+ if (explain.matches && !baseOperation.isNegative) {
221
+ theExplain.matchingValues = theExplain.matchingValues || [];
222
+ theExplain.matchingValues.push(valueExplain.requestValue);
223
+ }
224
+ else if (!explain.matches && baseOperation.isNegative) {
225
+ theExplain.negativeMatchingValues = theExplain.negativeMatchingValues || [];
226
+ theExplain.negativeMatchingValues.push(valueExplain.requestValue);
227
+ }
228
+ }
229
+ }
230
+ return {
231
+ operator: condition.operation().value(),
232
+ conditionKeyValue: condition.conditionKey(),
233
+ values: Object.values(explains),
234
+ matches: overallMatch,
235
+ unmatchedValues
236
+ };
237
+ }
238
+ /**
239
+ * Test a condition with a ForAnyValue set operator
240
+ *
241
+ * @param request the request to test
242
+ * @param condition the condition with ForAnyValue set operator
243
+ * @param keyExists whether the key exists in the request
244
+ * @param keyValue the value of the key in the request
245
+ * @param baseOperation the base operation to test the key against
246
+ * @returns the result of evaluating the ForAnyValue set operator
247
+ */
248
+ export function forAnyValueMatch(request, condition, keyValue, baseOperation) {
249
+ if (!keyValue || !keyValue.isArrayValue()) {
250
+ return {
251
+ operator: condition.operation().value(),
252
+ conditionKeyValue: condition.conditionKey(),
253
+ values: [],
254
+ matches: false,
255
+ failedBecauseMissing: !keyValue,
256
+ failedBecauseNotArray: keyValue && !keyValue.isArrayValue()
257
+ };
258
+ // return 'NoMatch'
259
+ }
260
+ if (!baseOperation) {
261
+ return {
262
+ operator: condition.operation().value(),
263
+ conditionKeyValue: condition.conditionKey(),
264
+ values: [],
265
+ matches: false,
266
+ missingOperator: true
267
+ };
268
+ }
269
+ const valueExplains = keyValue.values.map(value => {
270
+ const { matches, explains } = baseOperation.matches(request, value, condition.conditionValues());
271
+ return {
272
+ requestValue: value,
273
+ matches,
274
+ explains
275
+ };
276
+ });
277
+ const overallMatch = valueExplains.some(valueExplain => valueExplain.matches);
278
+ const unmatchedValues = [];
279
+ const explains = {};
280
+ for (const valueExplain of valueExplains) {
281
+ if (!baseOperation.isNegative && !valueExplain.matches) {
282
+ unmatchedValues.push(valueExplain.requestValue);
283
+ }
284
+ else if (baseOperation.isNegative && valueExplain.matches) {
285
+ unmatchedValues.push(valueExplain.requestValue);
286
+ }
287
+ for (const explain of valueExplain.explains) {
288
+ let theExplain = explains[explain.value];
289
+ if (!theExplain) {
290
+ explains[explain.value] = {
291
+ value: explain.value,
292
+ matches: overallMatch
293
+ };
294
+ theExplain = explains[explain.value];
295
+ }
296
+ if (explain.matches) {
297
+ theExplain.matchingValues = theExplain.matchingValues || [];
298
+ theExplain.matchingValues.push(valueExplain.requestValue);
299
+ }
300
+ }
116
301
  }
117
- return lowerCaseValues.includes('true') ? 'Match' : 'NoMatch';
302
+ return {
303
+ operator: condition.operation().value(),
304
+ conditionKeyValue: condition.conditionKey(),
305
+ values: Object.values(explains),
306
+ matches: overallMatch,
307
+ unmatchedValues
308
+ };
118
309
  }
119
310
  //# sourceMappingURL=condition.js.map