@ankhorage/deploy 0.7.0 → 0.8.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 (297) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +4 -1
  3. package/dist/domain/monetization/MonetizationBasePrice.d.ts +6 -0
  4. package/dist/domain/monetization/MonetizationBasePrice.d.ts.map +1 -0
  5. package/dist/domain/monetization/MonetizationBasePrice.js +2 -0
  6. package/dist/domain/monetization/MonetizationBasePrice.js.map +1 -0
  7. package/dist/domain/monetization/MonetizationDesiredState.d.ts +6 -0
  8. package/dist/domain/monetization/MonetizationDesiredState.d.ts.map +1 -0
  9. package/dist/domain/monetization/MonetizationDesiredState.js +2 -0
  10. package/dist/domain/monetization/MonetizationDesiredState.js.map +1 -0
  11. package/dist/domain/monetization/MonetizationDiagnostic.d.ts +9 -0
  12. package/dist/domain/monetization/MonetizationDiagnostic.d.ts.map +1 -0
  13. package/dist/domain/monetization/MonetizationDiagnostic.js +2 -0
  14. package/dist/domain/monetization/MonetizationDiagnostic.js.map +1 -0
  15. package/dist/domain/monetization/MonetizationLocalization.d.ts +6 -0
  16. package/dist/domain/monetization/MonetizationLocalization.d.ts.map +1 -0
  17. package/dist/domain/monetization/MonetizationLocalization.js +2 -0
  18. package/dist/domain/monetization/MonetizationLocalization.js.map +1 -0
  19. package/dist/domain/monetization/MonetizationObservedProduct.d.ts +12 -0
  20. package/dist/domain/monetization/MonetizationObservedProduct.d.ts.map +1 -0
  21. package/dist/domain/monetization/MonetizationObservedProduct.js +2 -0
  22. package/dist/domain/monetization/MonetizationObservedProduct.js.map +1 -0
  23. package/dist/domain/monetization/MonetizationPlan.d.ts +10 -0
  24. package/dist/domain/monetization/MonetizationPlan.d.ts.map +1 -0
  25. package/dist/domain/monetization/MonetizationPlan.js +2 -0
  26. package/dist/domain/monetization/MonetizationPlan.js.map +1 -0
  27. package/dist/domain/monetization/MonetizationPlanStep.d.ts +7 -0
  28. package/dist/domain/monetization/MonetizationPlanStep.d.ts.map +1 -0
  29. package/dist/domain/monetization/MonetizationPlanStep.js +2 -0
  30. package/dist/domain/monetization/MonetizationPlanStep.js.map +1 -0
  31. package/dist/domain/monetization/MonetizationProduct.d.ts +12 -0
  32. package/dist/domain/monetization/MonetizationProduct.d.ts.map +1 -0
  33. package/dist/domain/monetization/MonetizationProduct.js +2 -0
  34. package/dist/domain/monetization/MonetizationProduct.js.map +1 -0
  35. package/dist/domain/monetization/MonetizationSubscription.d.ts +7 -0
  36. package/dist/domain/monetization/MonetizationSubscription.d.ts.map +1 -0
  37. package/dist/domain/monetization/MonetizationSubscription.js +2 -0
  38. package/dist/domain/monetization/MonetizationSubscription.js.map +1 -0
  39. package/dist/domain/monetization/MonetizationTargetState.d.ts +9 -0
  40. package/dist/domain/monetization/MonetizationTargetState.d.ts.map +1 -0
  41. package/dist/domain/monetization/MonetizationTargetState.js +2 -0
  42. package/dist/domain/monetization/MonetizationTargetState.js.map +1 -0
  43. package/dist/domain/monetization/createMonetizationCurrentRevision.d.ts +3 -0
  44. package/dist/domain/monetization/createMonetizationCurrentRevision.d.ts.map +1 -0
  45. package/dist/domain/monetization/createMonetizationCurrentRevision.js +13 -0
  46. package/dist/domain/monetization/createMonetizationCurrentRevision.js.map +1 -0
  47. package/dist/domain/monetization/createMonetizationPlan.d.ts +9 -0
  48. package/dist/domain/monetization/createMonetizationPlan.d.ts.map +1 -0
  49. package/dist/domain/monetization/createMonetizationPlan.js +94 -0
  50. package/dist/domain/monetization/createMonetizationPlan.js.map +1 -0
  51. package/dist/index.d.ts +10 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/project/index.d.ts +13 -0
  55. package/dist/project/index.d.ts.map +1 -1
  56. package/dist/project/index.js +4 -0
  57. package/dist/project/index.js.map +1 -1
  58. package/dist/project/io/assertContainedPath.d.ts.map +1 -1
  59. package/dist/project/io/assertContainedPath.js +4 -3
  60. package/dist/project/io/assertContainedPath.js.map +1 -1
  61. package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.d.ts +8 -0
  62. package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.d.ts.map +1 -0
  63. package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.js +2 -0
  64. package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.js.map +1 -0
  65. package/dist/project/monetization/InspectProjectMonetizationOptions.d.ts +5 -0
  66. package/dist/project/monetization/InspectProjectMonetizationOptions.d.ts.map +1 -0
  67. package/dist/project/monetization/InspectProjectMonetizationOptions.js +2 -0
  68. package/dist/project/monetization/InspectProjectMonetizationOptions.js.map +1 -0
  69. package/dist/project/monetization/ProjectMonetizationAccess.d.ts +7 -0
  70. package/dist/project/monetization/ProjectMonetizationAccess.d.ts.map +1 -0
  71. package/dist/project/monetization/ProjectMonetizationAccess.js +2 -0
  72. package/dist/project/monetization/ProjectMonetizationAccess.js.map +1 -0
  73. package/dist/project/monetization/ProjectMonetizationExecutionResult.d.ts +16 -0
  74. package/dist/project/monetization/ProjectMonetizationExecutionResult.d.ts.map +1 -0
  75. package/dist/project/monetization/ProjectMonetizationExecutionResult.js +2 -0
  76. package/dist/project/monetization/ProjectMonetizationExecutionResult.js.map +1 -0
  77. package/dist/project/monetization/ProjectMonetizationInspection.d.ts +13 -0
  78. package/dist/project/monetization/ProjectMonetizationInspection.d.ts.map +1 -0
  79. package/dist/project/monetization/ProjectMonetizationInspection.js +2 -0
  80. package/dist/project/monetization/ProjectMonetizationInspection.js.map +1 -0
  81. package/dist/project/monetization/ProjectMonetizationInspectionResult.d.ts +10 -0
  82. package/dist/project/monetization/ProjectMonetizationInspectionResult.d.ts.map +1 -0
  83. package/dist/project/monetization/ProjectMonetizationInspectionResult.js +2 -0
  84. package/dist/project/monetization/ProjectMonetizationInspectionResult.js.map +1 -0
  85. package/dist/project/monetization/ProjectMonetizationPlan.d.ts +6 -0
  86. package/dist/project/monetization/ProjectMonetizationPlan.d.ts.map +1 -0
  87. package/dist/project/monetization/ProjectMonetizationPlan.js +2 -0
  88. package/dist/project/monetization/ProjectMonetizationPlan.js.map +1 -0
  89. package/dist/project/monetization/ProjectMonetizationRuntime.d.ts +12 -0
  90. package/dist/project/monetization/ProjectMonetizationRuntime.d.ts.map +1 -0
  91. package/dist/project/monetization/ProjectMonetizationRuntime.js +2 -0
  92. package/dist/project/monetization/ProjectMonetizationRuntime.js.map +1 -0
  93. package/dist/project/monetization/ProjectMonetizationTargets.d.ts +5 -0
  94. package/dist/project/monetization/ProjectMonetizationTargets.d.ts.map +1 -0
  95. package/dist/project/monetization/ProjectMonetizationTargets.js +2 -0
  96. package/dist/project/monetization/ProjectMonetizationTargets.js.map +1 -0
  97. package/dist/project/monetization/ResolvedProjectMonetizationAccess.d.ts +7 -0
  98. package/dist/project/monetization/ResolvedProjectMonetizationAccess.d.ts.map +1 -0
  99. package/dist/project/monetization/ResolvedProjectMonetizationAccess.js +2 -0
  100. package/dist/project/monetization/ResolvedProjectMonetizationAccess.js.map +1 -0
  101. package/dist/project/monetization/areProjectMonetizationPlansEqual.d.ts +3 -0
  102. package/dist/project/monetization/areProjectMonetizationPlansEqual.d.ts.map +1 -0
  103. package/dist/project/monetization/areProjectMonetizationPlansEqual.js +4 -0
  104. package/dist/project/monetization/areProjectMonetizationPlansEqual.js.map +1 -0
  105. package/dist/project/monetization/createProjectMonetizationPlan.d.ts +4 -0
  106. package/dist/project/monetization/createProjectMonetizationPlan.d.ts.map +1 -0
  107. package/dist/project/monetization/createProjectMonetizationPlan.js +14 -0
  108. package/dist/project/monetization/createProjectMonetizationPlan.js.map +1 -0
  109. package/dist/project/monetization/createProjectMonetizationRevision.d.ts +3 -0
  110. package/dist/project/monetization/createProjectMonetizationRevision.d.ts.map +1 -0
  111. package/dist/project/monetization/createProjectMonetizationRevision.js +5 -0
  112. package/dist/project/monetization/createProjectMonetizationRevision.js.map +1 -0
  113. package/dist/project/monetization/defaultProjectMonetizationRuntime.d.ts +3 -0
  114. package/dist/project/monetization/defaultProjectMonetizationRuntime.d.ts.map +1 -0
  115. package/dist/project/monetization/defaultProjectMonetizationRuntime.js +12 -0
  116. package/dist/project/monetization/defaultProjectMonetizationRuntime.js.map +1 -0
  117. package/dist/project/monetization/executeProjectMonetizationSync.d.ts +4 -0
  118. package/dist/project/monetization/executeProjectMonetizationSync.d.ts.map +1 -0
  119. package/dist/project/monetization/executeProjectMonetizationSync.js +6 -0
  120. package/dist/project/monetization/executeProjectMonetizationSync.js.map +1 -0
  121. package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.d.ts +5 -0
  122. package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.d.ts.map +1 -0
  123. package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.js +63 -0
  124. package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.js.map +1 -0
  125. package/dist/project/monetization/executeProjectMonetizationTargets.d.ts +23 -0
  126. package/dist/project/monetization/executeProjectMonetizationTargets.d.ts.map +1 -0
  127. package/dist/project/monetization/executeProjectMonetizationTargets.js +66 -0
  128. package/dist/project/monetization/executeProjectMonetizationTargets.js.map +1 -0
  129. package/dist/project/monetization/inspectProjectMonetization.d.ts +4 -0
  130. package/dist/project/monetization/inspectProjectMonetization.d.ts.map +1 -0
  131. package/dist/project/monetization/inspectProjectMonetization.js +6 -0
  132. package/dist/project/monetization/inspectProjectMonetization.js.map +1 -0
  133. package/dist/project/monetization/inspectProjectMonetizationWithRuntime.d.ts +5 -0
  134. package/dist/project/monetization/inspectProjectMonetizationWithRuntime.d.ts.map +1 -0
  135. package/dist/project/monetization/inspectProjectMonetizationWithRuntime.js +78 -0
  136. package/dist/project/monetization/inspectProjectMonetizationWithRuntime.js.map +1 -0
  137. package/dist/project/monetization/parseProjectMonetization.d.ts +3 -0
  138. package/dist/project/monetization/parseProjectMonetization.d.ts.map +1 -0
  139. package/dist/project/monetization/parseProjectMonetization.js +127 -0
  140. package/dist/project/monetization/parseProjectMonetization.js.map +1 -0
  141. package/dist/project/monetization/readProjectMonetization.d.ts +5 -0
  142. package/dist/project/monetization/readProjectMonetization.d.ts.map +1 -0
  143. package/dist/project/monetization/readProjectMonetization.js +19 -0
  144. package/dist/project/monetization/readProjectMonetization.js.map +1 -0
  145. package/dist/project/monetization/resolveProjectMonetizationAccess.d.ts +4 -0
  146. package/dist/project/monetization/resolveProjectMonetizationAccess.d.ts.map +1 -0
  147. package/dist/project/monetization/resolveProjectMonetizationAccess.js +7 -0
  148. package/dist/project/monetization/resolveProjectMonetizationAccess.js.map +1 -0
  149. package/dist/project/monetization/resolveProjectMonetizationTargets.d.ts +13 -0
  150. package/dist/project/monetization/resolveProjectMonetizationTargets.d.ts.map +1 -0
  151. package/dist/project/monetization/resolveProjectMonetizationTargets.js +27 -0
  152. package/dist/project/monetization/resolveProjectMonetizationTargets.js.map +1 -0
  153. package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.d.ts +14 -0
  154. package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.d.ts.map +1 -0
  155. package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.js +2 -0
  156. package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.js.map +1 -0
  157. package/dist/providers/appStoreConnect/AppStoreMonetizationResult.d.ts +14 -0
  158. package/dist/providers/appStoreConnect/AppStoreMonetizationResult.d.ts.map +1 -0
  159. package/dist/providers/appStoreConnect/AppStoreMonetizationResult.js +2 -0
  160. package/dist/providers/appStoreConnect/AppStoreMonetizationResult.js.map +1 -0
  161. package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.d.ts +32 -0
  162. package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.d.ts.map +1 -0
  163. package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.js +2 -0
  164. package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.js.map +1 -0
  165. package/dist/providers/appStoreConnect/AppStoreProductVersion.d.ts +7 -0
  166. package/dist/providers/appStoreConnect/AppStoreProductVersion.d.ts.map +1 -0
  167. package/dist/providers/appStoreConnect/AppStoreProductVersion.js +2 -0
  168. package/dist/providers/appStoreConnect/AppStoreProductVersion.js.map +1 -0
  169. package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.d.ts +5 -0
  170. package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.d.ts.map +1 -0
  171. package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.js +2 -0
  172. package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.js.map +1 -0
  173. package/dist/providers/appStoreConnect/appStoreMonetizationUrls.d.ts +25 -0
  174. package/dist/providers/appStoreConnect/appStoreMonetizationUrls.d.ts.map +1 -0
  175. package/dist/providers/appStoreConnect/appStoreMonetizationUrls.js +67 -0
  176. package/dist/providers/appStoreConnect/appStoreMonetizationUrls.js.map +1 -0
  177. package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.d.ts +10 -0
  178. package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.d.ts.map +1 -0
  179. package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.js +67 -0
  180. package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.js.map +1 -0
  181. package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.d.ts +8 -0
  182. package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.d.ts.map +1 -0
  183. package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.js +67 -0
  184. package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.js.map +1 -0
  185. package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.d.ts +10 -0
  186. package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.d.ts.map +1 -0
  187. package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.js +78 -0
  188. package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.js.map +1 -0
  189. package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.d.ts +19 -0
  190. package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.d.ts.map +1 -0
  191. package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.js +117 -0
  192. package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.js.map +1 -0
  193. package/dist/providers/appStoreConnect/inspectAppStoreMonetization.d.ts +16 -0
  194. package/dist/providers/appStoreConnect/inspectAppStoreMonetization.d.ts.map +1 -0
  195. package/dist/providers/appStoreConnect/inspectAppStoreMonetization.js +53 -0
  196. package/dist/providers/appStoreConnect/inspectAppStoreMonetization.js.map +1 -0
  197. package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.d.ts +3 -0
  198. package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.d.ts.map +1 -0
  199. package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.js +14 -0
  200. package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.js.map +1 -0
  201. package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.d.ts +5 -0
  202. package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.d.ts.map +1 -0
  203. package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.js +65 -0
  204. package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.js.map +1 -0
  205. package/dist/providers/appStoreConnect/readAppStoreCollection.d.ts +11 -0
  206. package/dist/providers/appStoreConnect/readAppStoreCollection.d.ts.map +1 -0
  207. package/dist/providers/appStoreConnect/readAppStoreCollection.js +43 -0
  208. package/dist/providers/appStoreConnect/readAppStoreCollection.js.map +1 -0
  209. package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.d.ts +17 -0
  210. package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.d.ts.map +1 -0
  211. package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.js +114 -0
  212. package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.js.map +1 -0
  213. package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.d.ts +11 -0
  214. package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.d.ts.map +1 -0
  215. package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.js +210 -0
  216. package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.js.map +1 -0
  217. package/dist/providers/appStoreConnect/readAppStoreProductVersion.d.ts +9 -0
  218. package/dist/providers/appStoreConnect/readAppStoreProductVersion.d.ts.map +1 -0
  219. package/dist/providers/appStoreConnect/readAppStoreProductVersion.js +56 -0
  220. package/dist/providers/appStoreConnect/readAppStoreProductVersion.js.map +1 -0
  221. package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.d.ts +9 -0
  222. package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.d.ts.map +1 -0
  223. package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.js +44 -0
  224. package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.js.map +1 -0
  225. package/dist/providers/appStoreConnect/resolveAppStorePricePoint.d.ts +11 -0
  226. package/dist/providers/appStoreConnect/resolveAppStorePricePoint.d.ts.map +1 -0
  227. package/dist/providers/appStoreConnect/resolveAppStorePricePoint.js +46 -0
  228. package/dist/providers/appStoreConnect/resolveAppStorePricePoint.js.map +1 -0
  229. package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.d.ts +10 -0
  230. package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.d.ts.map +1 -0
  231. package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.js +80 -0
  232. package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.js.map +1 -0
  233. package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.d.ts +3 -0
  234. package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.d.ts.map +1 -0
  235. package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.js +15 -0
  236. package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.js.map +1 -0
  237. package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.d.ts +2 -0
  238. package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.d.ts.map +1 -0
  239. package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.js +255 -0
  240. package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.js.map +1 -0
  241. package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.d.ts +11 -0
  242. package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.d.ts.map +1 -0
  243. package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.js +83 -0
  244. package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.js.map +1 -0
  245. package/dist/providers/appStoreConnect/updateAppStoreSubscription.d.ts +9 -0
  246. package/dist/providers/appStoreConnect/updateAppStoreSubscription.d.ts.map +1 -0
  247. package/dist/providers/appStoreConnect/updateAppStoreSubscription.js +24 -0
  248. package/dist/providers/appStoreConnect/updateAppStoreSubscription.js.map +1 -0
  249. package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.d.ts +13 -0
  250. package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.d.ts.map +1 -0
  251. package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.js +94 -0
  252. package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.js.map +1 -0
  253. package/dist/providers/googlePlay/GooglePlayMonetizationResult.d.ts +24 -0
  254. package/dist/providers/googlePlay/GooglePlayMonetizationResult.d.ts.map +1 -0
  255. package/dist/providers/googlePlay/GooglePlayMonetizationResult.js +2 -0
  256. package/dist/providers/googlePlay/GooglePlayMonetizationResult.js.map +1 -0
  257. package/dist/providers/googlePlay/GooglePlayPriceConversion.d.ts +4 -0
  258. package/dist/providers/googlePlay/GooglePlayPriceConversion.d.ts.map +1 -0
  259. package/dist/providers/googlePlay/GooglePlayPriceConversion.js +2 -0
  260. package/dist/providers/googlePlay/GooglePlayPriceConversion.js.map +1 -0
  261. package/dist/providers/googlePlay/convertGooglePlayRegionPrices.d.ts +10 -0
  262. package/dist/providers/googlePlay/convertGooglePlayRegionPrices.d.ts.map +1 -0
  263. package/dist/providers/googlePlay/convertGooglePlayRegionPrices.js +32 -0
  264. package/dist/providers/googlePlay/convertGooglePlayRegionPrices.js.map +1 -0
  265. package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.d.ts +18 -0
  266. package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.d.ts.map +1 -0
  267. package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.js +97 -0
  268. package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.js.map +1 -0
  269. package/dist/providers/googlePlay/googlePlayMonetizationUrls.d.ts +11 -0
  270. package/dist/providers/googlePlay/googlePlayMonetizationUrls.d.ts.map +1 -0
  271. package/dist/providers/googlePlay/googlePlayMonetizationUrls.js +36 -0
  272. package/dist/providers/googlePlay/googlePlayMonetizationUrls.js.map +1 -0
  273. package/dist/providers/googlePlay/inspectGooglePlayMonetization.d.ts +15 -0
  274. package/dist/providers/googlePlay/inspectGooglePlayMonetization.d.ts.map +1 -0
  275. package/dist/providers/googlePlay/inspectGooglePlayMonetization.js +49 -0
  276. package/dist/providers/googlePlay/inspectGooglePlayMonetization.js.map +1 -0
  277. package/dist/providers/googlePlay/normalizeGooglePlayMonetization.d.ts +8 -0
  278. package/dist/providers/googlePlay/normalizeGooglePlayMonetization.d.ts.map +1 -0
  279. package/dist/providers/googlePlay/normalizeGooglePlayMonetization.js +169 -0
  280. package/dist/providers/googlePlay/normalizeGooglePlayMonetization.js.map +1 -0
  281. package/dist/providers/googlePlay/readGooglePlayMonetizationResources.d.ts +12 -0
  282. package/dist/providers/googlePlay/readGooglePlayMonetizationResources.d.ts.map +1 -0
  283. package/dist/providers/googlePlay/readGooglePlayMonetizationResources.js +62 -0
  284. package/dist/providers/googlePlay/readGooglePlayMonetizationResources.js.map +1 -0
  285. package/dist/providers/googlePlay/toGooglePlayMoney.d.ts +3 -0
  286. package/dist/providers/googlePlay/toGooglePlayMoney.d.ts.map +1 -0
  287. package/dist/providers/googlePlay/toGooglePlayMoney.js +11 -0
  288. package/dist/providers/googlePlay/toGooglePlayMoney.js.map +1 -0
  289. package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.d.ts +10 -0
  290. package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.d.ts.map +1 -0
  291. package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.js +121 -0
  292. package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.js.map +1 -0
  293. package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.d.ts +13 -0
  294. package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.d.ts.map +1 -0
  295. package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.js +127 -0
  296. package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.js.map +1 -0
  297. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectAppStoreMonetization.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/inspectAppStoreMonetization.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAI/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAQjD;IACC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,4BAA4B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,gCAAgC,CAAC;QACtD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,IAAI,QAAQ,KAAK,cAAc;QAAE,OAAO,WAAW,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACxE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,6BAA6B,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;AAClG,CAAC;AAED,SAAS,eAAe,CAAC,MAAwB;IAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC,CAAC;IACjG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC,CAAC;IACjG,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,IAAI,EAAE,0CAA0C;YAChD,OAAO,EAAE,sDAAsD;YAC/D,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,mBAAmB;SAC9B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,MAAM,CACb,IAAwC,EACxC,IAAY;IAEZ,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE;YACN,IAAI;YACJ,QAAQ,EAAE,mBAAmB;YAC7B,MAAM,EAAE,KAAK;YACb,IAAI;YACJ,OAAO,EAAE,kDAAkD;SAC5D;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';\nimport type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';\nimport type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';\nimport { trackAppStoreConnectRequests } from './AppStoreConnectRequestTracker';\nimport type { AppStoreConnectTokenFactory } from './AppStoreConnectTokenFactory';\nimport type { AppStoreConnectTransport } from './AppStoreConnectTransport';\nimport type { AppStoreMonetizationInspectionResult } from './AppStoreMonetizationResult';\nimport { normalizeAppStoreMonetization } from './normalizeAppStoreMonetization';\nimport { readAppStoreMonetizationSnapshot } from './readAppStoreMonetizationSnapshot';\nimport { resolveAppStoreConnectToken } from './resolveAppStoreConnectToken';\n\nexport async function inspectAppStoreMonetization(options: {\n readonly bundleIdentifier: string;\n readonly desired: MonetizationDesiredState;\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly createToken: AppStoreConnectTokenFactory;\n readonly request: AppStoreConnectTransport;\n readonly now: Date;\n}): Promise<AppStoreMonetizationInspectionResult> {\n const access = await resolveAppStoreConnectToken(options);\n if (!access.ok) return { status: 'action-required', action: access.action };\n const tracker = trackAppStoreConnectRequests(options.request);\n const snapshot = await readAppStoreMonetizationSnapshot({\n bundleIdentifier: options.bundleIdentifier,\n desired: options.desired,\n token: access.token,\n request: tracker.request,\n now: options.now,\n });\n if (snapshot === 'app-required') return appRequired();\n if (snapshot === null) return providerFailure(tracker.blockingStatus());\n return { status: 'completed', state: normalizeAppStoreMonetization(options.desired, snapshot) };\n}\n\nfunction providerFailure(status: 401 | 403 | null): AppStoreMonetizationInspectionResult {\n if (status === 401) return action('authentication', 'APP_STORE_CONNECT_AUTHENTICATION_REQUIRED');\n if (status === 403) return action('manual-action', 'APP_STORE_MONETIZATION_PERMISSION_REQUIRED');\n return {\n status: 'failed',\n failure: {\n code: 'APP_STORE_MONETIZATION_INSPECTION_FAILED',\n message: 'App Store monetization state could not be inspected.',\n target: 'ios',\n provider: 'app-store-connect',\n },\n };\n}\n\nfunction appRequired(): AppStoreMonetizationInspectionResult {\n return action('manual-action', 'APP_STORE_APP_REQUIRED');\n}\n\nfunction action(\n type: 'authentication' | 'manual-action',\n code: string,\n): AppStoreMonetizationInspectionResult {\n return {\n status: 'action-required',\n action: {\n type,\n provider: 'app-store-connect',\n target: 'ios',\n code,\n message: 'App Store monetization requires provider action.',\n },\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { MonetizationSubscriptionPeriod } from '../../domain/monetization/MonetizationSubscription';
2
+ export declare function fromAppStoreSubscriptionPeriod(value: unknown): MonetizationSubscriptionPeriod | null;
3
+ //# sourceMappingURL=mapAppStoreSubscriptionPeriod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapAppStoreSubscriptionPeriod.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oDAAoD,CAAC;AAWzG,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,GACb,8BAA8B,GAAG,IAAI,CAGvC"}
@@ -0,0 +1,14 @@
1
+ const PERIOD_PAIRS = [
2
+ ['P1W', 'ONE_WEEK'],
3
+ ['P1M', 'ONE_MONTH'],
4
+ ['P2M', 'TWO_MONTHS'],
5
+ ['P3M', 'THREE_MONTHS'],
6
+ ['P6M', 'SIX_MONTHS'],
7
+ ['P1Y', 'ONE_YEAR'],
8
+ ];
9
+ export function fromAppStoreSubscriptionPeriod(value) {
10
+ if (typeof value !== 'string')
11
+ return null;
12
+ return PERIOD_PAIRS.find(([, provider]) => provider === value)?.[0] ?? null;
13
+ }
14
+ //# sourceMappingURL=mapAppStoreSubscriptionPeriod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapAppStoreSubscriptionPeriod.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAmE;IACnF,CAAC,KAAK,EAAE,UAAU,CAAC;IACnB,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,KAAK,EAAE,cAAc,CAAC;IACvB,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,KAAK,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAC5C,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9E,CAAC","sourcesContent":["import type { MonetizationSubscriptionPeriod } from '../../domain/monetization/MonetizationSubscription';\n\nconst PERIOD_PAIRS: readonly (readonly [MonetizationSubscriptionPeriod, string])[] = [\n ['P1W', 'ONE_WEEK'],\n ['P1M', 'ONE_MONTH'],\n ['P2M', 'TWO_MONTHS'],\n ['P3M', 'THREE_MONTHS'],\n ['P6M', 'SIX_MONTHS'],\n ['P1Y', 'ONE_YEAR'],\n];\n\nexport function fromAppStoreSubscriptionPeriod(\n value: unknown,\n): MonetizationSubscriptionPeriod | null {\n if (typeof value !== 'string') return null;\n return PERIOD_PAIRS.find(([, provider]) => provider === value)?.[0] ?? null;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';
2
+ import type { MonetizationTargetState } from '../../domain/monetization/MonetizationTargetState';
3
+ import type { AppStoreMonetizationSnapshot } from './AppStoreMonetizationSnapshot';
4
+ export declare function normalizeAppStoreMonetization(desired: MonetizationDesiredState, snapshot: AppStoreMonetizationSnapshot): MonetizationTargetState;
5
+ //# sourceMappingURL=normalizeAppStoreMonetization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeAppStoreMonetization.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/normalizeAppStoreMonetization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AACjG,OAAO,KAAK,EAEV,4BAA4B,EAC7B,MAAM,gCAAgC,CAAC;AAIxC,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,4BAA4B,GACrC,uBAAuB,CAWzB"}
@@ -0,0 +1,65 @@
1
+ const EDITABLE_SUBSCRIPTION_STATES = new Set(['MISSING_METADATA', 'READY_TO_SUBMIT']);
2
+ export function normalizeAppStoreMonetization(desired, snapshot) {
3
+ const diagnostics = [...snapshot.diagnostics];
4
+ const products = desired.products.flatMap((product) => normalizeProduct(product, snapshot, diagnostics));
5
+ return {
6
+ target: 'ios',
7
+ products,
8
+ subscriptionFamilies: snapshot.families.map((item) => item.referenceName).sort(),
9
+ diagnostics,
10
+ };
11
+ }
12
+ function normalizeProduct(desired, snapshot, diagnostics) {
13
+ const current = snapshot.products.find((item) => item.productId === desired.id);
14
+ if (current === undefined)
15
+ return [];
16
+ if (desired.kind === 'subscription')
17
+ validateSubscription(desired, current, diagnostics);
18
+ return [
19
+ {
20
+ id: current.productId,
21
+ kind: current.kind,
22
+ localizations: managedLocalizations(desired, current),
23
+ ...(current.basePriceMatches ? { basePrice: desired.basePrice } : {}),
24
+ ...(current.kind === 'subscription' &&
25
+ current.family !== undefined &&
26
+ current.period !== undefined
27
+ ? {
28
+ subscription: {
29
+ family: current.family,
30
+ period: current.period,
31
+ ...(current.level === undefined ? {} : { level: current.level }),
32
+ },
33
+ }
34
+ : {}),
35
+ },
36
+ ];
37
+ }
38
+ function managedLocalizations(desired, current) {
39
+ return current.localizations
40
+ .filter((item) => desired.localizations.some((desiredItem) => desiredItem.locale === item.locale))
41
+ .map(({ resourceId: _resourceId, ...item }) => item);
42
+ }
43
+ function validateSubscription(desired, current, diagnostics) {
44
+ const { subscription } = desired;
45
+ if (subscription === undefined)
46
+ return;
47
+ if (current.family !== subscription.family) {
48
+ diagnostics.push(error(desired.id, 'APP_STORE_SUBSCRIPTION_GROUP_CONFLICT'));
49
+ }
50
+ if (current.period !== subscription.period &&
51
+ current.state !== undefined &&
52
+ !EDITABLE_SUBSCRIPTION_STATES.has(current.state)) {
53
+ diagnostics.push(error(desired.id, 'APP_STORE_SUBSCRIPTION_PERIOD_LOCKED'));
54
+ }
55
+ }
56
+ function error(productId, code) {
57
+ return {
58
+ severity: 'error',
59
+ code,
60
+ message: `App Store subscription ${productId} requires manual provider action.`,
61
+ target: 'ios',
62
+ productId,
63
+ };
64
+ }
65
+ //# sourceMappingURL=normalizeAppStoreMonetization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeAppStoreMonetization.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/normalizeAppStoreMonetization.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';\nimport type { MonetizationDiagnostic } from '../../domain/monetization/MonetizationDiagnostic';\nimport type { MonetizationObservedProduct } from '../../domain/monetization/MonetizationObservedProduct';\nimport type { MonetizationProduct } from '../../domain/monetization/MonetizationProduct';\nimport type { MonetizationTargetState } from '../../domain/monetization/MonetizationTargetState';\nimport type {\n AppStoreMonetizationProductResource,\n AppStoreMonetizationSnapshot,\n} from './AppStoreMonetizationSnapshot';\n\nconst EDITABLE_SUBSCRIPTION_STATES = new Set(['MISSING_METADATA', 'READY_TO_SUBMIT']);\n\nexport function normalizeAppStoreMonetization(\n desired: MonetizationDesiredState,\n snapshot: AppStoreMonetizationSnapshot,\n): MonetizationTargetState {\n const diagnostics = [...snapshot.diagnostics];\n const products = desired.products.flatMap((product) =>\n normalizeProduct(product, snapshot, diagnostics),\n );\n return {\n target: 'ios',\n products,\n subscriptionFamilies: snapshot.families.map((item) => item.referenceName).sort(),\n diagnostics,\n };\n}\n\nfunction normalizeProduct(\n desired: MonetizationProduct,\n snapshot: AppStoreMonetizationSnapshot,\n diagnostics: MonetizationDiagnostic[],\n): MonetizationObservedProduct[] {\n const current = snapshot.products.find((item) => item.productId === desired.id);\n if (current === undefined) return [];\n if (desired.kind === 'subscription') validateSubscription(desired, current, diagnostics);\n return [\n {\n id: current.productId,\n kind: current.kind,\n localizations: managedLocalizations(desired, current),\n ...(current.basePriceMatches ? { basePrice: desired.basePrice } : {}),\n ...(current.kind === 'subscription' &&\n current.family !== undefined &&\n current.period !== undefined\n ? {\n subscription: {\n family: current.family,\n period: current.period,\n ...(current.level === undefined ? {} : { level: current.level }),\n },\n }\n : {}),\n },\n ];\n}\n\nfunction managedLocalizations(\n desired: MonetizationProduct,\n current: AppStoreMonetizationProductResource,\n): MonetizationObservedProduct['localizations'] {\n return current.localizations\n .filter((item) =>\n desired.localizations.some((desiredItem) => desiredItem.locale === item.locale),\n )\n .map(({ resourceId: _resourceId, ...item }) => item);\n}\n\nfunction validateSubscription(\n desired: MonetizationProduct,\n current: AppStoreMonetizationProductResource,\n diagnostics: MonetizationDiagnostic[],\n): void {\n const { subscription } = desired;\n if (subscription === undefined) return;\n if (current.family !== subscription.family) {\n diagnostics.push(error(desired.id, 'APP_STORE_SUBSCRIPTION_GROUP_CONFLICT'));\n }\n if (\n current.period !== subscription.period &&\n current.state !== undefined &&\n !EDITABLE_SUBSCRIPTION_STATES.has(current.state)\n ) {\n diagnostics.push(error(desired.id, 'APP_STORE_SUBSCRIPTION_PERIOD_LOCKED'));\n }\n}\n\nfunction error(productId: string, code: string): MonetizationDiagnostic {\n return {\n severity: 'error',\n code,\n message: `App Store subscription ${productId} requires manual provider action.`,\n target: 'ios',\n productId,\n };\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { AppStoreConnectTransport } from './AppStoreConnectTransport';
2
+ export interface AppStoreCollectionPage {
3
+ readonly data: readonly unknown[];
4
+ readonly included: readonly unknown[];
5
+ }
6
+ export declare function readAppStoreCollection(options: {
7
+ readonly url: string;
8
+ readonly token: string;
9
+ readonly request: AppStoreConnectTransport;
10
+ }): Promise<AppStoreCollectionPage | null>;
11
+ //# sourceMappingURL=readAppStoreCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAppStoreCollection.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/readAppStoreCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;CAC5C,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAiBzC"}
@@ -0,0 +1,43 @@
1
+ export async function readAppStoreCollection(options) {
2
+ const data = [];
3
+ const included = [];
4
+ let url = options.url;
5
+ let pages = 0;
6
+ while (url !== undefined) {
7
+ if (pages >= 100)
8
+ return null;
9
+ const response = await options.request({ method: 'GET', url, token: options.token });
10
+ if (response.status < 200 || response.status >= 300)
11
+ return null;
12
+ const page = parsePage(response.body);
13
+ if (page === null)
14
+ return null;
15
+ data.push(...page.data);
16
+ included.push(...page.included);
17
+ url = page.next;
18
+ pages += 1;
19
+ }
20
+ return { data, included };
21
+ }
22
+ function parsePage(body) {
23
+ try {
24
+ const value = JSON.parse(body);
25
+ if (!isRecord(value) || !Array.isArray(value.data))
26
+ return null;
27
+ const included = Array.isArray(value.included) ? value.included : [];
28
+ const next = readNext(value.links);
29
+ return { data: value.data, included, ...(next === undefined ? {} : { next }) };
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ function readNext(value) {
36
+ if (!isRecord(value))
37
+ return undefined;
38
+ return typeof value.next === 'string' && value.next.length > 0 ? value.next : undefined;
39
+ }
40
+ function isRecord(value) {
41
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
42
+ }
43
+ //# sourceMappingURL=readAppStoreCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAppStoreCollection.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/readAppStoreCollection.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAI5C;IACC,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,GAAG,GAAuB,OAAO,CAAC,GAAG,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACrF,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC;QACjE,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;QAChB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,SAAS,CAChB,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import type { AppStoreConnectTransport } from './AppStoreConnectTransport';\n\nexport interface AppStoreCollectionPage {\n readonly data: readonly unknown[];\n readonly included: readonly unknown[];\n}\n\nexport async function readAppStoreCollection(options: {\n readonly url: string;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n}): Promise<AppStoreCollectionPage | null> {\n const data: unknown[] = [];\n const included: unknown[] = [];\n let url: string | undefined = options.url;\n let pages = 0;\n while (url !== undefined) {\n if (pages >= 100) return null;\n const response = await options.request({ method: 'GET', url, token: options.token });\n if (response.status < 200 || response.status >= 300) return null;\n const page = parsePage(response.body);\n if (page === null) return null;\n data.push(...page.data);\n included.push(...page.included);\n url = page.next;\n pages += 1;\n }\n return { data, included };\n}\n\nfunction parsePage(\n body: string,\n): { data: readonly unknown[]; included: readonly unknown[]; next?: string } | null {\n try {\n const value: unknown = JSON.parse(body);\n if (!isRecord(value) || !Array.isArray(value.data)) return null;\n const included = Array.isArray(value.included) ? value.included : [];\n const next = readNext(value.links);\n return { data: value.data, included, ...(next === undefined ? {} : { next }) };\n } catch {\n return null;\n }\n}\n\nfunction readNext(value: unknown): string | undefined {\n if (!isRecord(value)) return undefined;\n return typeof value.next === 'string' && value.next.length > 0 ? value.next : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { MonetizationBasePrice } from '../../domain/monetization/MonetizationBasePrice';
2
+ import type { MonetizationDiagnostic } from '../../domain/monetization/MonetizationDiagnostic';
3
+ import type { AppStoreConnectTransport } from './AppStoreConnectTransport';
4
+ export interface AppStorePriceInspection {
5
+ readonly matches: boolean;
6
+ readonly diagnostics: readonly MonetizationDiagnostic[];
7
+ }
8
+ export declare function readAppStoreMonetizationPrice(options: {
9
+ readonly kind: 'iap' | 'subscription';
10
+ readonly resourceId: string;
11
+ readonly productId: string;
12
+ readonly price: MonetizationBasePrice;
13
+ readonly token: string;
14
+ readonly request: AppStoreConnectTransport;
15
+ readonly now: Date;
16
+ }): Promise<AppStorePriceInspection>;
17
+ //# sourceMappingURL=readAppStoreMonetizationPrice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAppStoreMonetizationPrice.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/readAppStoreMonetizationPrice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAC/F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAK3E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzD;AAED,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,cAAc,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAQnC"}
@@ -0,0 +1,114 @@
1
+ import { appStoreMonetizationUrls } from './appStoreMonetizationUrls';
2
+ import { readAppStoreJson } from './readAppStoreJson';
3
+ import { toAppStoreTerritoryCode } from './toAppStoreTerritoryCode';
4
+ export async function readAppStoreMonetizationPrice(options) {
5
+ const territory = toAppStoreTerritoryCode(options.price.country);
6
+ if (territory === null)
7
+ return diagnostic(options.productId, 'APP_STORE_TERRITORY_UNSUPPORTED');
8
+ const pricePoint = await resolvePricePoint({ ...options, territory });
9
+ if (pricePoint === null)
10
+ return diagnostic(options.productId, 'APP_STORE_PRICE_POINT_NOT_FOUND');
11
+ const current = await readCurrentPricePoint({ ...options, territory });
12
+ if (current === undefined)
13
+ return diagnostic(options.productId, 'APP_STORE_PRICE_STATE_INVALID');
14
+ return { matches: current === pricePoint, diagnostics: [] };
15
+ }
16
+ async function resolvePricePoint(options) {
17
+ const url = options.kind === 'iap'
18
+ ? appStoreMonetizationUrls.iapPricePoints(options.resourceId, options.territory)
19
+ : appStoreMonetizationUrls.subscriptionPricePoints(options.resourceId, options.territory);
20
+ const value = await readAppStoreJson({ ...options, url });
21
+ if (!isRecord(value) || !Array.isArray(value.data))
22
+ return null;
23
+ if (!currencyMatches(value.included, options.territory, options.price.currency))
24
+ return null;
25
+ const matches = value.data.filter((item) => pricePointMatches(item, options.price.amount));
26
+ return matches.length === 1 && isRecord(matches[0]) && isString(matches[0].id)
27
+ ? matches[0].id
28
+ : null;
29
+ }
30
+ async function readCurrentPricePoint(options) {
31
+ const url = options.kind === 'iap'
32
+ ? appStoreMonetizationUrls.iapPriceSchedule(options.resourceId)
33
+ : appStoreMonetizationUrls.subscriptionPrices(options.resourceId, options.territory);
34
+ const value = await readAppStoreJson({ ...options, url });
35
+ if (!isRecord(value))
36
+ return undefined;
37
+ return options.kind === 'iap'
38
+ ? currentIapPricePoint(value, options.territory, options.now)
39
+ : currentSubscriptionPricePoint(value, options.now);
40
+ }
41
+ function currentIapPricePoint(value, territory, now) {
42
+ if (!isRecord(value.data) || !isRecord(value.data.relationships))
43
+ return undefined;
44
+ if (!relationshipHasId(value.data.relationships.baseTerritory, territory))
45
+ return null;
46
+ if (!Array.isArray(value.included))
47
+ return undefined;
48
+ const prices = value.included.filter((item) => isResourceType(item, 'inAppPurchasePrices'));
49
+ return currentPointFromPrices(prices, now, 'inAppPurchasePricePoint');
50
+ }
51
+ function currentSubscriptionPricePoint(value, now) {
52
+ if (!Array.isArray(value.data))
53
+ return undefined;
54
+ return currentPointFromPrices(value.data, now, 'subscriptionPricePoint');
55
+ }
56
+ function currentPointFromPrices(values, now, relationship) {
57
+ const active = values.filter((item) => isActivePrice(item, now));
58
+ if (active.length !== 1 || !isRecord(active[0]) || !isRecord(active[0].relationships))
59
+ return null;
60
+ return relationship === 'inAppPurchasePricePoint'
61
+ ? relationshipId(active[0].relationships.inAppPurchasePricePoint)
62
+ : relationshipId(active[0].relationships.subscriptionPricePoint);
63
+ }
64
+ function isActivePrice(value, now) {
65
+ if (!isRecord(value) || !isRecord(value.attributes))
66
+ return false;
67
+ const today = now.toISOString().slice(0, 10);
68
+ const start = value.attributes.startDate;
69
+ const end = value.attributes.endDate;
70
+ const startOk = start === null || start === undefined || (isString(start) && start <= today);
71
+ const endOk = end === null || end === undefined || (isString(end) && end > today);
72
+ return startOk && endOk;
73
+ }
74
+ function pricePointMatches(value, amount) {
75
+ if (!isRecord(value) || !isString(value.id) || !isRecord(value.attributes))
76
+ return false;
77
+ return value.attributes.customerPrice === amount;
78
+ }
79
+ function currencyMatches(value, territory, currency) {
80
+ if (!Array.isArray(value))
81
+ return false;
82
+ return value.some((item) => isResourceType(item, 'territories') &&
83
+ item.id === territory &&
84
+ isRecord(item.attributes) &&
85
+ item.attributes.currency === currency);
86
+ }
87
+ function relationshipHasId(value, id) {
88
+ return relationshipId(value) === id;
89
+ }
90
+ function relationshipId(value) {
91
+ if (!isRecord(value) || !isRecord(value.data) || !isString(value.data.id))
92
+ return null;
93
+ return value.data.id;
94
+ }
95
+ function isResourceType(value, type) {
96
+ return isRecord(value) && value.type === type && isString(value.id);
97
+ }
98
+ function diagnostic(productId, code) {
99
+ const item = {
100
+ severity: 'error',
101
+ code,
102
+ message: `App Store price for ${productId} cannot be resolved safely.`,
103
+ target: 'ios',
104
+ productId,
105
+ };
106
+ return { matches: false, diagnostics: [item] };
107
+ }
108
+ function isRecord(value) {
109
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
110
+ }
111
+ function isString(value) {
112
+ return typeof value === 'string';
113
+ }
114
+ //# sourceMappingURL=readAppStoreMonetizationPrice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAppStoreMonetizationPrice.js","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/readAppStoreMonetizationPrice.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MonetizationBasePrice } from '../../domain/monetization/MonetizationBasePrice';\nimport type { MonetizationDiagnostic } from '../../domain/monetization/MonetizationDiagnostic';\nimport type { AppStoreConnectTransport } from './AppStoreConnectTransport';\nimport { appStoreMonetizationUrls } from './appStoreMonetizationUrls';\nimport { readAppStoreJson } from './readAppStoreJson';\nimport { toAppStoreTerritoryCode } from './toAppStoreTerritoryCode';\n\nexport interface AppStorePriceInspection {\n readonly matches: boolean;\n readonly diagnostics: readonly MonetizationDiagnostic[];\n}\n\nexport async function readAppStoreMonetizationPrice(options: {\n readonly kind: 'iap' | 'subscription';\n readonly resourceId: string;\n readonly productId: string;\n readonly price: MonetizationBasePrice;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n readonly now: Date;\n}): Promise<AppStorePriceInspection> {\n const territory = toAppStoreTerritoryCode(options.price.country);\n if (territory === null) return diagnostic(options.productId, 'APP_STORE_TERRITORY_UNSUPPORTED');\n const pricePoint = await resolvePricePoint({ ...options, territory });\n if (pricePoint === null) return diagnostic(options.productId, 'APP_STORE_PRICE_POINT_NOT_FOUND');\n const current = await readCurrentPricePoint({ ...options, territory });\n if (current === undefined) return diagnostic(options.productId, 'APP_STORE_PRICE_STATE_INVALID');\n return { matches: current === pricePoint, diagnostics: [] };\n}\n\nasync function resolvePricePoint(options: {\n readonly kind: 'iap' | 'subscription';\n readonly resourceId: string;\n readonly price: MonetizationBasePrice;\n readonly territory: string;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n}): Promise<string | null> {\n const url =\n options.kind === 'iap'\n ? appStoreMonetizationUrls.iapPricePoints(options.resourceId, options.territory)\n : appStoreMonetizationUrls.subscriptionPricePoints(options.resourceId, options.territory);\n const value = await readAppStoreJson({ ...options, url });\n if (!isRecord(value) || !Array.isArray(value.data)) return null;\n if (!currencyMatches(value.included, options.territory, options.price.currency)) return null;\n const matches = value.data.filter((item) => pricePointMatches(item, options.price.amount));\n return matches.length === 1 && isRecord(matches[0]) && isString(matches[0].id)\n ? matches[0].id\n : null;\n}\n\nasync function readCurrentPricePoint(options: {\n readonly kind: 'iap' | 'subscription';\n readonly resourceId: string;\n readonly territory: string;\n readonly token: string;\n readonly request: AppStoreConnectTransport;\n readonly now: Date;\n}): Promise<string | null | undefined> {\n const url =\n options.kind === 'iap'\n ? appStoreMonetizationUrls.iapPriceSchedule(options.resourceId)\n : appStoreMonetizationUrls.subscriptionPrices(options.resourceId, options.territory);\n const value = await readAppStoreJson({ ...options, url });\n if (!isRecord(value)) return undefined;\n return options.kind === 'iap'\n ? currentIapPricePoint(value, options.territory, options.now)\n : currentSubscriptionPricePoint(value, options.now);\n}\n\nfunction currentIapPricePoint(\n value: Record<string, unknown>,\n territory: string,\n now: Date,\n): string | null | undefined {\n if (!isRecord(value.data) || !isRecord(value.data.relationships)) return undefined;\n if (!relationshipHasId(value.data.relationships.baseTerritory, territory)) return null;\n if (!Array.isArray(value.included)) return undefined;\n const prices = value.included.filter((item) => isResourceType(item, 'inAppPurchasePrices'));\n return currentPointFromPrices(prices, now, 'inAppPurchasePricePoint');\n}\n\nfunction currentSubscriptionPricePoint(\n value: Record<string, unknown>,\n now: Date,\n): string | null | undefined {\n if (!Array.isArray(value.data)) return undefined;\n return currentPointFromPrices(value.data, now, 'subscriptionPricePoint');\n}\n\nfunction currentPointFromPrices(\n values: readonly unknown[],\n now: Date,\n relationship: 'inAppPurchasePricePoint' | 'subscriptionPricePoint',\n): string | null {\n const active = values.filter((item) => isActivePrice(item, now));\n if (active.length !== 1 || !isRecord(active[0]) || !isRecord(active[0].relationships))\n return null;\n return relationship === 'inAppPurchasePricePoint'\n ? relationshipId(active[0].relationships.inAppPurchasePricePoint)\n : relationshipId(active[0].relationships.subscriptionPricePoint);\n}\n\nfunction isActivePrice(value: unknown, now: Date): boolean {\n if (!isRecord(value) || !isRecord(value.attributes)) return false;\n const today = now.toISOString().slice(0, 10);\n const start = value.attributes.startDate;\n const end = value.attributes.endDate;\n const startOk = start === null || start === undefined || (isString(start) && start <= today);\n const endOk = end === null || end === undefined || (isString(end) && end > today);\n return startOk && endOk;\n}\n\nfunction pricePointMatches(value: unknown, amount: string): boolean {\n if (!isRecord(value) || !isString(value.id) || !isRecord(value.attributes)) return false;\n return value.attributes.customerPrice === amount;\n}\n\nfunction currencyMatches(value: unknown, territory: string, currency: string): boolean {\n if (!Array.isArray(value)) return false;\n return value.some(\n (item) =>\n isResourceType(item, 'territories') &&\n item.id === territory &&\n isRecord(item.attributes) &&\n item.attributes.currency === currency,\n );\n}\n\nfunction relationshipHasId(value: unknown, id: string): boolean {\n return relationshipId(value) === id;\n}\n\nfunction relationshipId(value: unknown): string | null {\n if (!isRecord(value) || !isRecord(value.data) || !isString(value.data.id)) return null;\n return value.data.id;\n}\n\nfunction isResourceType(\n value: unknown,\n type: string,\n): value is Record<string, unknown> & { readonly id: string } {\n return isRecord(value) && value.type === type && isString(value.id);\n}\n\nfunction diagnostic(productId: string, code: string): AppStorePriceInspection {\n const item: MonetizationDiagnostic = {\n severity: 'error',\n code,\n message: `App Store price for ${productId} cannot be resolved safely.`,\n target: 'ios',\n productId,\n };\n return { matches: false, diagnostics: [item] };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';
2
+ import type { AppStoreConnectTransport } from './AppStoreConnectTransport';
3
+ import type { AppStoreMonetizationSnapshot } from './AppStoreMonetizationSnapshot';
4
+ export declare function readAppStoreMonetizationSnapshot(options: {
5
+ readonly bundleIdentifier: string;
6
+ readonly desired: MonetizationDesiredState;
7
+ readonly token: string;
8
+ readonly request: AppStoreConnectTransport;
9
+ readonly now: Date;
10
+ }): Promise<AppStoreMonetizationSnapshot | null | 'app-required'>;
11
+ //# sourceMappingURL=readAppStoreMonetizationSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readAppStoreMonetizationSnapshot.d.ts","sourceRoot":"","sources":["../../../src/providers/appStoreConnect/readAppStoreMonetizationSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAGnG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3E,OAAO,KAAK,EAGV,4BAA4B,EAC7B,MAAM,gCAAgC,CAAC;AAcxC,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;CACpB,GAAG,OAAO,CAAC,4BAA4B,GAAG,IAAI,GAAG,cAAc,CAAC,CAgBhE"}
@@ -0,0 +1,210 @@
1
+ import { appStoreConnectAppsUrl } from './appStoreConnectUrls';
2
+ import { appStoreMonetizationUrls } from './appStoreMonetizationUrls';
3
+ import { fromAppStoreSubscriptionPeriod } from './mapAppStoreSubscriptionPeriod';
4
+ import { parseAppStoreAppId } from './parseAppStoreAppId';
5
+ import { readAppStoreCollection } from './readAppStoreCollection';
6
+ import { readAppStoreJson } from './readAppStoreJson';
7
+ import { readAppStoreMonetizationPrice } from './readAppStoreMonetizationPrice';
8
+ import { readAppStoreProductVersion } from './readAppStoreProductVersion';
9
+ export async function readAppStoreMonetizationSnapshot(options) {
10
+ const appId = await resolveAppId(options);
11
+ if (appId === undefined)
12
+ return null;
13
+ if (appId === null)
14
+ return 'app-required';
15
+ const catalog = await readCatalog({ ...options, appId });
16
+ if (catalog === null)
17
+ return null;
18
+ const families = parseFamilies(catalog.groups.data);
19
+ if (families === null)
20
+ return null;
21
+ const products = [];
22
+ const diagnostics = [];
23
+ for (const desired of options.desired.products) {
24
+ const result = await readDesiredProduct({ ...options, desired, families, catalog });
25
+ products.push(...result.products);
26
+ diagnostics.push(...result.diagnostics);
27
+ }
28
+ return { appId, products, families, diagnostics };
29
+ }
30
+ async function resolveAppId(options) {
31
+ const value = await readAppStoreJson({
32
+ url: appStoreConnectAppsUrl(options.bundleIdentifier),
33
+ token: options.token,
34
+ request: options.request,
35
+ });
36
+ return value === null ? undefined : parseAppStoreAppId(value, options.bundleIdentifier);
37
+ }
38
+ async function readCatalog(options) {
39
+ const [iaps, groups] = await Promise.all([
40
+ readAppStoreCollection({
41
+ url: appStoreMonetizationUrls.inAppPurchases(options.appId),
42
+ token: options.token,
43
+ request: options.request,
44
+ }),
45
+ readAppStoreCollection({
46
+ url: appStoreMonetizationUrls.subscriptionGroups(options.appId),
47
+ token: options.token,
48
+ request: options.request,
49
+ }),
50
+ ]);
51
+ return iaps === null || groups === null ? null : { iaps, groups };
52
+ }
53
+ async function readDesiredProduct(options) {
54
+ const iap = findProduct(options.catalog.iaps.data, options.desired.id);
55
+ const subscription = findProduct(options.catalog.groups.included, options.desired.id);
56
+ if (iap !== undefined && subscription !== undefined) {
57
+ return {
58
+ products: [],
59
+ diagnostics: [diagnostic(options.desired.id, 'APP_STORE_PRODUCT_ID_CONFLICT')],
60
+ };
61
+ }
62
+ if (options.desired.kind === 'subscription') {
63
+ if (iap !== undefined)
64
+ return readIap(options, iap);
65
+ return subscription === undefined ? empty() : readSubscription(options, subscription);
66
+ }
67
+ if (subscription !== undefined)
68
+ return readSubscription(options, subscription);
69
+ return iap === undefined ? empty() : readIap(options, iap);
70
+ }
71
+ async function readIap(options, value) {
72
+ const base = parseIap(value);
73
+ if (base === null)
74
+ return invalid(options.desired.id);
75
+ const version = await readAppStoreProductVersion({
76
+ kind: 'iap',
77
+ productId: base.resourceId,
78
+ token: options.token,
79
+ request: options.request,
80
+ });
81
+ if (version === null)
82
+ return invalid(options.desired.id);
83
+ return withPrice(options, base, version, 'iap');
84
+ }
85
+ async function readSubscription(options, value) {
86
+ const base = parseSubscription(value, options.families);
87
+ if (base === null)
88
+ return invalid(options.desired.id);
89
+ const version = await readAppStoreProductVersion({
90
+ kind: 'subscription',
91
+ productId: base.resourceId,
92
+ token: options.token,
93
+ request: options.request,
94
+ });
95
+ if (version === null)
96
+ return invalid(options.desired.id);
97
+ return withPrice(options, base, version, 'subscription');
98
+ }
99
+ async function withPrice(options, base, version, kind) {
100
+ const price = await readAppStoreMonetizationPrice({
101
+ kind,
102
+ resourceId: base.resourceId,
103
+ productId: options.desired.id,
104
+ price: options.desired.basePrice,
105
+ token: options.token,
106
+ request: options.request,
107
+ now: options.now,
108
+ });
109
+ return {
110
+ products: [
111
+ {
112
+ ...base,
113
+ localizations: version?.localizations ?? [],
114
+ basePriceMatches: price.matches,
115
+ ...(version === undefined
116
+ ? {}
117
+ : { versionId: version.resourceId, versionState: version.state }),
118
+ },
119
+ ],
120
+ diagnostics: price.diagnostics,
121
+ };
122
+ }
123
+ function parseIap(value) {
124
+ if (!isRecord(value) || !isString(value.id) || !isRecord(value.attributes))
125
+ return null;
126
+ const { productId } = value.attributes;
127
+ const kind = mapIapKind(value.attributes.inAppPurchaseType);
128
+ if (!isString(productId) || kind === null)
129
+ return null;
130
+ const state = isString(value.attributes.state) ? value.attributes.state : undefined;
131
+ return { resourceId: value.id, productId, kind, ...(state === undefined ? {} : { state }) };
132
+ }
133
+ function parseSubscription(value, families) {
134
+ if (!isRecord(value) || !isString(value.id) || !isRecord(value.attributes))
135
+ return null;
136
+ const { productId } = value.attributes;
137
+ const period = fromAppStoreSubscriptionPeriod(value.attributes.subscriptionPeriod);
138
+ const familyId = relationshipId(isRecord(value.relationships) ? value.relationships.group : undefined);
139
+ const family = families.find((item) => item.resourceId === familyId);
140
+ if (!isString(productId) || period === null || family === undefined)
141
+ return null;
142
+ const level = isPositiveInteger(value.attributes.groupLevel)
143
+ ? value.attributes.groupLevel
144
+ : undefined;
145
+ const state = isString(value.attributes.state) ? value.attributes.state : undefined;
146
+ return {
147
+ resourceId: value.id,
148
+ productId,
149
+ kind: 'subscription',
150
+ family: family.referenceName,
151
+ familyId: family.resourceId,
152
+ period,
153
+ ...(level === undefined ? {} : { level }),
154
+ ...(state === undefined ? {} : { state }),
155
+ };
156
+ }
157
+ function parseFamilies(values) {
158
+ const result = [];
159
+ for (const value of values) {
160
+ if (!isRecord(value) || !isString(value.id) || !isRecord(value.attributes))
161
+ return null;
162
+ if (!isString(value.attributes.referenceName))
163
+ return null;
164
+ result.push({ resourceId: value.id, referenceName: value.attributes.referenceName });
165
+ }
166
+ return result.sort((a, b) => a.referenceName.localeCompare(b.referenceName));
167
+ }
168
+ function findProduct(values, productId) {
169
+ return values.find((value) => isRecord(value) && isRecord(value.attributes) && value.attributes.productId === productId);
170
+ }
171
+ function mapIapKind(value) {
172
+ if (value === 'CONSUMABLE')
173
+ return 'consumable';
174
+ if (value === 'NON_CONSUMABLE')
175
+ return 'non-consumable';
176
+ return null;
177
+ }
178
+ function relationshipId(value) {
179
+ if (!isRecord(value) || !isRecord(value.data) || !isString(value.data.id))
180
+ return null;
181
+ return value.data.id;
182
+ }
183
+ function empty() {
184
+ return { products: [], diagnostics: [] };
185
+ }
186
+ function invalid(productId) {
187
+ return {
188
+ products: [],
189
+ diagnostics: [diagnostic(productId, 'APP_STORE_PRODUCT_STATE_INVALID')],
190
+ };
191
+ }
192
+ function diagnostic(productId, code) {
193
+ return {
194
+ severity: 'error',
195
+ code,
196
+ message: `App Store monetization product ${productId} cannot be normalized safely.`,
197
+ target: 'ios',
198
+ productId,
199
+ };
200
+ }
201
+ function isPositiveInteger(value) {
202
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 1;
203
+ }
204
+ function isRecord(value) {
205
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
206
+ }
207
+ function isString(value) {
208
+ return typeof value === 'string';
209
+ }
210
+ //# sourceMappingURL=readAppStoreMonetizationSnapshot.js.map