@adapty/capacitor
Version:
Official Adapty SDK for Capacitor
1,375 lines (1,347 loc) • 203 kB
JavaScript
var capacitorAdaptyCapacitorPlugin = (function (exports, core) {
'use strict';
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 = {
typ