@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.
- package/CHANGELOG.md +6 -0
- package/README.md +4 -1
- package/dist/domain/monetization/MonetizationBasePrice.d.ts +6 -0
- package/dist/domain/monetization/MonetizationBasePrice.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationBasePrice.js +2 -0
- package/dist/domain/monetization/MonetizationBasePrice.js.map +1 -0
- package/dist/domain/monetization/MonetizationDesiredState.d.ts +6 -0
- package/dist/domain/monetization/MonetizationDesiredState.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationDesiredState.js +2 -0
- package/dist/domain/monetization/MonetizationDesiredState.js.map +1 -0
- package/dist/domain/monetization/MonetizationDiagnostic.d.ts +9 -0
- package/dist/domain/monetization/MonetizationDiagnostic.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationDiagnostic.js +2 -0
- package/dist/domain/monetization/MonetizationDiagnostic.js.map +1 -0
- package/dist/domain/monetization/MonetizationLocalization.d.ts +6 -0
- package/dist/domain/monetization/MonetizationLocalization.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationLocalization.js +2 -0
- package/dist/domain/monetization/MonetizationLocalization.js.map +1 -0
- package/dist/domain/monetization/MonetizationObservedProduct.d.ts +12 -0
- package/dist/domain/monetization/MonetizationObservedProduct.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationObservedProduct.js +2 -0
- package/dist/domain/monetization/MonetizationObservedProduct.js.map +1 -0
- package/dist/domain/monetization/MonetizationPlan.d.ts +10 -0
- package/dist/domain/monetization/MonetizationPlan.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationPlan.js +2 -0
- package/dist/domain/monetization/MonetizationPlan.js.map +1 -0
- package/dist/domain/monetization/MonetizationPlanStep.d.ts +7 -0
- package/dist/domain/monetization/MonetizationPlanStep.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationPlanStep.js +2 -0
- package/dist/domain/monetization/MonetizationPlanStep.js.map +1 -0
- package/dist/domain/monetization/MonetizationProduct.d.ts +12 -0
- package/dist/domain/monetization/MonetizationProduct.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationProduct.js +2 -0
- package/dist/domain/monetization/MonetizationProduct.js.map +1 -0
- package/dist/domain/monetization/MonetizationSubscription.d.ts +7 -0
- package/dist/domain/monetization/MonetizationSubscription.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationSubscription.js +2 -0
- package/dist/domain/monetization/MonetizationSubscription.js.map +1 -0
- package/dist/domain/monetization/MonetizationTargetState.d.ts +9 -0
- package/dist/domain/monetization/MonetizationTargetState.d.ts.map +1 -0
- package/dist/domain/monetization/MonetizationTargetState.js +2 -0
- package/dist/domain/monetization/MonetizationTargetState.js.map +1 -0
- package/dist/domain/monetization/createMonetizationCurrentRevision.d.ts +3 -0
- package/dist/domain/monetization/createMonetizationCurrentRevision.d.ts.map +1 -0
- package/dist/domain/monetization/createMonetizationCurrentRevision.js +13 -0
- package/dist/domain/monetization/createMonetizationCurrentRevision.js.map +1 -0
- package/dist/domain/monetization/createMonetizationPlan.d.ts +9 -0
- package/dist/domain/monetization/createMonetizationPlan.d.ts.map +1 -0
- package/dist/domain/monetization/createMonetizationPlan.js +94 -0
- package/dist/domain/monetization/createMonetizationPlan.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/project/index.d.ts +13 -0
- package/dist/project/index.d.ts.map +1 -1
- package/dist/project/index.js +4 -0
- package/dist/project/index.js.map +1 -1
- package/dist/project/io/assertContainedPath.d.ts.map +1 -1
- package/dist/project/io/assertContainedPath.js +4 -3
- package/dist/project/io/assertContainedPath.js.map +1 -1
- package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.d.ts +8 -0
- package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.d.ts.map +1 -0
- package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.js +2 -0
- package/dist/project/monetization/ExecuteProjectMonetizationSyncOptions.js.map +1 -0
- package/dist/project/monetization/InspectProjectMonetizationOptions.d.ts +5 -0
- package/dist/project/monetization/InspectProjectMonetizationOptions.d.ts.map +1 -0
- package/dist/project/monetization/InspectProjectMonetizationOptions.js +2 -0
- package/dist/project/monetization/InspectProjectMonetizationOptions.js.map +1 -0
- package/dist/project/monetization/ProjectMonetizationAccess.d.ts +7 -0
- package/dist/project/monetization/ProjectMonetizationAccess.d.ts.map +1 -0
- package/dist/project/monetization/ProjectMonetizationAccess.js +2 -0
- package/dist/project/monetization/ProjectMonetizationAccess.js.map +1 -0
- package/dist/project/monetization/ProjectMonetizationExecutionResult.d.ts +16 -0
- package/dist/project/monetization/ProjectMonetizationExecutionResult.d.ts.map +1 -0
- package/dist/project/monetization/ProjectMonetizationExecutionResult.js +2 -0
- package/dist/project/monetization/ProjectMonetizationExecutionResult.js.map +1 -0
- package/dist/project/monetization/ProjectMonetizationInspection.d.ts +13 -0
- package/dist/project/monetization/ProjectMonetizationInspection.d.ts.map +1 -0
- package/dist/project/monetization/ProjectMonetizationInspection.js +2 -0
- package/dist/project/monetization/ProjectMonetizationInspection.js.map +1 -0
- package/dist/project/monetization/ProjectMonetizationInspectionResult.d.ts +10 -0
- package/dist/project/monetization/ProjectMonetizationInspectionResult.d.ts.map +1 -0
- package/dist/project/monetization/ProjectMonetizationInspectionResult.js +2 -0
- package/dist/project/monetization/ProjectMonetizationInspectionResult.js.map +1 -0
- package/dist/project/monetization/ProjectMonetizationPlan.d.ts +6 -0
- package/dist/project/monetization/ProjectMonetizationPlan.d.ts.map +1 -0
- package/dist/project/monetization/ProjectMonetizationPlan.js +2 -0
- package/dist/project/monetization/ProjectMonetizationPlan.js.map +1 -0
- package/dist/project/monetization/ProjectMonetizationRuntime.d.ts +12 -0
- package/dist/project/monetization/ProjectMonetizationRuntime.d.ts.map +1 -0
- package/dist/project/monetization/ProjectMonetizationRuntime.js +2 -0
- package/dist/project/monetization/ProjectMonetizationRuntime.js.map +1 -0
- package/dist/project/monetization/ProjectMonetizationTargets.d.ts +5 -0
- package/dist/project/monetization/ProjectMonetizationTargets.d.ts.map +1 -0
- package/dist/project/monetization/ProjectMonetizationTargets.js +2 -0
- package/dist/project/monetization/ProjectMonetizationTargets.js.map +1 -0
- package/dist/project/monetization/ResolvedProjectMonetizationAccess.d.ts +7 -0
- package/dist/project/monetization/ResolvedProjectMonetizationAccess.d.ts.map +1 -0
- package/dist/project/monetization/ResolvedProjectMonetizationAccess.js +2 -0
- package/dist/project/monetization/ResolvedProjectMonetizationAccess.js.map +1 -0
- package/dist/project/monetization/areProjectMonetizationPlansEqual.d.ts +3 -0
- package/dist/project/monetization/areProjectMonetizationPlansEqual.d.ts.map +1 -0
- package/dist/project/monetization/areProjectMonetizationPlansEqual.js +4 -0
- package/dist/project/monetization/areProjectMonetizationPlansEqual.js.map +1 -0
- package/dist/project/monetization/createProjectMonetizationPlan.d.ts +4 -0
- package/dist/project/monetization/createProjectMonetizationPlan.d.ts.map +1 -0
- package/dist/project/monetization/createProjectMonetizationPlan.js +14 -0
- package/dist/project/monetization/createProjectMonetizationPlan.js.map +1 -0
- package/dist/project/monetization/createProjectMonetizationRevision.d.ts +3 -0
- package/dist/project/monetization/createProjectMonetizationRevision.d.ts.map +1 -0
- package/dist/project/monetization/createProjectMonetizationRevision.js +5 -0
- package/dist/project/monetization/createProjectMonetizationRevision.js.map +1 -0
- package/dist/project/monetization/defaultProjectMonetizationRuntime.d.ts +3 -0
- package/dist/project/monetization/defaultProjectMonetizationRuntime.d.ts.map +1 -0
- package/dist/project/monetization/defaultProjectMonetizationRuntime.js +12 -0
- package/dist/project/monetization/defaultProjectMonetizationRuntime.js.map +1 -0
- package/dist/project/monetization/executeProjectMonetizationSync.d.ts +4 -0
- package/dist/project/monetization/executeProjectMonetizationSync.d.ts.map +1 -0
- package/dist/project/monetization/executeProjectMonetizationSync.js +6 -0
- package/dist/project/monetization/executeProjectMonetizationSync.js.map +1 -0
- package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.d.ts +5 -0
- package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.d.ts.map +1 -0
- package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.js +63 -0
- package/dist/project/monetization/executeProjectMonetizationSyncWithRuntime.js.map +1 -0
- package/dist/project/monetization/executeProjectMonetizationTargets.d.ts +23 -0
- package/dist/project/monetization/executeProjectMonetizationTargets.d.ts.map +1 -0
- package/dist/project/monetization/executeProjectMonetizationTargets.js +66 -0
- package/dist/project/monetization/executeProjectMonetizationTargets.js.map +1 -0
- package/dist/project/monetization/inspectProjectMonetization.d.ts +4 -0
- package/dist/project/monetization/inspectProjectMonetization.d.ts.map +1 -0
- package/dist/project/monetization/inspectProjectMonetization.js +6 -0
- package/dist/project/monetization/inspectProjectMonetization.js.map +1 -0
- package/dist/project/monetization/inspectProjectMonetizationWithRuntime.d.ts +5 -0
- package/dist/project/monetization/inspectProjectMonetizationWithRuntime.d.ts.map +1 -0
- package/dist/project/monetization/inspectProjectMonetizationWithRuntime.js +78 -0
- package/dist/project/monetization/inspectProjectMonetizationWithRuntime.js.map +1 -0
- package/dist/project/monetization/parseProjectMonetization.d.ts +3 -0
- package/dist/project/monetization/parseProjectMonetization.d.ts.map +1 -0
- package/dist/project/monetization/parseProjectMonetization.js +127 -0
- package/dist/project/monetization/parseProjectMonetization.js.map +1 -0
- package/dist/project/monetization/readProjectMonetization.d.ts +5 -0
- package/dist/project/monetization/readProjectMonetization.d.ts.map +1 -0
- package/dist/project/monetization/readProjectMonetization.js +19 -0
- package/dist/project/monetization/readProjectMonetization.js.map +1 -0
- package/dist/project/monetization/resolveProjectMonetizationAccess.d.ts +4 -0
- package/dist/project/monetization/resolveProjectMonetizationAccess.d.ts.map +1 -0
- package/dist/project/monetization/resolveProjectMonetizationAccess.js +7 -0
- package/dist/project/monetization/resolveProjectMonetizationAccess.js.map +1 -0
- package/dist/project/monetization/resolveProjectMonetizationTargets.d.ts +13 -0
- package/dist/project/monetization/resolveProjectMonetizationTargets.d.ts.map +1 -0
- package/dist/project/monetization/resolveProjectMonetizationTargets.js +27 -0
- package/dist/project/monetization/resolveProjectMonetizationTargets.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.d.ts +14 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.js +2 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationExecutionResult.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationResult.d.ts +14 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationResult.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationResult.js +2 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationResult.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.d.ts +32 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.js +2 -0
- package/dist/providers/appStoreConnect/AppStoreMonetizationSnapshot.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreProductVersion.d.ts +7 -0
- package/dist/providers/appStoreConnect/AppStoreProductVersion.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreProductVersion.js +2 -0
- package/dist/providers/appStoreConnect/AppStoreProductVersion.js.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.d.ts +5 -0
- package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.js +2 -0
- package/dist/providers/appStoreConnect/AppStoreResolvedPricePoint.js.map +1 -0
- package/dist/providers/appStoreConnect/appStoreMonetizationUrls.d.ts +25 -0
- package/dist/providers/appStoreConnect/appStoreMonetizationUrls.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/appStoreMonetizationUrls.js +67 -0
- package/dist/providers/appStoreConnect/appStoreMonetizationUrls.js.map +1 -0
- package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.d.ts +10 -0
- package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.js +67 -0
- package/dist/providers/appStoreConnect/createAppStoreMonetizationProduct.js.map +1 -0
- package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.d.ts +8 -0
- package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.js +67 -0
- package/dist/providers/appStoreConnect/ensureAppStoreProductVersion.js.map +1 -0
- package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.d.ts +10 -0
- package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.js +78 -0
- package/dist/providers/appStoreConnect/ensureAppStoreSubscriptionFamily.js.map +1 -0
- package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.d.ts +19 -0
- package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.js +117 -0
- package/dist/providers/appStoreConnect/executeAppStoreMonetizationPlan.js.map +1 -0
- package/dist/providers/appStoreConnect/inspectAppStoreMonetization.d.ts +16 -0
- package/dist/providers/appStoreConnect/inspectAppStoreMonetization.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/inspectAppStoreMonetization.js +53 -0
- package/dist/providers/appStoreConnect/inspectAppStoreMonetization.js.map +1 -0
- package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.d.ts +3 -0
- package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.js +14 -0
- package/dist/providers/appStoreConnect/mapAppStoreSubscriptionPeriod.js.map +1 -0
- package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.d.ts +5 -0
- package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.js +65 -0
- package/dist/providers/appStoreConnect/normalizeAppStoreMonetization.js.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreCollection.d.ts +11 -0
- package/dist/providers/appStoreConnect/readAppStoreCollection.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreCollection.js +43 -0
- package/dist/providers/appStoreConnect/readAppStoreCollection.js.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.d.ts +17 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.js +114 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationPrice.js.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.d.ts +11 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.js +210 -0
- package/dist/providers/appStoreConnect/readAppStoreMonetizationSnapshot.js.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreProductVersion.d.ts +9 -0
- package/dist/providers/appStoreConnect/readAppStoreProductVersion.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreProductVersion.js +56 -0
- package/dist/providers/appStoreConnect/readAppStoreProductVersion.js.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.d.ts +9 -0
- package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.js +44 -0
- package/dist/providers/appStoreConnect/readAppStoreVersionLocalizations.js.map +1 -0
- package/dist/providers/appStoreConnect/resolveAppStorePricePoint.d.ts +11 -0
- package/dist/providers/appStoreConnect/resolveAppStorePricePoint.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/resolveAppStorePricePoint.js +46 -0
- package/dist/providers/appStoreConnect/resolveAppStorePricePoint.js.map +1 -0
- package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.d.ts +10 -0
- package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.js +80 -0
- package/dist/providers/appStoreConnect/syncAppStoreMonetizationLocalizations.js.map +1 -0
- package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.d.ts +3 -0
- package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.js +15 -0
- package/dist/providers/appStoreConnect/toAppStoreSubscriptionPeriod.js.map +1 -0
- package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.d.ts +2 -0
- package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.js +255 -0
- package/dist/providers/appStoreConnect/toAppStoreTerritoryCode.js.map +1 -0
- package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.d.ts +11 -0
- package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.js +83 -0
- package/dist/providers/appStoreConnect/updateAppStoreMonetizationPrice.js.map +1 -0
- package/dist/providers/appStoreConnect/updateAppStoreSubscription.d.ts +9 -0
- package/dist/providers/appStoreConnect/updateAppStoreSubscription.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/updateAppStoreSubscription.js +24 -0
- package/dist/providers/appStoreConnect/updateAppStoreSubscription.js.map +1 -0
- package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.d.ts +13 -0
- package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.d.ts.map +1 -0
- package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.js +94 -0
- package/dist/providers/appStoreConnect/writeAppStoreMonetizationProduct.js.map +1 -0
- package/dist/providers/googlePlay/GooglePlayMonetizationResult.d.ts +24 -0
- package/dist/providers/googlePlay/GooglePlayMonetizationResult.d.ts.map +1 -0
- package/dist/providers/googlePlay/GooglePlayMonetizationResult.js +2 -0
- package/dist/providers/googlePlay/GooglePlayMonetizationResult.js.map +1 -0
- package/dist/providers/googlePlay/GooglePlayPriceConversion.d.ts +4 -0
- package/dist/providers/googlePlay/GooglePlayPriceConversion.d.ts.map +1 -0
- package/dist/providers/googlePlay/GooglePlayPriceConversion.js +2 -0
- package/dist/providers/googlePlay/GooglePlayPriceConversion.js.map +1 -0
- package/dist/providers/googlePlay/convertGooglePlayRegionPrices.d.ts +10 -0
- package/dist/providers/googlePlay/convertGooglePlayRegionPrices.d.ts.map +1 -0
- package/dist/providers/googlePlay/convertGooglePlayRegionPrices.js +32 -0
- package/dist/providers/googlePlay/convertGooglePlayRegionPrices.js.map +1 -0
- package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.d.ts +18 -0
- package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.d.ts.map +1 -0
- package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.js +97 -0
- package/dist/providers/googlePlay/executeGooglePlayMonetizationPlan.js.map +1 -0
- package/dist/providers/googlePlay/googlePlayMonetizationUrls.d.ts +11 -0
- package/dist/providers/googlePlay/googlePlayMonetizationUrls.d.ts.map +1 -0
- package/dist/providers/googlePlay/googlePlayMonetizationUrls.js +36 -0
- package/dist/providers/googlePlay/googlePlayMonetizationUrls.js.map +1 -0
- package/dist/providers/googlePlay/inspectGooglePlayMonetization.d.ts +15 -0
- package/dist/providers/googlePlay/inspectGooglePlayMonetization.d.ts.map +1 -0
- package/dist/providers/googlePlay/inspectGooglePlayMonetization.js +49 -0
- package/dist/providers/googlePlay/inspectGooglePlayMonetization.js.map +1 -0
- package/dist/providers/googlePlay/normalizeGooglePlayMonetization.d.ts +8 -0
- package/dist/providers/googlePlay/normalizeGooglePlayMonetization.d.ts.map +1 -0
- package/dist/providers/googlePlay/normalizeGooglePlayMonetization.js +169 -0
- package/dist/providers/googlePlay/normalizeGooglePlayMonetization.js.map +1 -0
- package/dist/providers/googlePlay/readGooglePlayMonetizationResources.d.ts +12 -0
- package/dist/providers/googlePlay/readGooglePlayMonetizationResources.d.ts.map +1 -0
- package/dist/providers/googlePlay/readGooglePlayMonetizationResources.js +62 -0
- package/dist/providers/googlePlay/readGooglePlayMonetizationResources.js.map +1 -0
- package/dist/providers/googlePlay/toGooglePlayMoney.d.ts +3 -0
- package/dist/providers/googlePlay/toGooglePlayMoney.d.ts.map +1 -0
- package/dist/providers/googlePlay/toGooglePlayMoney.js +11 -0
- package/dist/providers/googlePlay/toGooglePlayMoney.js.map +1 -0
- package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.d.ts +10 -0
- package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.d.ts.map +1 -0
- package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.js +121 -0
- package/dist/providers/googlePlay/updateGooglePlayMonetizationPrice.js.map +1 -0
- package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.d.ts +13 -0
- package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.d.ts.map +1 -0
- package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.js +127 -0
- package/dist/providers/googlePlay/writeGooglePlayMonetizationProduct.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MonetizationBasePrice } from '../../domain/monetization/MonetizationBasePrice';
|
|
2
|
+
import type { GooglePlayPriceConversion } from './GooglePlayPriceConversion';
|
|
3
|
+
import type { GooglePlayTransport } from './GooglePlayTransport';
|
|
4
|
+
export declare function convertGooglePlayRegionPrices(options: {
|
|
5
|
+
readonly packageName: string;
|
|
6
|
+
readonly basePrice: MonetizationBasePrice;
|
|
7
|
+
readonly token: string;
|
|
8
|
+
readonly request: GooglePlayTransport;
|
|
9
|
+
}): Promise<GooglePlayPriceConversion | null>;
|
|
10
|
+
//# sourceMappingURL=convertGooglePlayRegionPrices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertGooglePlayRegionPrices.d.ts","sourceRoot":"","sources":["../../../src/providers/googlePlay/convertGooglePlayRegionPrices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAE7F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjE,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAc5C"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { googlePlayMonetizationUrls } from './googlePlayMonetizationUrls';
|
|
2
|
+
import { toGooglePlayMoney } from './toGooglePlayMoney';
|
|
3
|
+
export async function convertGooglePlayRegionPrices(options) {
|
|
4
|
+
const response = await options.request({
|
|
5
|
+
method: 'POST',
|
|
6
|
+
url: googlePlayMonetizationUrls.convertPrices(options.packageName),
|
|
7
|
+
token: options.token,
|
|
8
|
+
contentType: 'application/json',
|
|
9
|
+
body: JSON.stringify({ price: toGooglePlayMoney(options.basePrice) }),
|
|
10
|
+
});
|
|
11
|
+
if (response.status < 200 || response.status >= 300)
|
|
12
|
+
return null;
|
|
13
|
+
try {
|
|
14
|
+
return parseConversion(JSON.parse(response.body));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function parseConversion(value) {
|
|
21
|
+
if (!isRecord(value) || !isRecord(value.regionVersion))
|
|
22
|
+
return null;
|
|
23
|
+
const { version } = value.regionVersion;
|
|
24
|
+
return isNonEmptyString(version) ? { regionVersion: version } : null;
|
|
25
|
+
}
|
|
26
|
+
function isRecord(value) {
|
|
27
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
function isNonEmptyString(value) {
|
|
30
|
+
return typeof value === 'string' && value.length > 0;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=convertGooglePlayRegionPrices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertGooglePlayRegionPrices.js","sourceRoot":"","sources":["../../../src/providers/googlePlay/convertGooglePlayRegionPrices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAKnD;IACC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QACrC,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,0BAA0B,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC;QAClE,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;KACtE,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAY,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC;IACxC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,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;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import type { MonetizationBasePrice } from '../../domain/monetization/MonetizationBasePrice';\nimport { googlePlayMonetizationUrls } from './googlePlayMonetizationUrls';\nimport type { GooglePlayPriceConversion } from './GooglePlayPriceConversion';\nimport type { GooglePlayTransport } from './GooglePlayTransport';\nimport { toGooglePlayMoney } from './toGooglePlayMoney';\n\nexport async function convertGooglePlayRegionPrices(options: {\n readonly packageName: string;\n readonly basePrice: MonetizationBasePrice;\n readonly token: string;\n readonly request: GooglePlayTransport;\n}): Promise<GooglePlayPriceConversion | null> {\n const response = await options.request({\n method: 'POST',\n url: googlePlayMonetizationUrls.convertPrices(options.packageName),\n token: options.token,\n contentType: 'application/json',\n body: JSON.stringify({ price: toGooglePlayMoney(options.basePrice) }),\n });\n if (response.status < 200 || response.status >= 300) return null;\n try {\n return parseConversion(JSON.parse(response.body) as unknown);\n } catch {\n return null;\n }\n}\n\nfunction parseConversion(value: unknown): GooglePlayPriceConversion | null {\n if (!isRecord(value) || !isRecord(value.regionVersion)) return null;\n const { version } = value.regionVersion;\n return isNonEmptyString(version) ? { regionVersion: version } : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';
|
|
2
|
+
import type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';
|
|
3
|
+
import type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';
|
|
4
|
+
import type { MonetizationPlan } from '../../domain/monetization/MonetizationPlan';
|
|
5
|
+
import type { GooglePlayMonetizationExecutionResult } from './GooglePlayMonetizationResult';
|
|
6
|
+
import type { GooglePlayTokenFactory } from './GooglePlayTokenFactory';
|
|
7
|
+
import type { GooglePlayTransport } from './GooglePlayTransport';
|
|
8
|
+
export declare function executeGooglePlayMonetizationPlan(options: {
|
|
9
|
+
readonly packageName: string;
|
|
10
|
+
readonly desired: MonetizationDesiredState;
|
|
11
|
+
readonly plan: MonetizationPlan;
|
|
12
|
+
readonly expectedRevision: string;
|
|
13
|
+
readonly credentials: readonly DeploymentCredentialReference[];
|
|
14
|
+
readonly resolveSecret: DeploymentSecretResolver;
|
|
15
|
+
readonly createToken: GooglePlayTokenFactory;
|
|
16
|
+
readonly request: GooglePlayTransport;
|
|
17
|
+
}): Promise<GooglePlayMonetizationExecutionResult>;
|
|
18
|
+
//# sourceMappingURL=executeGooglePlayMonetizationPlan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeGooglePlayMonetizationPlan.d.ts","sourceRoot":"","sources":["../../../src/providers/googlePlay/executeGooglePlayMonetizationPlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAGtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAEnF,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,gCAAgC,CAAC;AAE5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAKjE,wBAAsB,iCAAiC,CAAC,OAAO,EAAE;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAajD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { createMonetizationCurrentRevision } from '../../domain/monetization/createMonetizationCurrentRevision';
|
|
2
|
+
import { createMonetizationPlan } from '../../domain/monetization/createMonetizationPlan';
|
|
3
|
+
import { trackGooglePlayRequests } from './GooglePlayRequestTracker';
|
|
4
|
+
import { inspectGooglePlayMonetization } from './inspectGooglePlayMonetization';
|
|
5
|
+
import { resolveGooglePlayAccessToken } from './resolveGooglePlayAccessToken';
|
|
6
|
+
import { writeGooglePlayMonetizationProduct } from './writeGooglePlayMonetizationProduct';
|
|
7
|
+
export async function executeGooglePlayMonetizationPlan(options) {
|
|
8
|
+
if (options.plan.status === 'blocked')
|
|
9
|
+
return failed('GOOGLE_PLAY_MONETIZATION_PLAN_BLOCKED');
|
|
10
|
+
const preflight = await inspectGooglePlayMonetization(options);
|
|
11
|
+
if (preflight.status !== 'completed')
|
|
12
|
+
return preflight;
|
|
13
|
+
const revision = createMonetizationCurrentRevision([preflight.state]);
|
|
14
|
+
if (revision !== options.expectedRevision)
|
|
15
|
+
return failed('GOOGLE_PLAY_MONETIZATION_DRIFT');
|
|
16
|
+
const access = await resolveGooglePlayAccessToken(options);
|
|
17
|
+
if (!access.ok)
|
|
18
|
+
return { status: 'action-required', action: access.action };
|
|
19
|
+
const tracker = trackGooglePlayRequests(options.request);
|
|
20
|
+
if (!(await executeSteps(options, access.token, tracker.request))) {
|
|
21
|
+
return providerFailure(tracker.blockingStatus());
|
|
22
|
+
}
|
|
23
|
+
return verify(options);
|
|
24
|
+
}
|
|
25
|
+
async function executeSteps(options, token, request) {
|
|
26
|
+
const groups = groupAndroidSteps(options.plan.steps);
|
|
27
|
+
for (const [productId, steps] of groups) {
|
|
28
|
+
const product = options.desired.products.find((item) => item.id === productId);
|
|
29
|
+
if (product === undefined)
|
|
30
|
+
return false;
|
|
31
|
+
const ok = await writeGooglePlayMonetizationProduct({
|
|
32
|
+
packageName: options.packageName,
|
|
33
|
+
product,
|
|
34
|
+
operations: steps.map((step) => step.operation),
|
|
35
|
+
token,
|
|
36
|
+
request,
|
|
37
|
+
});
|
|
38
|
+
if (!ok)
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
function groupAndroidSteps(steps) {
|
|
44
|
+
const groups = new Map();
|
|
45
|
+
for (const step of steps) {
|
|
46
|
+
if (step.target !== 'android')
|
|
47
|
+
continue;
|
|
48
|
+
const current = groups.get(step.productId) ?? [];
|
|
49
|
+
current.push(step);
|
|
50
|
+
groups.set(step.productId, current);
|
|
51
|
+
}
|
|
52
|
+
return groups;
|
|
53
|
+
}
|
|
54
|
+
async function verify(options) {
|
|
55
|
+
const inspection = await inspectGooglePlayMonetization(options);
|
|
56
|
+
if (inspection.status !== 'completed')
|
|
57
|
+
return inspection;
|
|
58
|
+
const plan = createMonetizationPlan({
|
|
59
|
+
desired: options.desired,
|
|
60
|
+
currentRevision: createMonetizationCurrentRevision([inspection.state]),
|
|
61
|
+
states: [inspection.state],
|
|
62
|
+
});
|
|
63
|
+
return plan.status === 'no-change'
|
|
64
|
+
? { status: 'completed', state: inspection.state }
|
|
65
|
+
: failed('GOOGLE_PLAY_MONETIZATION_VERIFICATION_FAILED');
|
|
66
|
+
}
|
|
67
|
+
function providerFailure(status) {
|
|
68
|
+
if (status === 401)
|
|
69
|
+
return action('authentication', 'GOOGLE_PLAY_AUTHENTICATION_REQUIRED');
|
|
70
|
+
if (status === 403)
|
|
71
|
+
return action('manual-action', 'GOOGLE_PLAY_MONETIZATION_PERMISSION_REQUIRED');
|
|
72
|
+
return failed('GOOGLE_PLAY_MONETIZATION_SYNC_FAILED');
|
|
73
|
+
}
|
|
74
|
+
function action(type, code) {
|
|
75
|
+
return {
|
|
76
|
+
status: 'action-required',
|
|
77
|
+
action: {
|
|
78
|
+
type,
|
|
79
|
+
provider: 'google-play',
|
|
80
|
+
target: 'android',
|
|
81
|
+
code,
|
|
82
|
+
message: 'Google Play monetization access requires provider action.',
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function failed(code) {
|
|
87
|
+
return {
|
|
88
|
+
status: 'failed',
|
|
89
|
+
failure: {
|
|
90
|
+
code,
|
|
91
|
+
message: 'Google Play monetization synchronization failed.',
|
|
92
|
+
target: 'android',
|
|
93
|
+
provider: 'google-play',
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=executeGooglePlayMonetizationPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executeGooglePlayMonetizationPlan.js","sourceRoot":"","sources":["../../../src/providers/googlePlay/executeGooglePlayMonetizationPlan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,MAAM,6DAA6D,CAAC;AAChH,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAK1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAE1F,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,OASvD;IACC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,MAAM,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACvD,MAAM,QAAQ,GAAG,iCAAiC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ,KAAK,OAAO,CAAC,gBAAgB;QAAE,OAAO,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,OAAgE,EAChE,KAAa,EACb,OAA4B;IAE5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC/E,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxC,MAAM,EAAE,GAAG,MAAM,kCAAkC,CAAC;YAClD,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO;YACP,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;YAC/C,KAAK;YACL,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAsC;IAEtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,OAAgE;IAEhE,MAAM,UAAU,GAAG,MAAM,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,UAAU,CAAC;IACzD,MAAM,IAAI,GAAG,sBAAsB,CAAC;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,iCAAiC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW;QAChC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE;QAClD,CAAC,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,MAAwB;IAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,CAAC;IAC3F,IAAI,MAAM,KAAK,GAAG;QAChB,OAAO,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,MAAM,CACb,IAAwC,EACxC,IAAY;IAEZ,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE;YACN,IAAI;YACJ,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,SAAS;YACjB,IAAI;YACJ,OAAO,EAAE,2DAA2D;SACrE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,IAAI;YACJ,OAAO,EAAE,kDAAkD;YAC3D,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,aAAa;SACxB;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';\nimport type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';\nimport { createMonetizationCurrentRevision } from '../../domain/monetization/createMonetizationCurrentRevision';\nimport { createMonetizationPlan } from '../../domain/monetization/createMonetizationPlan';\nimport type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';\nimport type { MonetizationPlan } from '../../domain/monetization/MonetizationPlan';\nimport type { MonetizationPlanStep } from '../../domain/monetization/MonetizationPlanStep';\nimport type { GooglePlayMonetizationExecutionResult } from './GooglePlayMonetizationResult';\nimport { trackGooglePlayRequests } from './GooglePlayRequestTracker';\nimport type { GooglePlayTokenFactory } from './GooglePlayTokenFactory';\nimport type { GooglePlayTransport } from './GooglePlayTransport';\nimport { inspectGooglePlayMonetization } from './inspectGooglePlayMonetization';\nimport { resolveGooglePlayAccessToken } from './resolveGooglePlayAccessToken';\nimport { writeGooglePlayMonetizationProduct } from './writeGooglePlayMonetizationProduct';\n\nexport async function executeGooglePlayMonetizationPlan(options: {\n readonly packageName: string;\n readonly desired: MonetizationDesiredState;\n readonly plan: MonetizationPlan;\n readonly expectedRevision: string;\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly createToken: GooglePlayTokenFactory;\n readonly request: GooglePlayTransport;\n}): Promise<GooglePlayMonetizationExecutionResult> {\n if (options.plan.status === 'blocked') return failed('GOOGLE_PLAY_MONETIZATION_PLAN_BLOCKED');\n const preflight = await inspectGooglePlayMonetization(options);\n if (preflight.status !== 'completed') return preflight;\n const revision = createMonetizationCurrentRevision([preflight.state]);\n if (revision !== options.expectedRevision) return failed('GOOGLE_PLAY_MONETIZATION_DRIFT');\n const access = await resolveGooglePlayAccessToken(options);\n if (!access.ok) return { status: 'action-required', action: access.action };\n const tracker = trackGooglePlayRequests(options.request);\n if (!(await executeSteps(options, access.token, tracker.request))) {\n return providerFailure(tracker.blockingStatus());\n }\n return verify(options);\n}\n\nasync function executeSteps(\n options: Parameters<typeof executeGooglePlayMonetizationPlan>[0],\n token: string,\n request: GooglePlayTransport,\n): Promise<boolean> {\n const groups = groupAndroidSteps(options.plan.steps);\n for (const [productId, steps] of groups) {\n const product = options.desired.products.find((item) => item.id === productId);\n if (product === undefined) return false;\n const ok = await writeGooglePlayMonetizationProduct({\n packageName: options.packageName,\n product,\n operations: steps.map((step) => step.operation),\n token,\n request,\n });\n if (!ok) return false;\n }\n return true;\n}\n\nfunction groupAndroidSteps(\n steps: readonly MonetizationPlanStep[],\n): ReadonlyMap<string, readonly MonetizationPlanStep[]> {\n const groups = new Map<string, MonetizationPlanStep[]>();\n for (const step of steps) {\n if (step.target !== 'android') continue;\n const current = groups.get(step.productId) ?? [];\n current.push(step);\n groups.set(step.productId, current);\n }\n return groups;\n}\n\nasync function verify(\n options: Parameters<typeof executeGooglePlayMonetizationPlan>[0],\n): Promise<GooglePlayMonetizationExecutionResult> {\n const inspection = await inspectGooglePlayMonetization(options);\n if (inspection.status !== 'completed') return inspection;\n const plan = createMonetizationPlan({\n desired: options.desired,\n currentRevision: createMonetizationCurrentRevision([inspection.state]),\n states: [inspection.state],\n });\n return plan.status === 'no-change'\n ? { status: 'completed', state: inspection.state }\n : failed('GOOGLE_PLAY_MONETIZATION_VERIFICATION_FAILED');\n}\n\nfunction providerFailure(status: 401 | 403 | null): GooglePlayMonetizationExecutionResult {\n if (status === 401) return action('authentication', 'GOOGLE_PLAY_AUTHENTICATION_REQUIRED');\n if (status === 403)\n return action('manual-action', 'GOOGLE_PLAY_MONETIZATION_PERMISSION_REQUIRED');\n return failed('GOOGLE_PLAY_MONETIZATION_SYNC_FAILED');\n}\n\nfunction action(\n type: 'authentication' | 'manual-action',\n code: string,\n): GooglePlayMonetizationExecutionResult {\n return {\n status: 'action-required',\n action: {\n type,\n provider: 'google-play',\n target: 'android',\n code,\n message: 'Google Play monetization access requires provider action.',\n },\n };\n}\n\nfunction failed(code: string): GooglePlayMonetizationExecutionResult {\n return {\n status: 'failed',\n failure: {\n code,\n message: 'Google Play monetization synchronization failed.',\n target: 'android',\n provider: 'google-play',\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const googlePlayMonetizationUrls: {
|
|
2
|
+
oneTimeList: (packageName: string, pageToken?: string) => string;
|
|
3
|
+
subscriptionsList: (packageName: string, pageToken?: string) => string;
|
|
4
|
+
convertPrices: (packageName: string) => string;
|
|
5
|
+
oneTimeProduct: (packageName: string, productId: string) => string;
|
|
6
|
+
oneTimePatch: (packageName: string, productId: string, regionVersion: string, updateMask: string, allowMissing?: boolean) => string;
|
|
7
|
+
subscription: (packageName: string, productId: string) => string;
|
|
8
|
+
subscriptionCreate: (packageName: string, productId: string, regionVersion: string) => string;
|
|
9
|
+
subscriptionPatch: (packageName: string, productId: string, regionVersion: string, updateMask: string) => string;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=googlePlayMonetizationUrls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googlePlayMonetizationUrls.d.ts","sourceRoot":"","sources":["../../../src/providers/googlePlay/googlePlayMonetizationUrls.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,0BAA0B;+BACV,MAAM,cAAc,MAAM;qCAEpB,MAAM,cAAc,MAAM;iCAE9B,MAAM;kCACL,MAAM,aAAa,MAAM;gCAGxC,MAAM,aACR,MAAM,iBACF,MAAM,cACT,MAAM;gCAQQ,MAAM,aAAa,MAAM;sCAEnB,MAAM,aAAa,MAAM,iBAAiB,MAAM;qCAQnE,MAAM,aACR,MAAM,iBACF,MAAM,cACT,MAAM;CAMrB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const BASE = 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications';
|
|
2
|
+
function app(packageName) {
|
|
3
|
+
return `${BASE}/${encodeURIComponent(packageName)}`;
|
|
4
|
+
}
|
|
5
|
+
function withPage(url, pageToken) {
|
|
6
|
+
const query = new URLSearchParams({ pageSize: '1000' });
|
|
7
|
+
if (pageToken !== undefined)
|
|
8
|
+
query.set('pageToken', pageToken);
|
|
9
|
+
return `${url}?${query.toString()}`;
|
|
10
|
+
}
|
|
11
|
+
function patchQuery(regionVersion, updateMask, allowMissing = false) {
|
|
12
|
+
const query = new URLSearchParams({
|
|
13
|
+
'regionsVersion.version': regionVersion,
|
|
14
|
+
updateMask,
|
|
15
|
+
});
|
|
16
|
+
if (allowMissing)
|
|
17
|
+
query.set('allowMissing', 'true');
|
|
18
|
+
return query.toString();
|
|
19
|
+
}
|
|
20
|
+
export const googlePlayMonetizationUrls = {
|
|
21
|
+
oneTimeList: (packageName, pageToken) => withPage(`${app(packageName)}/oneTimeProducts`, pageToken),
|
|
22
|
+
subscriptionsList: (packageName, pageToken) => withPage(`${app(packageName)}/subscriptions`, pageToken),
|
|
23
|
+
convertPrices: (packageName) => `${app(packageName)}/pricing:convertRegionPrices`,
|
|
24
|
+
oneTimeProduct: (packageName, productId) => `${app(packageName)}/onetimeproducts/${encodeURIComponent(productId)}`,
|
|
25
|
+
oneTimePatch: (packageName, productId, regionVersion, updateMask, allowMissing = false) => `${app(packageName)}/onetimeproducts/${encodeURIComponent(productId)}?${patchQuery(regionVersion, updateMask, allowMissing)}`,
|
|
26
|
+
subscription: (packageName, productId) => `${app(packageName)}/subscriptions/${encodeURIComponent(productId)}`,
|
|
27
|
+
subscriptionCreate: (packageName, productId, regionVersion) => {
|
|
28
|
+
const query = new URLSearchParams({
|
|
29
|
+
productId,
|
|
30
|
+
'regionsVersion.version': regionVersion,
|
|
31
|
+
});
|
|
32
|
+
return `${app(packageName)}/subscriptions?${query.toString()}`;
|
|
33
|
+
},
|
|
34
|
+
subscriptionPatch: (packageName, productId, regionVersion, updateMask) => `${app(packageName)}/subscriptions/${encodeURIComponent(productId)}?${patchQuery(regionVersion, updateMask)}`,
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=googlePlayMonetizationUrls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googlePlayMonetizationUrls.js","sourceRoot":"","sources":["../../../src/providers/googlePlay/googlePlayMonetizationUrls.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAAG,0EAA0E,CAAC;AAExF,SAAS,GAAG,CAAC,WAAmB;IAC9B,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,SAAkB;IAC/C,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,IAAI,SAAS,KAAK,SAAS;QAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/D,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,aAAqB,EAAE,UAAkB,EAAE,YAAY,GAAG,KAAK;IACjF,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;QAChC,wBAAwB,EAAE,aAAa;QACvC,UAAU;KACX,CAAC,CAAC;IACH,IAAI,YAAY;QAAE,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,WAAW,EAAE,CAAC,WAAmB,EAAE,SAAkB,EAAE,EAAE,CACvD,QAAQ,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC;IAC5D,iBAAiB,EAAE,CAAC,WAAmB,EAAE,SAAkB,EAAE,EAAE,CAC7D,QAAQ,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,gBAAgB,EAAE,SAAS,CAAC;IAC1D,aAAa,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,8BAA8B;IACzF,cAAc,EAAE,CAAC,WAAmB,EAAE,SAAiB,EAAE,EAAE,CACzD,GAAG,GAAG,CAAC,WAAW,CAAC,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,EAAE;IACxE,YAAY,EAAE,CACZ,WAAmB,EACnB,SAAiB,EACjB,aAAqB,EACrB,UAAkB,EAClB,YAAY,GAAG,KAAK,EACpB,EAAE,CACF,GAAG,GAAG,CAAC,WAAW,CAAC,oBAAoB,kBAAkB,CAAC,SAAS,CAAC,IAAI,UAAU,CAChF,aAAa,EACb,UAAU,EACV,YAAY,CACb,EAAE;IACL,YAAY,EAAE,CAAC,WAAmB,EAAE,SAAiB,EAAE,EAAE,CACvD,GAAG,GAAG,CAAC,WAAW,CAAC,kBAAkB,kBAAkB,CAAC,SAAS,CAAC,EAAE;IACtE,kBAAkB,EAAE,CAAC,WAAmB,EAAE,SAAiB,EAAE,aAAqB,EAAE,EAAE;QACpF,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;YAChC,SAAS;YACT,wBAAwB,EAAE,aAAa;SACxC,CAAC,CAAC;QACH,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,kBAAkB,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,iBAAiB,EAAE,CACjB,WAAmB,EACnB,SAAiB,EACjB,aAAqB,EACrB,UAAkB,EAClB,EAAE,CACF,GAAG,GAAG,CAAC,WAAW,CAAC,kBAAkB,kBAAkB,CAAC,SAAS,CAAC,IAAI,UAAU,CAC9E,aAAa,EACb,UAAU,CACX,EAAE;CACN,CAAC","sourcesContent":["const BASE = 'https://androidpublisher.googleapis.com/androidpublisher/v3/applications';\n\nfunction app(packageName: string): string {\n return `${BASE}/${encodeURIComponent(packageName)}`;\n}\n\nfunction withPage(url: string, pageToken?: string): string {\n const query = new URLSearchParams({ pageSize: '1000' });\n if (pageToken !== undefined) query.set('pageToken', pageToken);\n return `${url}?${query.toString()}`;\n}\n\nfunction patchQuery(regionVersion: string, updateMask: string, allowMissing = false): string {\n const query = new URLSearchParams({\n 'regionsVersion.version': regionVersion,\n updateMask,\n });\n if (allowMissing) query.set('allowMissing', 'true');\n return query.toString();\n}\n\nexport const googlePlayMonetizationUrls = {\n oneTimeList: (packageName: string, pageToken?: string) =>\n withPage(`${app(packageName)}/oneTimeProducts`, pageToken),\n subscriptionsList: (packageName: string, pageToken?: string) =>\n withPage(`${app(packageName)}/subscriptions`, pageToken),\n convertPrices: (packageName: string) => `${app(packageName)}/pricing:convertRegionPrices`,\n oneTimeProduct: (packageName: string, productId: string) =>\n `${app(packageName)}/onetimeproducts/${encodeURIComponent(productId)}`,\n oneTimePatch: (\n packageName: string,\n productId: string,\n regionVersion: string,\n updateMask: string,\n allowMissing = false,\n ) =>\n `${app(packageName)}/onetimeproducts/${encodeURIComponent(productId)}?${patchQuery(\n regionVersion,\n updateMask,\n allowMissing,\n )}`,\n subscription: (packageName: string, productId: string) =>\n `${app(packageName)}/subscriptions/${encodeURIComponent(productId)}`,\n subscriptionCreate: (packageName: string, productId: string, regionVersion: string) => {\n const query = new URLSearchParams({\n productId,\n 'regionsVersion.version': regionVersion,\n });\n return `${app(packageName)}/subscriptions?${query.toString()}`;\n },\n subscriptionPatch: (\n packageName: string,\n productId: string,\n regionVersion: string,\n updateMask: string,\n ) =>\n `${app(packageName)}/subscriptions/${encodeURIComponent(productId)}?${patchQuery(\n regionVersion,\n updateMask,\n )}`,\n};\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DeploymentCredentialReference } from '../../domain/DeploymentCredentialReference';
|
|
2
|
+
import type { DeploymentSecretResolver } from '../../domain/DeploymentSecretResolver';
|
|
3
|
+
import type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';
|
|
4
|
+
import type { GooglePlayMonetizationInspectionResult } from './GooglePlayMonetizationResult';
|
|
5
|
+
import type { GooglePlayTokenFactory } from './GooglePlayTokenFactory';
|
|
6
|
+
import type { GooglePlayTransport } from './GooglePlayTransport';
|
|
7
|
+
export declare function inspectGooglePlayMonetization(options: {
|
|
8
|
+
readonly packageName: string;
|
|
9
|
+
readonly desired: MonetizationDesiredState;
|
|
10
|
+
readonly credentials: readonly DeploymentCredentialReference[];
|
|
11
|
+
readonly resolveSecret: DeploymentSecretResolver;
|
|
12
|
+
readonly createToken: GooglePlayTokenFactory;
|
|
13
|
+
readonly request: GooglePlayTransport;
|
|
14
|
+
}): Promise<GooglePlayMonetizationInspectionResult>;
|
|
15
|
+
//# sourceMappingURL=inspectGooglePlayMonetization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectGooglePlayMonetization.d.ts","sourceRoot":"","sources":["../../../src/providers/googlePlay/inspectGooglePlayMonetization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,gCAAgC,CAAC;AAE7F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAKjE,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC,GAAG,OAAO,CAAC,sCAAsC,CAAC,CAclD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { trackGooglePlayRequests } from './GooglePlayRequestTracker';
|
|
2
|
+
import { normalizeGooglePlayMonetization } from './normalizeGooglePlayMonetization';
|
|
3
|
+
import { readGooglePlayMonetizationResources } from './readGooglePlayMonetizationResources';
|
|
4
|
+
import { resolveGooglePlayAccessToken } from './resolveGooglePlayAccessToken';
|
|
5
|
+
export async function inspectGooglePlayMonetization(options) {
|
|
6
|
+
const access = await resolveGooglePlayAccessToken(options);
|
|
7
|
+
if (!access.ok)
|
|
8
|
+
return { status: 'action-required', action: access.action };
|
|
9
|
+
const tracker = trackGooglePlayRequests(options.request);
|
|
10
|
+
const resources = await readGooglePlayMonetizationResources({
|
|
11
|
+
packageName: options.packageName,
|
|
12
|
+
token: access.token,
|
|
13
|
+
request: tracker.request,
|
|
14
|
+
});
|
|
15
|
+
if (resources === null)
|
|
16
|
+
return providerFailure(tracker.blockingStatus());
|
|
17
|
+
return {
|
|
18
|
+
status: 'completed',
|
|
19
|
+
state: normalizeGooglePlayMonetization({ desired: options.desired, ...resources }),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function providerFailure(status) {
|
|
23
|
+
if (status === 401)
|
|
24
|
+
return action('authentication', 'GOOGLE_PLAY_AUTHENTICATION_REQUIRED');
|
|
25
|
+
if (status === 403)
|
|
26
|
+
return action('manual-action', 'GOOGLE_PLAY_MONETIZATION_PERMISSION_REQUIRED');
|
|
27
|
+
return {
|
|
28
|
+
status: 'failed',
|
|
29
|
+
failure: {
|
|
30
|
+
code: 'GOOGLE_PLAY_MONETIZATION_INSPECTION_FAILED',
|
|
31
|
+
message: 'Google Play monetization state could not be inspected.',
|
|
32
|
+
target: 'android',
|
|
33
|
+
provider: 'google-play',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function action(type, code) {
|
|
38
|
+
return {
|
|
39
|
+
status: 'action-required',
|
|
40
|
+
action: {
|
|
41
|
+
type,
|
|
42
|
+
provider: 'google-play',
|
|
43
|
+
target: 'android',
|
|
44
|
+
code,
|
|
45
|
+
message: 'Google Play monetization access requires provider action.',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=inspectGooglePlayMonetization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectGooglePlayMonetization.js","sourceRoot":"","sources":["../../../src/providers/googlePlay/inspectGooglePlayMonetization.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAE9E,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAOnD;IACC,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5E,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,mCAAmC,CAAC;QAC1D,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACzE,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,+BAA+B,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;KACnF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAwB;IAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,CAAC;IAC3F,IAAI,MAAM,KAAK,GAAG;QAChB,OAAO,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;IACjF,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,IAAI,EAAE,4CAA4C;YAClD,OAAO,EAAE,wDAAwD;YACjE,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,aAAa;SACxB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CACb,IAAwC,EACxC,IAAY;IAEZ,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE;YACN,IAAI;YACJ,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,SAAS;YACjB,IAAI;YACJ,OAAO,EAAE,2DAA2D;SACrE;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 type { GooglePlayMonetizationInspectionResult } from './GooglePlayMonetizationResult';\nimport { trackGooglePlayRequests } from './GooglePlayRequestTracker';\nimport type { GooglePlayTokenFactory } from './GooglePlayTokenFactory';\nimport type { GooglePlayTransport } from './GooglePlayTransport';\nimport { normalizeGooglePlayMonetization } from './normalizeGooglePlayMonetization';\nimport { readGooglePlayMonetizationResources } from './readGooglePlayMonetizationResources';\nimport { resolveGooglePlayAccessToken } from './resolveGooglePlayAccessToken';\n\nexport async function inspectGooglePlayMonetization(options: {\n readonly packageName: string;\n readonly desired: MonetizationDesiredState;\n readonly credentials: readonly DeploymentCredentialReference[];\n readonly resolveSecret: DeploymentSecretResolver;\n readonly createToken: GooglePlayTokenFactory;\n readonly request: GooglePlayTransport;\n}): Promise<GooglePlayMonetizationInspectionResult> {\n const access = await resolveGooglePlayAccessToken(options);\n if (!access.ok) return { status: 'action-required', action: access.action };\n const tracker = trackGooglePlayRequests(options.request);\n const resources = await readGooglePlayMonetizationResources({\n packageName: options.packageName,\n token: access.token,\n request: tracker.request,\n });\n if (resources === null) return providerFailure(tracker.blockingStatus());\n return {\n status: 'completed',\n state: normalizeGooglePlayMonetization({ desired: options.desired, ...resources }),\n };\n}\n\nfunction providerFailure(status: 401 | 403 | null): GooglePlayMonetizationInspectionResult {\n if (status === 401) return action('authentication', 'GOOGLE_PLAY_AUTHENTICATION_REQUIRED');\n if (status === 403)\n return action('manual-action', 'GOOGLE_PLAY_MONETIZATION_PERMISSION_REQUIRED');\n return {\n status: 'failed',\n failure: {\n code: 'GOOGLE_PLAY_MONETIZATION_INSPECTION_FAILED',\n message: 'Google Play monetization state could not be inspected.',\n target: 'android',\n provider: 'google-play',\n },\n };\n}\n\nfunction action(\n type: 'authentication' | 'manual-action',\n code: string,\n): GooglePlayMonetizationInspectionResult {\n return {\n status: 'action-required',\n action: {\n type,\n provider: 'google-play',\n target: 'android',\n code,\n message: 'Google Play monetization access requires provider action.',\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';
|
|
2
|
+
import type { MonetizationTargetState } from '../../domain/monetization/MonetizationTargetState';
|
|
3
|
+
export declare function normalizeGooglePlayMonetization(options: {
|
|
4
|
+
readonly desired: MonetizationDesiredState;
|
|
5
|
+
readonly oneTimeProducts: readonly unknown[];
|
|
6
|
+
readonly subscriptions: readonly unknown[];
|
|
7
|
+
}): MonetizationTargetState;
|
|
8
|
+
//# sourceMappingURL=normalizeGooglePlayMonetization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeGooglePlayMonetization.d.ts","sourceRoot":"","sources":["../../../src/providers/googlePlay/normalizeGooglePlayMonetization.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAMnG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mDAAmD,CAAC;AAIjG,wBAAgB,+BAA+B,CAAC,OAAO,EAAE;IACvD,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,SAAS,OAAO,EAAE,CAAC;CAC5C,GAAG,uBAAuB,CAM1B"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
const PERIODS = new Set(['P1W', 'P1M', 'P2M', 'P3M', 'P6M', 'P1Y']);
|
|
2
|
+
export function normalizeGooglePlayMonetization(options) {
|
|
3
|
+
const diagnostics = [];
|
|
4
|
+
const products = options.desired.products.flatMap((desired) => normalizeProduct(desired, options, diagnostics));
|
|
5
|
+
return { target: 'android', products, subscriptionFamilies: [], diagnostics };
|
|
6
|
+
}
|
|
7
|
+
function normalizeProduct(desired, resources, diagnostics) {
|
|
8
|
+
const oneTime = findProduct(resources.oneTimeProducts, desired.id);
|
|
9
|
+
const subscription = findProduct(resources.subscriptions, desired.id);
|
|
10
|
+
if (oneTime !== undefined && subscription !== undefined) {
|
|
11
|
+
diagnostics.push(error(desired.id, 'GOOGLE_PLAY_PRODUCT_ID_CONFLICT'));
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
if (desired.kind === 'subscription') {
|
|
15
|
+
if (oneTime !== undefined)
|
|
16
|
+
return [normalizeOneTime(oneTime, desired, diagnostics)];
|
|
17
|
+
return subscription === undefined
|
|
18
|
+
? []
|
|
19
|
+
: [normalizeSubscription(subscription, desired, diagnostics)];
|
|
20
|
+
}
|
|
21
|
+
if (subscription !== undefined)
|
|
22
|
+
return [normalizeForeignSubscription(subscription, desired.id)];
|
|
23
|
+
return oneTime === undefined ? [] : [normalizeOneTime(oneTime, desired, diagnostics)];
|
|
24
|
+
}
|
|
25
|
+
function normalizeOneTime(value, desired, diagnostics) {
|
|
26
|
+
if (!isRecord(value))
|
|
27
|
+
return invalidObserved(desired.id, diagnostics);
|
|
28
|
+
const localizations = parseListings(value.listings);
|
|
29
|
+
const buyOptions = array(value.purchaseOptions).filter(isBuyOption);
|
|
30
|
+
if (localizations === null)
|
|
31
|
+
diagnostics.push(error(desired.id, 'GOOGLE_PLAY_LISTINGS_INVALID'));
|
|
32
|
+
if (buyOptions.length !== 1) {
|
|
33
|
+
diagnostics.push(error(desired.id, 'GOOGLE_PLAY_BUY_OPTION_UNSUPPORTED'));
|
|
34
|
+
}
|
|
35
|
+
const [buyOption] = buyOptions;
|
|
36
|
+
const basePrice = buyOptions.length === 1 && buyOption !== undefined
|
|
37
|
+
? readBasePrice(buyOption, desired.basePrice.country)
|
|
38
|
+
: undefined;
|
|
39
|
+
return {
|
|
40
|
+
id: desired.id,
|
|
41
|
+
kind: 'one-time',
|
|
42
|
+
localizations: localizations ?? [],
|
|
43
|
+
...(basePrice === undefined ? {} : { basePrice }),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function normalizeSubscription(value, desired, diagnostics) {
|
|
47
|
+
if (!isRecord(value))
|
|
48
|
+
return invalidObserved(desired.id, diagnostics);
|
|
49
|
+
const localizations = parseListings(value.listings);
|
|
50
|
+
const plans = array(value.basePlans).filter(isAutoRenewingPlan);
|
|
51
|
+
if (localizations === null)
|
|
52
|
+
diagnostics.push(error(desired.id, 'GOOGLE_PLAY_LISTINGS_INVALID'));
|
|
53
|
+
if (plans.length !== 1) {
|
|
54
|
+
diagnostics.push(error(desired.id, 'GOOGLE_PLAY_BASE_PLAN_UNSUPPORTED'));
|
|
55
|
+
return { id: desired.id, kind: 'subscription', localizations: localizations ?? [] };
|
|
56
|
+
}
|
|
57
|
+
const [plan] = plans;
|
|
58
|
+
if (plan === undefined)
|
|
59
|
+
return { id: desired.id, kind: 'subscription', localizations: [] };
|
|
60
|
+
return subscriptionObserved(plan, desired, localizations ?? [], diagnostics);
|
|
61
|
+
}
|
|
62
|
+
function subscriptionObserved(plan, desired, localizations, diagnostics) {
|
|
63
|
+
const auto = isRecord(plan.autoRenewingBasePlanType) ? plan.autoRenewingBasePlanType : {};
|
|
64
|
+
const period = auto.billingPeriodDuration;
|
|
65
|
+
if (!isPeriod(period)) {
|
|
66
|
+
diagnostics.push(error(desired.id, 'GOOGLE_PLAY_SUBSCRIPTION_PERIOD_UNSUPPORTED'));
|
|
67
|
+
return { id: desired.id, kind: 'subscription', localizations };
|
|
68
|
+
}
|
|
69
|
+
if (desired.subscription?.period !== period) {
|
|
70
|
+
diagnostics.push(error(desired.id, 'GOOGLE_PLAY_SUBSCRIPTION_PERIOD_IMMUTABLE'));
|
|
71
|
+
}
|
|
72
|
+
const basePrice = readBasePrice(plan, desired.basePrice.country);
|
|
73
|
+
return {
|
|
74
|
+
id: desired.id,
|
|
75
|
+
kind: 'subscription',
|
|
76
|
+
localizations,
|
|
77
|
+
...(basePrice === undefined ? {} : { basePrice }),
|
|
78
|
+
subscription: {
|
|
79
|
+
family: desired.subscription?.family ?? desired.id,
|
|
80
|
+
period,
|
|
81
|
+
...(desired.subscription?.level === undefined ? {} : { level: desired.subscription.level }),
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function normalizeForeignSubscription(value, productId) {
|
|
86
|
+
const localizations = isRecord(value) ? parseListings(value.listings) : null;
|
|
87
|
+
return { id: productId, kind: 'subscription', localizations: localizations ?? [] };
|
|
88
|
+
}
|
|
89
|
+
function invalidObserved(productId, diagnostics) {
|
|
90
|
+
diagnostics.push(error(productId, 'GOOGLE_PLAY_PRODUCT_INVALID'));
|
|
91
|
+
return { id: productId, kind: 'one-time', localizations: [] };
|
|
92
|
+
}
|
|
93
|
+
function parseListings(value) {
|
|
94
|
+
if (!Array.isArray(value))
|
|
95
|
+
return null;
|
|
96
|
+
const result = [];
|
|
97
|
+
for (const item of value) {
|
|
98
|
+
if (!isRecord(item))
|
|
99
|
+
return null;
|
|
100
|
+
const locale = normalizeLocale(item.languageCode);
|
|
101
|
+
if (locale === null || !isString(item.title) || !isString(item.description))
|
|
102
|
+
return null;
|
|
103
|
+
result.push({ locale, name: item.title, description: item.description });
|
|
104
|
+
}
|
|
105
|
+
return result.sort((a, b) => a.locale.localeCompare(b.locale));
|
|
106
|
+
}
|
|
107
|
+
function readBasePrice(value, country) {
|
|
108
|
+
const configs = array(value.regionalPricingAndAvailabilityConfigs ?? value.regionalConfigs).filter(isRecord);
|
|
109
|
+
const config = configs.find((item) => item.regionCode === country);
|
|
110
|
+
return config === undefined ? undefined : readMoney(config.price, country);
|
|
111
|
+
}
|
|
112
|
+
function readMoney(value, country) {
|
|
113
|
+
if (!isRecord(value) || !isString(value.currencyCode) || !isInteger(value.nanos))
|
|
114
|
+
return undefined;
|
|
115
|
+
if (!isString(value.units) || !/^\d+$/.test(value.units))
|
|
116
|
+
return undefined;
|
|
117
|
+
if (value.nanos < 0 || value.nanos > 999_999_999)
|
|
118
|
+
return undefined;
|
|
119
|
+
const fraction = String(value.nanos).padStart(9, '0').replace(/0+$/, '');
|
|
120
|
+
return {
|
|
121
|
+
country,
|
|
122
|
+
currency: value.currencyCode,
|
|
123
|
+
amount: fraction.length === 0 ? value.units : `${value.units}.${fraction}`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function findProduct(values, productId) {
|
|
127
|
+
return values.find((value) => isRecord(value) && value.productId === productId);
|
|
128
|
+
}
|
|
129
|
+
function isBuyOption(value) {
|
|
130
|
+
return isRecord(value) && isRecord(value.buyOption);
|
|
131
|
+
}
|
|
132
|
+
function isAutoRenewingPlan(value) {
|
|
133
|
+
return isRecord(value) && isRecord(value.autoRenewingBasePlanType);
|
|
134
|
+
}
|
|
135
|
+
function array(value) {
|
|
136
|
+
return Array.isArray(value) ? value : [];
|
|
137
|
+
}
|
|
138
|
+
function normalizeLocale(value) {
|
|
139
|
+
if (!isString(value))
|
|
140
|
+
return null;
|
|
141
|
+
try {
|
|
142
|
+
return Intl.getCanonicalLocales(value)[0] ?? null;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function isPeriod(value) {
|
|
149
|
+
return typeof value === 'string' && PERIODS.has(value);
|
|
150
|
+
}
|
|
151
|
+
function isRecord(value) {
|
|
152
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
153
|
+
}
|
|
154
|
+
function isString(value) {
|
|
155
|
+
return typeof value === 'string';
|
|
156
|
+
}
|
|
157
|
+
function isInteger(value) {
|
|
158
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
159
|
+
}
|
|
160
|
+
function error(productId, code) {
|
|
161
|
+
return {
|
|
162
|
+
severity: 'error',
|
|
163
|
+
code,
|
|
164
|
+
message: `Google Play monetization product ${productId} cannot be normalized safely.`,
|
|
165
|
+
target: 'android',
|
|
166
|
+
productId,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=normalizeGooglePlayMonetization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeGooglePlayMonetization.js","sourceRoot":"","sources":["../../../src/providers/googlePlay/normalizeGooglePlayMonetization.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MonetizationBasePrice } from '../../domain/monetization/MonetizationBasePrice';\nimport type { MonetizationDesiredState } from '../../domain/monetization/MonetizationDesiredState';\nimport type { MonetizationDiagnostic } from '../../domain/monetization/MonetizationDiagnostic';\nimport type { MonetizationLocalization } from '../../domain/monetization/MonetizationLocalization';\nimport type { MonetizationObservedProduct } from '../../domain/monetization/MonetizationObservedProduct';\nimport type { MonetizationProduct } from '../../domain/monetization/MonetizationProduct';\nimport type { MonetizationSubscriptionPeriod } from '../../domain/monetization/MonetizationSubscription';\nimport type { MonetizationTargetState } from '../../domain/monetization/MonetizationTargetState';\n\nconst PERIODS = new Set<MonetizationSubscriptionPeriod>(['P1W', 'P1M', 'P2M', 'P3M', 'P6M', 'P1Y']);\n\nexport function normalizeGooglePlayMonetization(options: {\n readonly desired: MonetizationDesiredState;\n readonly oneTimeProducts: readonly unknown[];\n readonly subscriptions: readonly unknown[];\n}): MonetizationTargetState {\n const diagnostics: MonetizationDiagnostic[] = [];\n const products = options.desired.products.flatMap((desired) =>\n normalizeProduct(desired, options, diagnostics),\n );\n return { target: 'android', products, subscriptionFamilies: [], diagnostics };\n}\n\nfunction normalizeProduct(\n desired: MonetizationProduct,\n resources: {\n readonly oneTimeProducts: readonly unknown[];\n readonly subscriptions: readonly unknown[];\n },\n diagnostics: MonetizationDiagnostic[],\n): MonetizationObservedProduct[] {\n const oneTime = findProduct(resources.oneTimeProducts, desired.id);\n const subscription = findProduct(resources.subscriptions, desired.id);\n if (oneTime !== undefined && subscription !== undefined) {\n diagnostics.push(error(desired.id, 'GOOGLE_PLAY_PRODUCT_ID_CONFLICT'));\n return [];\n }\n if (desired.kind === 'subscription') {\n if (oneTime !== undefined) return [normalizeOneTime(oneTime, desired, diagnostics)];\n return subscription === undefined\n ? []\n : [normalizeSubscription(subscription, desired, diagnostics)];\n }\n if (subscription !== undefined) return [normalizeForeignSubscription(subscription, desired.id)];\n return oneTime === undefined ? [] : [normalizeOneTime(oneTime, desired, diagnostics)];\n}\n\nfunction normalizeOneTime(\n value: unknown,\n desired: MonetizationProduct,\n diagnostics: MonetizationDiagnostic[],\n): MonetizationObservedProduct {\n if (!isRecord(value)) return invalidObserved(desired.id, diagnostics);\n const localizations = parseListings(value.listings);\n const buyOptions = array(value.purchaseOptions).filter(isBuyOption);\n if (localizations === null) diagnostics.push(error(desired.id, 'GOOGLE_PLAY_LISTINGS_INVALID'));\n if (buyOptions.length !== 1) {\n diagnostics.push(error(desired.id, 'GOOGLE_PLAY_BUY_OPTION_UNSUPPORTED'));\n }\n const [buyOption] = buyOptions;\n const basePrice =\n buyOptions.length === 1 && buyOption !== undefined\n ? readBasePrice(buyOption, desired.basePrice.country)\n : undefined;\n return {\n id: desired.id,\n kind: 'one-time',\n localizations: localizations ?? [],\n ...(basePrice === undefined ? {} : { basePrice }),\n };\n}\n\nfunction normalizeSubscription(\n value: unknown,\n desired: MonetizationProduct,\n diagnostics: MonetizationDiagnostic[],\n): MonetizationObservedProduct {\n if (!isRecord(value)) return invalidObserved(desired.id, diagnostics);\n const localizations = parseListings(value.listings);\n const plans = array(value.basePlans).filter(isAutoRenewingPlan);\n if (localizations === null) diagnostics.push(error(desired.id, 'GOOGLE_PLAY_LISTINGS_INVALID'));\n if (plans.length !== 1) {\n diagnostics.push(error(desired.id, 'GOOGLE_PLAY_BASE_PLAN_UNSUPPORTED'));\n return { id: desired.id, kind: 'subscription', localizations: localizations ?? [] };\n }\n const [plan] = plans;\n if (plan === undefined) return { id: desired.id, kind: 'subscription', localizations: [] };\n return subscriptionObserved(plan, desired, localizations ?? [], diagnostics);\n}\n\nfunction subscriptionObserved(\n plan: Record<string, unknown>,\n desired: MonetizationProduct,\n localizations: readonly MonetizationLocalization[],\n diagnostics: MonetizationDiagnostic[],\n): MonetizationObservedProduct {\n const auto = isRecord(plan.autoRenewingBasePlanType) ? plan.autoRenewingBasePlanType : {};\n const period = auto.billingPeriodDuration;\n if (!isPeriod(period)) {\n diagnostics.push(error(desired.id, 'GOOGLE_PLAY_SUBSCRIPTION_PERIOD_UNSUPPORTED'));\n return { id: desired.id, kind: 'subscription', localizations };\n }\n if (desired.subscription?.period !== period) {\n diagnostics.push(error(desired.id, 'GOOGLE_PLAY_SUBSCRIPTION_PERIOD_IMMUTABLE'));\n }\n const basePrice = readBasePrice(plan, desired.basePrice.country);\n return {\n id: desired.id,\n kind: 'subscription',\n localizations,\n ...(basePrice === undefined ? {} : { basePrice }),\n subscription: {\n family: desired.subscription?.family ?? desired.id,\n period,\n ...(desired.subscription?.level === undefined ? {} : { level: desired.subscription.level }),\n },\n };\n}\n\nfunction normalizeForeignSubscription(\n value: unknown,\n productId: string,\n): MonetizationObservedProduct {\n const localizations = isRecord(value) ? parseListings(value.listings) : null;\n return { id: productId, kind: 'subscription', localizations: localizations ?? [] };\n}\n\nfunction invalidObserved(\n productId: string,\n diagnostics: MonetizationDiagnostic[],\n): MonetizationObservedProduct {\n diagnostics.push(error(productId, 'GOOGLE_PLAY_PRODUCT_INVALID'));\n return { id: productId, kind: 'one-time', localizations: [] };\n}\n\nfunction parseListings(value: unknown): readonly MonetizationLocalization[] | null {\n if (!Array.isArray(value)) return null;\n const result: MonetizationLocalization[] = [];\n for (const item of value as unknown[]) {\n if (!isRecord(item)) return null;\n const locale = normalizeLocale(item.languageCode);\n if (locale === null || !isString(item.title) || !isString(item.description)) return null;\n result.push({ locale, name: item.title, description: item.description });\n }\n return result.sort((a, b) => a.locale.localeCompare(b.locale));\n}\n\nfunction readBasePrice(\n value: Record<string, unknown>,\n country: string,\n): MonetizationBasePrice | undefined {\n const configs = array(\n value.regionalPricingAndAvailabilityConfigs ?? value.regionalConfigs,\n ).filter(isRecord);\n const config = configs.find((item) => item.regionCode === country);\n return config === undefined ? undefined : readMoney(config.price, country);\n}\n\nfunction readMoney(value: unknown, country: string): MonetizationBasePrice | undefined {\n if (!isRecord(value) || !isString(value.currencyCode) || !isInteger(value.nanos))\n return undefined;\n if (!isString(value.units) || !/^\\d+$/.test(value.units)) return undefined;\n if (value.nanos < 0 || value.nanos > 999_999_999) return undefined;\n const fraction = String(value.nanos).padStart(9, '0').replace(/0+$/, '');\n return {\n country,\n currency: value.currencyCode,\n amount: fraction.length === 0 ? value.units : `${value.units}.${fraction}`,\n };\n}\n\nfunction findProduct(values: readonly unknown[], productId: string): unknown {\n return values.find((value) => isRecord(value) && value.productId === productId);\n}\n\nfunction isBuyOption(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && isRecord(value.buyOption);\n}\n\nfunction isAutoRenewingPlan(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && isRecord(value.autoRenewingBasePlanType);\n}\n\nfunction array(value: unknown): readonly unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction normalizeLocale(value: unknown): string | null {\n if (!isString(value)) return null;\n try {\n return Intl.getCanonicalLocales(value)[0] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction isPeriod(value: unknown): value is MonetizationSubscriptionPeriod {\n return typeof value === 'string' && PERIODS.has(value as MonetizationSubscriptionPeriod);\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\nfunction isInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value);\n}\n\nfunction error(productId: string, code: string): MonetizationDiagnostic {\n return {\n severity: 'error',\n code,\n message: `Google Play monetization product ${productId} cannot be normalized safely.`,\n target: 'android',\n productId,\n };\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GooglePlayTransport } from './GooglePlayTransport';
|
|
2
|
+
interface GooglePlayMonetizationResources {
|
|
3
|
+
readonly oneTimeProducts: readonly unknown[];
|
|
4
|
+
readonly subscriptions: readonly unknown[];
|
|
5
|
+
}
|
|
6
|
+
export declare function readGooglePlayMonetizationResources(options: {
|
|
7
|
+
readonly packageName: string;
|
|
8
|
+
readonly token: string;
|
|
9
|
+
readonly request: GooglePlayTransport;
|
|
10
|
+
}): Promise<GooglePlayMonetizationResources | null>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=readGooglePlayMonetizationResources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readGooglePlayMonetizationResources.d.ts","sourceRoot":"","sources":["../../../src/providers/googlePlay/readGooglePlayMonetizationResources.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,UAAU,+BAA+B;IACvC,QAAQ,CAAC,eAAe,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,SAAS,OAAO,EAAE,CAAC;CAC5C;AAED,wBAAsB,mCAAmC,CAAC,OAAO,EAAE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC,GAAG,OAAO,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAalD"}
|