UNPKG

@adapty/capacitor

Version:
1,534 lines (1,500 loc) 184 kB
'use strict'; var core = require('@capacitor/core'); const AdaptyCapacitorPlugin = core.registerPlugin('AdaptyCapacitorPlugin', { web: () => Promise.resolve().then(function () { return web; }).then((m) => new m.AdaptyCapacitorPluginWeb()), }); // import SDK type to link to methods in docs. // import { AdaptyError } from '../sdk2/error'; const ErrorCodeMapping = { /** * System StoreKit codes */ 0: 'unknown', /** * Client is not allowed to make a request, etc. */ 1: 'clientInvalid', /** * Invalid purchase identifier, etc. */ 3: 'paymentInvalid', /** * This device is not allowed to make the payment. */ 4: 'paymentNotAllowed', /** * Product is not available in the current storefront. */ 5: 'storeProductNotAvailable', /** * User has not allowed access to cloud service information. */ 6: 'cloudServicePermissionDenied', /** * The device could not connect to the network. */ 7: 'cloudServiceNetworkConnectionFailed', /** * User has revoked permission to use this cloud service. */ 8: 'cloudServiceRevoked', /** * The user needs to acknowledge Apple's privacy policy. */ 9: 'privacyAcknowledgementRequired', /** * The app is attempting to use SKPayment's requestData property, * but does not have the appropriate entitlement. */ 10: 'unauthorizedRequestData', /** * The specified subscription offer identifier is not valid. */ 11: 'invalidOfferIdentifier', /** * The cryptographic signature provided is not valid. */ 12: 'invalidSignature', /** * One or more parameters from SKPaymentDiscount is missing. */ 13: 'missingOfferParams', 14: 'invalidOfferPrice', /** * Custom Android codes. */ 20: 'adaptyNotInitialized', 22: 'productNotFound', 24: 'currentSubscriptionToUpdateNotFoundInHistory', 97: 'billingServiceTimeout', 98: 'featureNotSupported', 99: 'billingServiceDisconnected', 102: 'billingServiceUnavailable', 103: 'billingUnavailable', 105: 'developerError', 106: 'billingError', 107: 'itemAlreadyOwned', 108: 'itemNotOwned', 112: 'billingNetworkError', 1000: 'noProductIDsFound', 1002: 'productRequestFailed', /** * In-App Purchases are not allowed on this device. */ 1003: 'cantMakePayments', 1004: 'noPurchasesToRestore', 1005: 'cantReadReceipt', 1006: 'productPurchaseFailed', 1010: 'refreshReceiptFailed', 1011: 'receiveRestoredTransactionsFailed', /** * You need to be authenticated to perform requests. */ 2002: 'notActivated', 2003: 'badRequest', 2004: 'serverError', 2005: 'networkFailed', 2006: 'decodingFailed', 2009: 'encodingFailed', 3000: 'analyticsDisabled', /** * Wrong parameter was passed. */ 3001: 'wrongParam', /** * It is not possible to call `.activate` method more than once. */ 3005: 'activateOnceError', /** * The user profile was changed during the operation. */ 3006: 'profileWasChanged', 3007: 'unsupportedData', 3100: 'persistingDataError', 3101: 'fetchTimeoutError', 9000: 'operationInterrupted', }; const ErrorCode = Object.freeze(ErrorCodeMapping); const ErrorCodeNameMapping = Object.freeze({ unknown: 0, clientInvalid: 1, paymentInvalid: 3, paymentNotAllowed: 4, storeProductNotAvailable: 5, cloudServicePermissionDenied: 6, cloudServiceNetworkConnectionFailed: 7, cloudServiceRevoked: 8, privacyAcknowledgementRequired: 9, unauthorizedRequestData: 10, invalidOfferIdentifier: 11, invalidSignature: 12, missingOfferParams: 13, invalidOfferPrice: 14, adaptyNotInitialized: 20, productNotFound: 22, currentSubscriptionToUpdateNotFoundInHistory: 24, billingServiceTimeout: 97, featureNotSupported: 98, billingServiceDisconnected: 99, billingServiceUnavailable: 102, billingUnavailable: 103, developerError: 105, billingError: 106, itemAlreadyOwned: 107, itemNotOwned: 108, billingNetworkError: 112, noProductIDsFound: 1000, productRequestFailed: 1002, cantMakePayments: 1003, noPurchasesToRestore: 1004, cantReadReceipt: 1005, productPurchaseFailed: 1006, refreshReceiptFailed: 1010, receiveRestoredTransactionsFailed: 1011, notActivated: 2002, badRequest: 2003, serverError: 2004, networkFailed: 2005, decodingFailed: 2006, encodingFailed: 2009, analyticsDisabled: 3000, wrongParam: 3001, activateOnceError: 3005, profileWasChanged: 3006, unsupportedData: 3007, persistingDataError: 3100, fetchTimeoutError: 3101, operationInterrupted: 9000, }); const ErrorCodeName = ErrorCodeNameMapping; function getErrorCode(name) { var _a; return (_a = ErrorCodeName[name]) !== null && _a !== void 0 ? _a : undefined; } function getErrorPrompt(code) { const prompt = ErrorCode[code]; if (!prompt) { return `Unknown code: ${code}`; } return prompt; } class AdaptyError extends Error { constructor(input) { super(AdaptyError.getMessage(input)); this.adaptyCode = input.adaptyCode; this.localizedDescription = input.message; this.detail = input.detail; if (AdaptyError.middleware) { AdaptyError.middleware(this); } } static set onError(callback) { AdaptyError.middleware = callback; } static failedToDecodeNativeError(message, error) { return new AdaptyError({ adaptyCode: 0, message: message, detail: JSON.stringify(error), }); } static failedToEncode(message) { return new AdaptyError({ adaptyCode: 2009, message: message, }); } static failedToDecode(message) { return new AdaptyError({ adaptyCode: 2006, message: message, }); } static getMessage(input) { const code = input.adaptyCode; const codeText = ErrorCode[code]; let message = `#${code} (${codeText}): ${input.message}`; if (AdaptyError.prefix) { message = `${AdaptyError.prefix} ${message}`; } return message; } } // Custom prefix to be shown before log message AdaptyError.prefix = ''; // import { Platform } from 'react-native'; // Not available in Capacitor // Mock Platform for Capacitor const Platform = { OS: 'web' }; class Coder { encode(data) { return this.encodeWithProperties(data, this.properties); } // From vendor_product_id to productId decode(data) { return this.decodeWithProperties(data, this.properties); } isType(value, type) { switch (type) { case 'string': case 'boolean': case 'number': return typeof value === type; case 'object': return value !== null && typeof value === 'object'; case 'array': return Array.isArray(value); } } getNestedValue(obj, key) { const keys = key.split('.'); let current; if (typeof obj === 'string') { try { current = JSON.parse(obj); } catch (error) { return undefined; } } else { current = obj; } for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (current[key] !== undefined) { current = current[key]; } else { return undefined; } } return current; } assignNestedValue(obj, key, value) { const keys = String(key).split('.'); let currentObj = obj; for (let i = 0; i < keys.length - 1; i++) { const key = keys[i]; if (currentObj[key] === undefined) { currentObj[key] = {}; } currentObj = currentObj[key]; } currentObj[keys[keys.length - 1]] = value; return obj; } encodeWithProperties(data, properties) { const result = {}; for (const key in data) { if (key === 'ios' || key === 'android') { // Read properties from ios/android platform keys and flatten them const platformResult = this.encodeWithProperties(data[key], properties[key]); Object.assign(result, platformResult); continue; } const property = properties[key]; if (!property) { throw AdaptyError.failedToEncode(`Failed to find encoder for property "${key}"`); } const converter = property.converter; this.assignNestedValue(result, property.key, converter ? converter.encode(data[key]) : data[key]); } return result; } decodeWithProperties(data, properties, platform) { const result = {}; for (const key in properties) { if (key === 'android' || key === 'ios') { // Add ios/android property and fill platform data there result[key] = this.decodeWithProperties(data, properties[key], key); continue; } const property = properties[key]; if (!property) { throw AdaptyError.failedToDecode(`Failed to find decoder for property "${key}"`); } const value = this.getNestedValue(data, property.key); if (property.required && value === undefined && (!platform || platform == Platform.OS)) { throw AdaptyError.failedToDecode(`Failed to decode native response, because it is missing required property "${key}"`); } // If value is null or undefined and property is not required, continue if (value == null) continue; if (!this.isType(value, property.type)) { throw AdaptyError.failedToDecode(`Failed to decode native response, because its property "${key}" has invalid type. Expected type: ${property.type}. Received type: ${typeof value}`); } // If a converter is provided, use it to convert the value result[key] = property.converter ? property.converter.decode(value) : value; } return result; } } class SimpleCoder extends Coder { } class AdaptyNativeErrorCoder extends SimpleCoder { constructor() { super(...arguments); this.type = 'error'; this.properties = { adaptyCode: { key: 'adapty_code', required: true, type: 'number' }, message: { key: 'message', required: true, type: 'string' }, detail: { key: 'detail', required: false, type: 'string' }, }; } getError(data) { return new AdaptyError({ adaptyCode: data.adaptyCode, message: data.message, detail: data.detail, }); } } class ProductReferenceCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { vendorId: { key: 'vendor_product_id', required: true, type: 'string', }, adaptyId: { key: 'adapty_product_id', required: true, type: 'string', }, accessLevelId: { key: 'access_level_id', required: true, type: 'string', }, productType: { key: 'product_type', required: true, type: 'string', }, ios: { promotionalOfferId: { key: 'promotional_offer_id', required: false, type: 'string', }, winBackOfferId: { key: 'win_back_offer_id', required: false, type: 'string', }, }, android: { basePlanId: { key: 'base_plan_id', required: false, type: 'string', }, offerId: { key: 'offer_id', required: false, type: 'string', }, }, }; } } // Coder for Array<T> class ArrayCoder { constructor(coder) { this.coder = new coder(); } decode(input) { const result = []; input.forEach(value => { result.push(this.coder.decode(value)); }); return result; } encode(value) { const result = []; value.forEach(model => { result.push(this.coder.encode(model)); }); return result; } } function createArrayCoder(CoderClass) { return class ArrayCoderWrapper { constructor() { this.arrayCoderInstance = new ArrayCoder(CoderClass); } decode(data) { return this.arrayCoderInstance.decode(data); } encode(data) { return this.arrayCoderInstance.encode(data); } }; } class JSONCoder { decode(input) { if (!input) { return {}; } return JSON.parse(input); } encode(value) { if (Object.keys(value).length === 0) { return ''; } return JSON.stringify(value); } } var __rest$4 = (undefined && undefined.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; class AdaptyRemoteConfigCoder extends Coder { constructor() { super(...arguments); this.properties = { data: { key: 'data', required: true, type: 'string', converter: new JSONCoder(), }, lang: { key: 'lang', required: true, type: 'string', }, }; } decode(data) { const codablePart = super.decode(data); const dataString = JSON.stringify(codablePart.data); return Object.assign(Object.assign({}, codablePart), { dataString: dataString.length < 4 ? '' : dataString }); } encode(data) { const { dataString } = data, codablePart = __rest$4(data, ["dataString"]); return super.encode(codablePart); } } class AdaptyPaywallBuilderCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { id: { key: 'paywall_builder_id', required: true, type: 'string', }, lang: { key: 'lang', required: true, type: 'string', }, }; } } class AdaptyPlacementCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { abTestName: { key: 'ab_test_name', required: true, type: 'string' }, audienceName: { key: 'audience_name', required: true, type: 'string' }, id: { key: 'developer_id', required: true, type: 'string' }, revision: { key: 'revision', required: true, type: 'number' }, audienceVersionId: { key: 'placement_audience_version_id', required: true, type: 'string', }, isTrackingPurchases: { key: 'is_tracking_purchases', required: false, type: 'boolean', }, }; } } var __rest$3 = (undefined && undefined.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; class AdaptyPaywallCoder extends Coder { constructor() { super(...arguments); this.properties = { placement: { key: 'placement', required: true, type: 'object', converter: new AdaptyPlacementCoder(), }, id: { key: 'paywall_id', required: true, type: 'string' }, name: { key: 'paywall_name', required: true, type: 'string' }, products: { key: 'products', required: true, type: 'array', converter: new ArrayCoder(ProductReferenceCoder), }, remoteConfig: { key: 'remote_config', required: false, type: 'object', converter: new AdaptyRemoteConfigCoder(), }, variationId: { key: 'variation_id', required: true, type: 'string' }, version: { key: 'response_created_at', required: false, type: 'number' }, paywallBuilder: { key: 'paywall_builder', required: false, type: 'object', converter: new AdaptyPaywallBuilderCoder(), }, webPurchaseUrl: { key: 'web_purchase_url', required: false, type: 'string', }, payloadData: { key: 'payload_data', required: false, type: 'string' }, requestLocale: { key: 'request_locale', required: true, type: 'string' }, }; } decode(data) { const codablePart = super.decode(data); return Object.assign(Object.assign({}, codablePart), { hasViewConfiguration: codablePart.paywallBuilder !== undefined, productIdentifiers: codablePart.products.map(product => { var _a; return ({ vendorProductId: product.vendorId, adaptyProductId: product.adaptyId, basePlanId: (_a = product.android) === null || _a === void 0 ? void 0 : _a.basePlanId, }); }) }); } encode(data) { const { hasViewConfiguration, productIdentifiers } = data, codablePart = __rest$3(data, ["hasViewConfiguration", "productIdentifiers"]); return super.encode(codablePart); } } class AdaptyPriceCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { amount: { key: 'amount', required: true, type: 'number', }, currencyCode: { key: 'currency_code', required: false, type: 'string', }, currencySymbol: { key: 'currency_symbol', required: false, type: 'string', }, localizedString: { key: 'localized_string', required: false, type: 'string', }, }; } } class AdaptySubscriptionPeriodCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { unit: { key: 'unit', required: true, type: 'string' }, numberOfUnits: { key: 'number_of_units', required: true, type: 'number' }, }; } } class AdaptySubscriptionOfferIdCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { type: { key: 'type', required: true, type: 'string', }, id: { key: 'id', required: false, type: 'string', }, }; } } class AdaptyDiscountPhaseCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { localizedNumberOfPeriods: { key: 'localized_number_of_periods', required: false, type: 'string', }, localizedSubscriptionPeriod: { key: 'localized_subscription_period', required: false, type: 'string', }, numberOfPeriods: { key: 'number_of_periods', required: true, type: 'number', }, paymentMode: { key: 'payment_mode', required: true, type: 'string' }, price: { key: 'price', required: true, type: 'object', converter: new AdaptyPriceCoder(), }, subscriptionPeriod: { key: 'subscription_period', required: true, type: 'object', converter: new AdaptySubscriptionPeriodCoder(), }, }; } } var __rest$2 = (undefined && undefined.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; class AdaptySubscriptionOfferCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { identifier: { key: 'offer_identifier', required: true, type: 'object', converter: new AdaptySubscriptionOfferIdCoder(), }, phases: { key: 'phases', required: true, type: 'array', converter: new ArrayCoder(AdaptyDiscountPhaseCoder), }, android: { offerTags: { key: 'offer_tags', required: false, type: 'array', }, }, }; } decode(data) { const baseResult = super.decode(data); if (!data.offer_tags) { const { android } = baseResult, partialData = __rest$2(baseResult, ["android"]); return partialData; } return baseResult; } } var __rest$1 = (undefined && undefined.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; class AdaptySubscriptionDetailsCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { subscriptionPeriod: { key: 'period', required: true, type: 'object', converter: new AdaptySubscriptionPeriodCoder(), }, localizedSubscriptionPeriod: { key: 'localized_period', required: false, type: 'string', }, offer: { key: 'offer', required: false, type: 'object', converter: new AdaptySubscriptionOfferCoder(), }, ios: { subscriptionGroupIdentifier: { key: 'group_identifier', required: false, type: 'string', }, }, android: { basePlanId: { key: 'base_plan_id', required: true, type: 'string', }, renewalType: { key: 'renewal_type', required: false, type: 'string', }, }, }; } decode(data) { const baseResult = super.decode(data); const propToRemove = data.base_plan_id ? 'ios' : 'android'; const _a = baseResult, _b = propToRemove; _a[_b]; const partialData = __rest$1(_a, [typeof _b === "symbol" ? _b : _b + ""]); return partialData; } } class AdaptyPaywallProductCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { vendorProductId: { key: 'vendor_product_id', required: true, type: 'string', }, adaptyId: { key: 'adapty_product_id', required: true, type: 'string', }, accessLevelId: { key: 'access_level_id', required: true, type: 'string', }, productType: { key: 'product_type', required: true, type: 'string', }, paywallProductIndex: { key: 'paywall_product_index', required: true, type: 'number', }, localizedDescription: { key: 'localized_description', required: true, type: 'string', }, localizedTitle: { key: 'localized_title', required: true, type: 'string' }, regionCode: { key: 'region_code', required: false, type: 'string' }, variationId: { key: 'paywall_variation_id', required: true, type: 'string', }, paywallABTestName: { key: 'paywall_ab_test_name', required: true, type: 'string', }, paywallName: { key: 'paywall_name', required: true, type: 'string' }, price: { key: 'price', required: false, type: 'object', converter: new AdaptyPriceCoder(), }, webPurchaseUrl: { key: 'web_purchase_url', required: false, type: 'string', }, payloadData: { key: 'payload_data', required: false, type: 'string' }, subscription: { key: 'subscription', required: false, type: 'object', converter: new AdaptySubscriptionDetailsCoder(), }, ios: { isFamilyShareable: { key: 'is_family_shareable', required: true, type: 'boolean', }, }, }; } getInput(data) { var _a, _b; return { adapty_product_id: data.adapty_product_id, access_level_id: data.access_level_id, product_type: data.product_type, paywall_product_index: data.paywall_product_index, paywall_ab_test_name: data.paywall_ab_test_name, payload_data: data.payload_data, paywall_name: data.paywall_name, paywall_variation_id: data.paywall_variation_id, subscription_offer_identifier: (_b = (_a = data.subscription) === null || _a === void 0 ? void 0 : _a.offer) === null || _b === void 0 ? void 0 : _b.offer_identifier, vendor_product_id: data.vendor_product_id, }; } } /** * Format: yyyy-MM-dd'T'HH:mm:ss.SSSZ * OpenAPI: Output.Date */ class DateCoder { decode(input) { var _a, _b, _c, _d, _e, _f; let pureValue = input; if (!input.endsWith('Z')) { // React Native seems to have an inconsistent behaviour // with dates with timezone offset // It is not handled with custom libs like dayjs // So we just remove the timezone offset if possible // Android SDK returns the following format, // that resulted in an invalid date for some customers // `2023-02-24T07:16:28.000000+0000` // solution is: // 1. Replace "+0000" with "Z" // 2. Replace microsecs with 0 millisecs // with the timezone offset removed const dateParts = input.split(/[-T:.Z]/); const date = new Date(Date.UTC(parseInt((_a = dateParts[0]) !== null && _a !== void 0 ? _a : '0', 10), parseInt((_b = dateParts[1]) !== null && _b !== void 0 ? _b : '0', 10) - 1, parseInt((_c = dateParts[2]) !== null && _c !== void 0 ? _c : '0', 10), parseInt((_d = dateParts[3]) !== null && _d !== void 0 ? _d : '0', 10), parseInt((_e = dateParts[4]) !== null && _e !== void 0 ? _e : '0', 10), parseInt((_f = dateParts[5]) !== null && _f !== void 0 ? _f : '0', 10))); pureValue = date.toISOString(); } const parsedValue = Date.parse(pureValue); if (isNaN(parsedValue)) { throw AdaptyError.failedToDecode(`Failed to decode a date string into JS Date. String value: ${pureValue}`); } return new Date(parsedValue); } encode(value) { return value.toISOString(); } } class AdaptyAccessLevelCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { activatedAt: { key: 'activated_at', required: true, type: 'string', converter: new DateCoder(), }, activeIntroductoryOfferType: { key: 'active_introductory_offer_type', required: false, type: 'string', }, activePromotionalOfferId: { key: 'active_promotional_offer_id', required: false, type: 'string', }, activePromotionalOfferType: { key: 'active_promotional_offer_type', required: false, type: 'string', }, billingIssueDetectedAt: { key: 'billing_issue_detected_at', required: false, type: 'string', converter: new DateCoder(), }, cancellationReason: { key: 'cancellation_reason', required: false, type: 'string', }, expiresAt: { key: 'expires_at', required: false, type: 'string', converter: new DateCoder(), }, id: { key: 'id', required: true, type: 'string', }, isActive: { key: 'is_active', required: true, type: 'boolean', }, isInGracePeriod: { key: 'is_in_grace_period', required: true, type: 'boolean', }, isLifetime: { key: 'is_lifetime', required: true, type: 'boolean', }, isRefund: { key: 'is_refund', required: true, type: 'boolean', }, renewedAt: { key: 'renewed_at', required: false, type: 'string', converter: new DateCoder(), }, startsAt: { key: 'starts_at', required: false, type: 'string', converter: new DateCoder(), }, store: { key: 'store', required: true, type: 'string', }, unsubscribedAt: { key: 'unsubscribed_at', required: false, type: 'string', converter: new DateCoder(), }, vendorProductId: { key: 'vendor_product_id', required: true, type: 'string', }, willRenew: { key: 'will_renew', required: true, type: 'boolean', }, android: { offerId: { key: 'offer_id', required: false, type: 'string', }, }, }; } } class AdaptyNonSubscriptionCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { isConsumable: { key: 'is_consumable', required: true, type: 'boolean' }, isRefund: { key: 'is_refund', required: true, type: 'boolean' }, isSandbox: { key: 'is_sandbox', required: true, type: 'boolean' }, purchasedAt: { key: 'purchased_at', required: true, type: 'string', converter: new DateCoder(), }, purchaseId: { key: 'purchase_id', required: true, type: 'string' }, store: { key: 'store', required: true, type: 'string' }, vendorProductId: { key: 'vendor_product_id', required: true, type: 'string', }, vendorTransactionId: { key: 'vendor_transaction_id', required: false, type: 'string', }, }; } } class AdaptySubscriptionCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { isActive: { key: 'is_active', required: true, type: 'boolean', }, isLifetime: { key: 'is_lifetime', required: true, type: 'boolean', }, vendorProductId: { key: 'vendor_product_id', required: true, type: 'string', }, store: { key: 'store', required: true, type: 'string', }, vendorTransactionId: { key: 'vendor_transaction_id', required: true, type: 'string', }, vendorOriginalTransactionId: { key: 'vendor_original_transaction_id', required: true, type: 'string', }, activatedAt: { key: 'activated_at', required: true, type: 'string', converter: new DateCoder(), }, willRenew: { key: 'will_renew', required: true, type: 'boolean', }, isInGracePeriod: { key: 'is_in_grace_period', required: true, type: 'boolean', }, isRefund: { key: 'is_refund', required: true, type: 'boolean', }, isSandbox: { key: 'is_sandbox', required: true, type: 'boolean', }, renewedAt: { key: 'renewed_at', required: false, type: 'string', converter: new DateCoder(), }, expiresAt: { key: 'expires_at', required: false, type: 'string', converter: new DateCoder(), }, startsAt: { key: 'starts_at', required: false, type: 'string', converter: new DateCoder(), }, unsubscribedAt: { key: 'unsubscribed_at', required: false, type: 'string', converter: new DateCoder(), }, billingIssueDetectedAt: { key: 'billing_issue_detected_at', required: false, type: 'string', converter: new DateCoder(), }, activeIntroductoryOfferType: { key: 'active_introductory_offer_type', required: false, type: 'string', }, activePromotionalOfferType: { key: 'active_promotional_offer_type', required: false, type: 'string', }, activePromotionalOfferId: { key: 'active_promotional_offer_id', required: false, type: 'string', }, cancellationReason: { key: 'cancellation_reason', required: false, type: 'string', }, }; } } // Coder for Record<string, T> class HashmapCoder { constructor(coder) { this.coder = coder; } decode(input) { const result = {}; Object.keys(input).forEach(key => { var _a, _b; const property = input[key]; result[key] = (_b = (_a = this.coder) === null || _a === void 0 ? void 0 : _a.decode(property)) !== null && _b !== void 0 ? _b : property; }); return result; } encode(value) { const result = {}; Object.keys(value).forEach(key => { var _a, _b; const property = value[key]; result[key] = (_b = (_a = this.coder) === null || _a === void 0 ? void 0 : _a.encode(property)) !== null && _b !== void 0 ? _b : property; }); return result; } } class AdaptyProfileCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { accessLevels: { key: 'paid_access_levels', required: false, type: 'object', converter: new HashmapCoder(new AdaptyAccessLevelCoder()), }, customAttributes: { key: 'custom_attributes', required: false, type: 'object', }, customerUserId: { key: 'customer_user_id', required: false, type: 'string', }, nonSubscriptions: { key: 'non_subscriptions', required: false, type: 'object', converter: new HashmapCoder(new ArrayCoder(AdaptyNonSubscriptionCoder)), }, profileId: { key: 'profile_id', required: true, type: 'string', }, subscriptions: { key: 'subscriptions', required: false, type: 'object', converter: new HashmapCoder(new AdaptySubscriptionCoder()), }, }; } } class BridgeErrorCoder extends SimpleCoder { constructor() { super(...arguments); this.type = 'error'; this.properties = { errorType: { key: 'error_type', required: true, type: 'string', }, name: { key: 'name', required: false, type: 'string', }, type: { key: 'type', required: false, type: 'string', }, underlyingError: { key: 'parent_error', required: false, type: 'string', }, description: { key: 'description', required: false, type: 'string', }, }; } getError(data) { var _a, _b, _c, _d; switch (data.errorType) { case 'missingRequiredArgument': return new AdaptyError({ adaptyCode: 3001, message: `Required parameter "${data.name} was not passed to a native module"`, }); case 'typeMismatch': return new AdaptyError({ adaptyCode: 3001, message: `Passed parameter "${data.name}" has invalid type. Expected type: ${data.type}"`, }); case 'encodingFailed': return new AdaptyError({ adaptyCode: 2009, message: `Bridge layer failed to encode response. Bridge error: ${JSON.stringify((_a = data.underlyingError) !== null && _a !== void 0 ? _a : {})}"`, }); case 'wrongParam': case 'WRONG_PARAMETER': return new AdaptyError({ adaptyCode: 3001, message: (_b = data.name) !== null && _b !== void 0 ? _b : `Wrong parameter. Bridge error: ${JSON.stringify((_c = data.underlyingError) !== null && _c !== void 0 ? _c : {})}"`, }); case 'methodNotImplemented': return new AdaptyError({ adaptyCode: 2003, message: 'Requested bridge handle not found', }); case 'unsupportedIosVersion': return new AdaptyError({ adaptyCode: 2003, message: 'Unsupported iOS version', }); case 'unexpectedError': default: return new AdaptyError({ adaptyCode: 0, message: `Unexpected error occurred: ${JSON.stringify((_d = data.underlyingError) !== null && _d !== void 0 ? _d : {})}`, }); } } } function getPlatform() { return core.Capacitor.getPlatform(); } class AdaptyPurchaseResultCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { type: { key: 'type', required: true, type: 'string', }, }; } decode(data) { const baseResult = super.decode(data); if (baseResult.type === 'success') { if (!data.profile) { throw new Error('Profile is required for success type of purchase result'); } const platform = getPlatform(); const anyData = data; return Object.assign(Object.assign(Object.assign(Object.assign({}, baseResult), { profile: new AdaptyProfileCoder().decode(data.profile) }), (platform === 'ios' && anyData.jws_transaction ? { ios: { jwsTransaction: anyData.jws_transaction } } : {})), (platform === 'android' && anyData.google_purchase_token ? { android: { purchaseToken: anyData.google_purchase_token } } : {})); } return baseResult; } encode(data) { var _a, _b; const { type } = data; if (type === 'success') { if (!('profile' in data)) { throw new Error('Profile is required for success type of purchase result'); } const platform = getPlatform(); const result = { type: 'success', profile: new AdaptyProfileCoder().encode(data.profile), }; if (platform === 'ios' && ((_a = data.ios) === null || _a === void 0 ? void 0 : _a.jwsTransaction)) { result.jws_transaction = data.ios.jwsTransaction; } if (platform === 'android' && ((_b = data.android) === null || _b === void 0 ? void 0 : _b.purchaseToken)) { result.google_purchase_token = data.android.purchaseToken; } return result; } return super.encode({ type }); } } class AdaptyOnboardingBuilderCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { url: { key: 'config_url', required: true, type: 'string', }, }; } } var __rest = (undefined && undefined.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; class AdaptyOnboardingCoder extends Coder { constructor() { super(...arguments); this.properties = { placement: { key: 'placement', required: true, type: 'object', converter: new AdaptyPlacementCoder(), }, id: { key: 'onboarding_id', required: true, type: 'string' }, name: { key: 'onboarding_name', required: true, type: 'string' }, remoteConfig: { key: 'remote_config', required: false, type: 'object', converter: new AdaptyRemoteConfigCoder(), }, variationId: { key: 'variation_id', required: true, type: 'string' }, version: { key: 'response_created_at', required: false, type: 'number' }, onboardingBuilder: { key: 'onboarding_builder', required: false, type: 'object', converter: new AdaptyOnboardingBuilderCoder(), }, payloadData: { key: 'payload_data', required: false, type: 'string' }, requestLocale: { key: 'request_locale', required: true, type: 'string' }, }; } decode(data) { const codablePart = super.decode(data); return Object.assign(Object.assign({}, codablePart), { hasViewConfiguration: codablePart.onboardingBuilder !== undefined }); } encode(data) { const { hasViewConfiguration } = data, codablePart = __rest(data, ["hasViewConfiguration"]); return super.encode(codablePart); } } class AdaptyUiOnboardingMetaCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { onboardingId: { key: 'onboarding_id', required: true, type: 'string', }, screenClientId: { key: 'screen_cid', required: true, type: 'string', }, screenIndex: { key: 'screen_index', required: true, type: 'number', }, totalScreens: { key: 'total_screens', required: true, type: 'number', }, }; } } class AdaptyUiOnboardingStateParamsCoder extends SimpleCoder { constructor() { super(...arguments); this.properties = { id: { key: 'id', required: true, type: 'string', }, value: { key: 'value', required: true, type: 'string', }, label: { key: 'label', required: true, type: 'string', }, }; } } class AdaptyUiOnboardingStateUpdatedActionCoder extends SimpleCoder { constructor() { super(...arguments); this.paramCoder = new AdaptyUiOnboardingStateParamsCoder(); this.properties = { elementId: { key: 'element_id', required: true, type: 'string', }, elementType: { key: 'element_type', required: true, type: 'string', }, }; } decode(data) { const base = super.decode(data); const { elementType } = base; switch (elementType) { case 'select': return Object.assign(Object.assign({}, base), { elementType: 'select', value: this.paramCoder.decode(data.value) }); case 'multi_select': return Object.assign(Object.assign({}, base), { elementType: 'multi_select', value: Array.isArray(data.value) ? data.value.map(v => this.paramCoder.decode(v)) : [] }); case 'input': return Object.assign(Object