+```
+
+Logs are written to `purchasely/example/e2e/ci-logs/` (uploaded as CI artifacts).
diff --git a/purchasely/example/e2e/helpers/driver.js b/purchasely/example/e2e/helpers/driver.js
new file mode 100644
index 0000000..f6125b7
--- /dev/null
+++ b/purchasely/example/e2e/helpers/driver.js
@@ -0,0 +1,70 @@
+// Helpers for driving the Purchasely Cordova example app under Appium/WebdriverIO.
+//
+// Two contexts are used:
+// * WEBVIEW — run JS against `window.Purchasely` (the cordova.exec bridge) and read
+// results directly; used for the deterministic "bridge" assertions.
+// * NATIVE_APP — inject OS-level touches (tap purchase button, press back) for the
+// interceptor / dismiss suites.
+
+async function switchToWebview() {
+ await browser.waitUntil(async () => {
+ const contexts = await browser.getContexts();
+ return contexts.some((c) => (typeof c === 'string' ? c : c.id).includes('WEBVIEW'));
+ }, { timeout: 60000, timeoutMsg: 'WEBVIEW context never appeared' });
+
+ const contexts = await browser.getContexts();
+ const webview = contexts
+ .map((c) => (typeof c === 'string' ? c : c.id))
+ .find((id) => id.includes('WEBVIEW'));
+ await browser.switchContext(webview);
+}
+
+async function switchToNative() {
+ await browser.switchContext('NATIVE_APP');
+}
+
+// Wait until the Purchasely bridge is available (deviceready fired + plugin clobbered).
+async function waitForPurchaselyReady() {
+ await switchToWebview();
+ await browser.waitUntil(
+ async () => browser.execute(() => typeof window.Purchasely !== 'undefined'),
+ { timeout: 60000, timeoutMsg: 'window.Purchasely never became available' }
+ );
+}
+
+// Invoke a Purchasely method that takes trailing (success, error) callbacks and resolve
+// with { ok, value } on success or { ok:false, error } on error. `args` are the leading
+// positional arguments before the callbacks.
+async function callBridge(method, args = [], timeoutMs = 30000) {
+ return browser.executeAsync(
+ function (method, args, timeoutMs, done) {
+ var settled = false;
+ var finish = function (payload) {
+ if (settled) return;
+ settled = true;
+ done(payload);
+ };
+ setTimeout(function () { finish({ ok: false, error: 'timeout' }); }, timeoutMs);
+ try {
+ var fn = window.Purchasely[method];
+ if (typeof fn !== 'function') {
+ return finish({ ok: false, error: 'no such method: ' + method });
+ }
+ fn.apply(
+ window.Purchasely,
+ args.concat([
+ function (value) { finish({ ok: true, value: value }); },
+ function (error) { finish({ ok: false, error: String(error) }); },
+ ])
+ );
+ } catch (e) {
+ finish({ ok: false, error: String(e) });
+ }
+ },
+ method,
+ args,
+ timeoutMs
+ );
+}
+
+module.exports = { switchToWebview, switchToNative, waitForPurchaselyReady, callBridge };
diff --git a/purchasely/example/e2e/package.json b/purchasely/example/e2e/package.json
new file mode 100644
index 0000000..45383aa
--- /dev/null
+++ b/purchasely/example/e2e/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "purchasely-cordova-e2e",
+ "version": "1.0.0",
+ "private": true,
+ "description": "End-to-end tests for the Purchasely Cordova example app (Appium + WebdriverIO). Drives the real native Purchasely 6.0 SDK inside the WebView (bridge assertions) and injects OS-level touches (interceptor / dismiss).",
+ "scripts": {
+ "test:android": "wdio run ./wdio.android.conf.js",
+ "test:ios": "wdio run ./wdio.ios.conf.js"
+ },
+ "devDependencies": {
+ "@wdio/cli": "^9.0.0",
+ "@wdio/local-runner": "^9.0.0",
+ "@wdio/mocha-framework": "^9.0.0",
+ "@wdio/spec-reporter": "^9.0.0",
+ "appium": "^2.11.0",
+ "appium-uiautomator2-driver": "^3.9.0",
+ "appium-xcuitest-driver": "^7.28.0"
+ }
+}
diff --git a/purchasely/example/e2e/specs/bridge.e2e.js b/purchasely/example/e2e/specs/bridge.e2e.js
new file mode 100644
index 0000000..8ecc7f4
--- /dev/null
+++ b/purchasely/example/e2e/specs/bridge.e2e.js
@@ -0,0 +1,51 @@
+// Deterministic Dart<->native bridge assertions (no native taps). HARD gate — these
+// must pass. Mirrors the Flutter E2E_TEST_INDEX suite T1/T3/T5/T6 adapted to the
+// Cordova imperative API.
+const { waitForPurchaselyReady, callBridge } = require('../helpers/driver');
+
+const PLACEMENT = process.env.PURCHASELY_E2E_PLACEMENT || 'ONBOARDING';
+
+describe('Purchasely bridge (WEBVIEW context)', () => {
+ before(async () => {
+ await waitForPurchaselyReady();
+ });
+
+ // T1 — anonymous user id
+ it('getAnonymousUserId returns a non-empty id', async () => {
+ const res = await callBridge('getAnonymousUserId');
+ expect(res.ok).toBe(true);
+ expect(typeof res.value).toBe('string');
+ expect(res.value.length).toBeGreaterThan(0);
+ });
+
+ // T5 — catalog
+ it('allProducts returns a list', async () => {
+ const res = await callBridge('allProducts');
+ expect(res.ok).toBe(true);
+ expect(Array.isArray(res.value)).toBe(true);
+ });
+
+ // T3 — preload a presentation for a placement
+ it('fetchPresentationForPlacement returns a presentation object', async () => {
+ const res = await callBridge('fetchPresentationForPlacement', [PLACEMENT, null]);
+ expect(res.ok).toBe(true);
+ expect(res.value).toBeDefined();
+ // v6 presentation carries an id/type so it can later be displayed.
+ expect(res.value === null || typeof res.value === 'object').toBe(true);
+ });
+
+ // T6 — synchronize now reports completion (v6 change). On a bare emulator/simulator
+ // with no billing, exactly one of success/error must fire (no fire-and-forget).
+ it('synchronize resolves exactly one callback', async () => {
+ const res = await callBridge('synchronize');
+ expect(typeof res.ok).toBe('boolean');
+ });
+
+ // user-attribute round-trip (set then read back)
+ it('setUserAttributeWithString then userAttribute round-trips', async () => {
+ await callBridge('setUserAttributeWithString', ['e2e_key', 'e2e_value', 'ESSENTIAL']);
+ const res = await callBridge('userAttribute', ['e2e_key']);
+ expect(res.ok).toBe(true);
+ expect(res.value).toBe('e2e_value');
+ });
+});
diff --git a/purchasely/example/e2e/specs/dismiss.e2e.js b/purchasely/example/e2e/specs/dismiss.e2e.js
new file mode 100644
index 0000000..e8dcfe0
--- /dev/null
+++ b/purchasely/example/e2e/specs/dismiss.e2e.js
@@ -0,0 +1,37 @@
+// Presentation display + dismiss outcome. BEST-EFFORT (non-blocking in CI): depends on
+// a paywall actually rendering for the configured placement against the real backend.
+// Mirrors E2E_TEST_INDEX T8/T12 adapted to the Cordova imperative API.
+const { waitForPurchaselyReady, callBridge, switchToNative } = require('../helpers/driver');
+
+const PLACEMENT = process.env.PURCHASELY_E2E_PLACEMENT || 'ONBOARDING';
+
+describe('Presentation dismiss outcome', () => {
+ before(async () => {
+ await waitForPurchaselyReady();
+ });
+
+ // T8/T12 — the present* success callback IS the per-presentation dismiss outcome.
+ // Present a placement, close it programmatically, and assert the outcome fires with a
+ // closeReason.
+ it('presentPresentationForPlacement + closePresentation delivers a dismiss outcome', async () => {
+ // Kick off the presentation; do NOT await (the callback resolves at dismiss).
+ const outcomePromise = callBridge(
+ 'presentPresentationForPlacement',
+ [PLACEMENT, null, 'fullScreen'],
+ 90000
+ );
+
+ // Give the paywall time to render, then close it programmatically from the bridge.
+ await browser.pause(6000);
+ await callBridge('closePresentation');
+
+ const outcome = await outcomePromise;
+ expect(outcome.ok).toBe(true);
+ expect(outcome.value).toBeDefined();
+ // v6 outcome carries a closeReason; programmatic close => 'programmatic' (Android).
+ if (outcome.value && outcome.value.closeReason) {
+ expect(typeof outcome.value.closeReason).toBe('string');
+ }
+ await switchToNative().catch(() => {});
+ });
+});
diff --git a/purchasely/example/e2e/tools/ci_run_e2e.sh b/purchasely/example/e2e/tools/ci_run_e2e.sh
new file mode 100755
index 0000000..5e503d8
--- /dev/null
+++ b/purchasely/example/e2e/tools/ci_run_e2e.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+# Android E2E runner. Assumes:
+# * an emulator is already booted (serial passed as $1, e.g. emulator-5554)
+# * the debug apk has been built (cordova build android)
+# * node deps for purchasely/example/e2e are installed
+#
+# Gating mirrors the Flutter suite: the deterministic `bridge` suite HARD-gates the job;
+# `dismiss` (needs a paywall to render against the real backend) is BEST-EFFORT and only
+# emits ::warning:: on failure.
+set -uo pipefail
+
+SERIAL="${1:-emulator-5554}"
+HERE="$(cd "$(dirname "$0")/.." && pwd)"
+LOGDIR="$HERE/ci-logs"
+mkdir -p "$LOGDIR"
+export ANDROID_SERIAL="$SERIAL"
+
+echo "== Starting Appium =="
+npx appium --log "$LOGDIR/appium-android.log" --log-level info &
+APPIUM_PID=$!
+trap 'kill $APPIUM_PID 2>/dev/null || true' EXIT
+# Wait for Appium to accept connections.
+for i in $(seq 1 30); do
+ curl -sf http://127.0.0.1:4723/status >/dev/null 2>&1 && break
+ sleep 1
+done
+
+run_suite() { # $1 = spec glob, $2 = hard|soft
+ local spec="$1" gate="$2" tries=3 n=1
+ while [ $n -le $tries ]; do
+ echo "== [$gate] $spec (attempt $n/$tries) =="
+ if PURCHASELY_E2E_SPEC="$spec" npx wdio run ./wdio.android.conf.js --spec "$spec" 2>&1 | tee "$LOGDIR/wdio-$(basename "$spec").log"; then
+ return 0
+ fi
+ n=$((n+1))
+ done
+ if [ "$gate" = "hard" ]; then
+ echo "::error::E2E suite failed (hard gate): $spec"
+ return 1
+ fi
+ echo "::warning::E2E suite failed (best-effort): $spec"
+ return 0
+}
+
+cd "$HERE"
+rc=0
+run_suite "./specs/bridge.e2e.js" hard || rc=1
+run_suite "./specs/dismiss.e2e.js" soft || true
+exit $rc
diff --git a/purchasely/example/e2e/tools/ci_run_e2e_ios.sh b/purchasely/example/e2e/tools/ci_run_e2e_ios.sh
new file mode 100755
index 0000000..0351c95
--- /dev/null
+++ b/purchasely/example/e2e/tools/ci_run_e2e_ios.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+# iOS E2E runner. Assumes:
+# * a simulator is already booted (udid passed as $1)
+# * the simulator .app has been built (cordova build ios --emulator)
+# * node deps for purchasely/example/e2e are installed
+#
+# Same gating as Android: `bridge` HARD-gates; `dismiss` is BEST-EFFORT.
+set -uo pipefail
+
+UDID="${1:-booted}"
+HERE="$(cd "$(dirname "$0")/.." && pwd)"
+LOGDIR="$HERE/ci-logs"
+mkdir -p "$LOGDIR"
+export PURCHASELY_E2E_UDID="$UDID"
+
+echo "== Starting Appium =="
+npx appium --log "$LOGDIR/appium-ios.log" --log-level info &
+APPIUM_PID=$!
+trap 'kill $APPIUM_PID 2>/dev/null || true' EXIT
+for i in $(seq 1 30); do
+ curl -sf http://127.0.0.1:4723/status >/dev/null 2>&1 && break
+ sleep 1
+done
+
+run_suite() { # $1 = spec, $2 = hard|soft
+ local spec="$1" gate="$2" tries=3 n=1
+ while [ $n -le $tries ]; do
+ echo "== [$gate] $spec (attempt $n/$tries) =="
+ if npx wdio run ./wdio.ios.conf.js --spec "$spec" 2>&1 | tee "$LOGDIR/wdio-$(basename "$spec").log"; then
+ return 0
+ fi
+ n=$((n+1))
+ done
+ if [ "$gate" = "hard" ]; then
+ echo "::error::E2E suite failed (hard gate): $spec"
+ return 1
+ fi
+ echo "::warning::E2E suite failed (best-effort): $spec"
+ return 0
+}
+
+cd "$HERE"
+rc=0
+run_suite "./specs/bridge.e2e.js" hard || rc=1
+run_suite "./specs/dismiss.e2e.js" soft || true
+exit $rc
diff --git a/purchasely/example/e2e/wdio.android.conf.js b/purchasely/example/e2e/wdio.android.conf.js
new file mode 100644
index 0000000..81de342
--- /dev/null
+++ b/purchasely/example/e2e/wdio.android.conf.js
@@ -0,0 +1,21 @@
+const path = require('path');
+const { config } = require('./wdio.shared.conf');
+
+// Path to the debug apk built by `cordova build android`.
+const APK = process.env.PURCHASELY_E2E_APK ||
+ path.resolve(__dirname, '../platforms/android/app/build/outputs/apk/debug/app-debug.apk');
+
+exports.config = Object.assign({}, config, {
+ capabilities: [{
+ platformName: 'Android',
+ 'appium:automationName': 'UiAutomator2',
+ 'appium:app': APK,
+ 'appium:appPackage': 'com.purchasely.demo',
+ 'appium:newCommandTimeout': 240,
+ 'appium:autoGrantPermissions': true,
+ // The Cordova WebView is debuggable in the debug build, so Appium can attach
+ // chromedriver and expose the WEBVIEW context.
+ 'appium:ensureWebviewsHavePages': true,
+ 'appium:nativeWebScreenshot': true,
+ }],
+});
diff --git a/purchasely/example/e2e/wdio.ios.conf.js b/purchasely/example/e2e/wdio.ios.conf.js
new file mode 100644
index 0000000..2da8195
--- /dev/null
+++ b/purchasely/example/e2e/wdio.ios.conf.js
@@ -0,0 +1,19 @@
+const path = require('path');
+const { config } = require('./wdio.shared.conf');
+
+// Path to the .app built by `cordova build ios --emulator` (simulator build).
+const APP = process.env.PURCHASELY_E2E_APP ||
+ path.resolve(__dirname, '../platforms/ios/build/emulator/HelloCordova.app');
+
+exports.config = Object.assign({}, config, {
+ capabilities: [{
+ platformName: 'iOS',
+ 'appium:automationName': 'XCUITest',
+ 'appium:app': APP,
+ 'appium:bundleId': 'com.purchasely.demo',
+ 'appium:deviceName': process.env.PURCHASELY_E2E_SIM || 'iPhone 16',
+ 'appium:platformVersion': process.env.PURCHASELY_E2E_IOS_VERSION || undefined,
+ 'appium:newCommandTimeout': 240,
+ 'appium:autoAcceptAlerts': true,
+ }],
+});
diff --git a/purchasely/example/e2e/wdio.shared.conf.js b/purchasely/example/e2e/wdio.shared.conf.js
new file mode 100644
index 0000000..1eec31c
--- /dev/null
+++ b/purchasely/example/e2e/wdio.shared.conf.js
@@ -0,0 +1,28 @@
+// Shared WebdriverIO config for the Purchasely Cordova E2E suite.
+// Platform-specific configs (wdio.android.conf.js / wdio.ios.conf.js) extend this
+// and set `capabilities`.
+//
+// The example app boots the Purchasely SDK on `deviceready` (see www/js/index.js).
+// Tests switch to the WEBVIEW context and call `window.Purchasely.*` directly, and
+// switch to NATIVE_APP to inject OS-level touches for the interceptor / dismiss suites.
+exports.config = {
+ runner: 'local',
+ specs: ['./specs/**/*.e2e.js'],
+ maxInstances: 1,
+ logLevel: 'info',
+ bail: 0,
+ waitforTimeout: 20000,
+ connectionRetryTimeout: 120000,
+ connectionRetryCount: 2,
+ framework: 'mocha',
+ reporters: ['spec'],
+ mochaOpts: {
+ ui: 'bdd',
+ timeout: 120000,
+ },
+ // Appium is started as a service by the CI runner scripts (tools/ci_run_e2e*.sh),
+ // so we point WDIO at the already-running server rather than the @wdio/appium-service.
+ hostname: '127.0.0.1',
+ port: 4723,
+ path: '/',
+};
diff --git a/purchasely/example/package-lock.json b/purchasely/example/package-lock.json
index 1ab40b4..644ebbd 100644
--- a/purchasely/example/package-lock.json
+++ b/purchasely/example/package-lock.json
@@ -11,15 +11,15 @@
"devDependencies": {
"@purchasely/cordova-plugin-purchasely": "file:..",
"@purchasely/cordova-plugin-purchasely-google": "file:../../purchasely-google",
- "cordova-android": "^14.0.1",
- "cordova-ios": "^8.0.0",
+ "cordova-android": "^15.0.0",
+ "cordova-ios": "^8.1.0",
"cordova-plugin-purchasely": "file:..",
"cordova-plugin-purchasely-google": "file:../../purchasely-google"
}
},
"..": {
"name": "@purchasely/cordova-plugin-purchasely",
- "version": "5.7.3",
+ "version": "6.0.0-rc.1",
"dev": true,
"license": "ISC",
"devDependencies": {
@@ -36,7 +36,7 @@
},
"../../purchasely-google": {
"name": "@purchasely/cordova-plugin-purchasely-google",
- "version": "5.7.3",
+ "version": "6.0.0-rc.1",
"dev": true,
"license": "ISC"
},
@@ -101,19 +101,19 @@
}
},
"node_modules/abbrev": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
- "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz",
+ "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==",
"dev": true,
"license": "ISC",
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/android-versions": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-2.1.0.tgz",
- "integrity": "sha512-oCBvVs2uaL8ohQtesGs78/X7QvFDLbKgTosBRiOIBCss1a/yiakQm/ADuoG2k/AUaI0FfrsFeMl/a+GtEtjEeA==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-2.1.2.tgz",
+ "integrity": "sha512-JmyCaE2AWe/1ENDv70Bx1hBiVvkUV/JJYnAH6vFGENXDb2DdmCDMO9icoCvGR9TAsRJ/AuszEcIpyHM6qim3SA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -193,57 +193,52 @@
}
},
"node_modules/cordova-android": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-14.0.1.tgz",
- "integrity": "sha512-HMBMdGu/JlSQtmBuDEpKWf/pE75SpF3FksxZ+mqYuL3qSIN8lN/QsNurwYaPAP7zWXN2DNpvwlpOJItS5VhdLg==",
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-15.0.0.tgz",
+ "integrity": "sha512-EpFSKUtBLJ7bTpuVD7NeC6toAooi5PI6VIR2jd8Ut5PJu7HSR5tPRwS87Q1DS03RSyDTlroB64JPUWC0pmAhnw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "android-versions": "^2.1.0",
- "cordova-common": "^5.0.1",
- "dedent": "^1.5.3",
+ "android-versions": "^2.1.1",
+ "cordova-common": "^6.0.0",
+ "dedent": "^1.7.1",
"execa": "^5.1.1",
"fast-glob": "^3.3.3",
"is-path-inside": "^3.0.3",
- "nopt": "^8.1.0",
+ "nopt": "^9.0.0",
"properties-parser": "^0.6.0",
- "semver": "^7.7.1",
- "string-argv": "^0.3.1",
+ "semver": "^7.7.4",
+ "string-argv": "^0.3.2",
"untildify": "^4.0.0",
- "which": "^5.0.0"
+ "which": "^6.0.1"
},
"engines": {
- "node": ">=20.5.0"
+ "node": ">=20.17.0 || >=22.9.0"
}
},
"node_modules/cordova-common": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-5.0.1.tgz",
- "integrity": "sha512-OA2NQ6wvhNz4GytPYwTdlA9xfG7Yf7ufkj4u97m3rUfoL/AECwwj0GVT2CYpk/0Fk6HyuHA3QYCxfDPYsKzI1A==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-6.0.0.tgz",
+ "integrity": "sha512-16WPC1DuxVdshV3RoQUXqhcJVdhxWGwiFysA4TkYuboqoev6mgt0JuIJFxmQbzR/DuyuONaVe0L0O0Hf1C08Mg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@netflix/nerror": "^1.1.3",
"ansi": "^0.3.1",
"bplist-parser": "^0.3.2",
- "cross-spawn": "^7.0.6",
"elementtree": "^0.1.7",
"endent": "^2.1.0",
"fast-glob": "^3.3.3",
- "lodash.zip": "^4.2.0",
- "plist": "^3.1.0",
- "q": "^1.5.1",
- "read-chunk": "^3.2.0",
- "strip-bom": "^4.0.0"
+ "plist": "^3.1.0"
},
"engines": {
- "node": ">=16.0.0"
+ "node": ">=20.9.0"
}
},
"node_modules/cordova-ios": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-8.0.0.tgz",
- "integrity": "sha512-QsynOV8rnRIhDC3qwM1KdRr1gy5RaqzVCzdOaB+DSBPeR5wVEUGpyyJO0FzlCACzY5X25iDc5O3kbn/F06dJ5Q==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-8.1.0.tgz",
+ "integrity": "sha512-IgVtJIQJBJi+QqqrGjx/moY+M9DqO+RQLeIpHGsZD1Xy+mGflDrp7lunmFYqVchV31b8O/aqE4y4AsDUZip04w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -262,67 +257,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/cordova-ios/node_modules/abbrev": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz",
- "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/cordova-ios/node_modules/cordova-common": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-6.0.0.tgz",
- "integrity": "sha512-16WPC1DuxVdshV3RoQUXqhcJVdhxWGwiFysA4TkYuboqoev6mgt0JuIJFxmQbzR/DuyuONaVe0L0O0Hf1C08Mg==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@netflix/nerror": "^1.1.3",
- "ansi": "^0.3.1",
- "bplist-parser": "^0.3.2",
- "elementtree": "^0.1.7",
- "endent": "^2.1.0",
- "fast-glob": "^3.3.3",
- "plist": "^3.1.0"
- },
- "engines": {
- "node": ">=20.9.0"
- }
- },
- "node_modules/cordova-ios/node_modules/nopt": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
- "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "abbrev": "^4.0.0"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/cordova-ios/node_modules/which": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz",
- "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^3.1.1"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
"node_modules/cordova-plugin-purchasely": {
"resolved": "..",
"link": true
@@ -364,9 +298,9 @@
}
},
"node_modules/dedent": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz",
- "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
+ "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -552,11 +486,13 @@
}
},
"node_modules/isexe": {
- "version": "3.1.1",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
+ "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=16"
+ "node": ">=20"
}
},
"node_modules/lodash": {
@@ -566,13 +502,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/lodash.zip": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
- "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/merge-stream": {
"version": "2.0.0",
"dev": true,
@@ -607,19 +536,19 @@
}
},
"node_modules/nopt": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
- "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
+ "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "abbrev": "^3.0.0"
+ "abbrev": "^4.0.0"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/npm-run-path": {
@@ -652,26 +581,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"dev": true,
@@ -693,16 +602,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/plist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz",
@@ -728,18 +627,6 @@
"node": ">= 0.3.1"
}
},
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
- "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
"node_modules/queue-microtask": {
"version": "1.2.3",
"dev": true,
@@ -759,20 +646,6 @@
],
"license": "MIT"
},
- "node_modules/read-chunk": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz",
- "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pify": "^4.0.1",
- "with-open-file": "^0.1.6"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/reusify": {
"version": "1.1.0",
"dev": true,
@@ -810,7 +683,9 @@
"license": "ISC"
},
"node_modules/semver": {
- "version": "7.7.3",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -899,16 +774,6 @@
"node": ">=0.6.19"
}
},
- "node_modules/strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-final-newline": {
"version": "2.0.0",
"dev": true,
@@ -942,6 +807,7 @@
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
"integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"dev": true,
"license": "MIT",
"bin": {
@@ -949,34 +815,19 @@
}
},
"node_modules/which": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
- "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
+ "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
"dev": true,
"license": "ISC",
"dependencies": {
- "isexe": "^3.1.1"
+ "isexe": "^4.0.0"
},
"bin": {
"node-which": "bin/which.js"
},
"engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
- "node_modules/with-open-file": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz",
- "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-finally": "^1.0.0",
- "p-try": "^2.1.0",
- "pify": "^4.0.1"
- },
- "engines": {
- "node": ">=6"
+ "node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/xcode": {
diff --git a/purchasely/example/package.json b/purchasely/example/package.json
index ef22df8..452ae70 100644
--- a/purchasely/example/package.json
+++ b/purchasely/example/package.json
@@ -15,8 +15,8 @@
"devDependencies": {
"@purchasely/cordova-plugin-purchasely": "file:..",
"@purchasely/cordova-plugin-purchasely-google": "file:../../purchasely-google",
- "cordova-android": "^14.0.1",
- "cordova-ios": "^8.0.0",
+ "cordova-android": "^15.0.0",
+ "cordova-ios": "^8.1.0",
"cordova-plugin-purchasely": "file:..",
"cordova-plugin-purchasely-google": "file:../../purchasely-google"
},
@@ -29,8 +29,8 @@
"@purchasely/cordova-plugin-purchasely-google": {}
},
"platforms": [
- "android",
- "ios"
+ "ios",
+ "android"
]
}
-}
+}
\ No newline at end of file
diff --git a/purchasely/example/www/index.html b/purchasely/example/www/index.html
index ca01900..b905b12 100644
--- a/purchasely/example/www/index.html
+++ b/purchasely/example/www/index.html
@@ -54,17 +54,11 @@ Apache Cordova
-
-
-
-
+
-
-
-
diff --git a/purchasely/example/www/js/index.js b/purchasely/example/www/js/index.js
index 8d228cc..31a9046 100644
--- a/purchasely/example/www/js/index.js
+++ b/purchasely/example/www/js/index.js
@@ -41,12 +41,13 @@ function onDeviceReady() {
document.getElementById('deviceready').classList.add('ready');
Purchasely.start(
- 'fcb39be4-2ba4-4db7-bde3-2a5a1e20745d',
- ['Google'],
- false,
- null,
- Purchasely.LogLevel.DEBUG,
- Purchasely.RunningMode.full,
+ {
+ apiKey: 'fcb39be4-2ba4-4db7-bde3-2a5a1e20745d',
+ stores: [Purchasely.Store.google],
+ storeKit1: false,
+ logLevel: Purchasely.LogLevel.DEBUG,
+ runningMode: Purchasely.RunningMode.full
+ },
(isConfigured) => {
if(isConfigured) onPurchaselySdkReady();
},
@@ -60,14 +61,13 @@ function onDeviceReady() {
document.getElementById("openPresentation").addEventListener("click", openPresentation);
document.getElementById("fetchPresentation").addEventListener("click", fetchPresentation);
- document.getElementById("presentSubscriptions").addEventListener("click", presentSubscriptions);
- document.getElementById("showPresentation").addEventListener("click", showPresentation);
- document.getElementById("hidePresentation").addEventListener("click", hidePresentation);
+ document.getElementById("backPresentation").addEventListener("click", backPresentation);
document.getElementById("closePresentation").addEventListener("click", closePresentation);
document.getElementById("purchaseWithPlanVendorId").addEventListener("click", purchaseWithPlanVendorId);
document.getElementById("restore").addEventListener("click", restore);
document.getElementById("silentRestore").addEventListener("click", silentRestore);
document.getElementById("processToPayment").addEventListener("click", processToPayment);
+ document.getElementById("openDeeplink").addEventListener("click", openDeeplink);
}
@@ -139,7 +139,7 @@ function onPurchaselySdkReady() {
Purchasely.setAttribute(Purchasely.Attribute.BATCH_CUSTOM_USER_ID, "batch_custom_user_id");
Purchasely.setAttribute(Purchasely.Attribute.BATCH_INSTALLATION_ID, "testBatch1");
- Purchasely.readyToOpenDeeplink(true);
+ Purchasely.allowDeeplink(true);
Purchasely.planWithIdentifier('PURCHASELY_PLUS_MONTHLY', (plan) => {
console.log(' ==> Plan');
@@ -157,11 +157,11 @@ function onPurchaselySdkReady() {
console.log(error);
});
- Purchasely.setDefaultPresentationResultHandler(callback => {
+ Purchasely.setDefaultPresentationDismissHandler(callback => {
console.log(callback);
if(callback.result == Purchasely.PurchaseResult.CANCELLED) {
- console.log("User cancelled purchased");
- } else {
+ console.log("User cancelled purchase - close reason " + callback.closeReason);
+ } else if (callback.plan) {
console.log("User purchased " + callback.plan.vendorId);
}
},
@@ -238,53 +238,58 @@ function onPurchaselySdkReady() {
Purchasely.removeUserAttributeListener();
- Purchasely.setPaywallActionInterceptor((result) => {
- console.log(result);
- console.log('Received action from paywall ' + result.info.presentationId);
-
- if (result.action === Purchasely.PaywallAction.navigate) {
- console.log(
- 'User wants to navigate to website ' +
- result.parameters.title +
- ' ' +
- result.parameters.url
- );
- console.log('prevent Purchasely SDK to navigate to website');
- Purchasely.onProcessAction(true);
- } else if (result.action === Purchasely.PaywallAction.close) {
- console.log('User wants to close paywall - close reason ' + result.parameters.closeReason);
- Purchasely.onProcessAction(true);
- } else if (result.action === Purchasely.PaywallAction.close_all) {
- console.log('User wants to close all paywalls');
- Purchasely.onProcessAction(true);
- } else if (result.action === Purchasely.PaywallAction.login) {
- console.log('User wants to login');
- //Present your own screen for user to log in
- Purchasely.closePaywall();
- Purchasely.userLogin('MY_USER_ID');
- //Call this method to update Purchasely Paywall
- Purchasely.onProcessAction(true);
- } else if (result.action === Purchasely.PaywallAction.open_presentation) {
- console.log('User wants to open a new paywall');
- Purchasely.onProcessAction(true);
- } else if (result.action === Purchasely.PaywallAction.open_placement) {
- console.log('User wants to open a new placement');
- Purchasely.onProcessAction(true);
- } else if (result.action === Purchasely.PaywallAction.purchase) {
- console.log('User wants to purchase');
- //If you want to intercept it, close paywall and display your screen
- Purchasely.hidePresentation();
- } else if (result.action === Purchasely.PaywallAction.web_checkout) {
- console.log('User wants to proceed to web checkout');
- console.log('web checkout url: ' + result.parameters.url);
- console.log('web checkout provider: ' + result.parameters.webCheckoutProvider);
- console.log('web checkout client reference id: ' + result.parameters.clientReferenceId);
- console.log('web checkout query parameter key: ' + result.parameters.queryParameterKey);
- Purchasely.onProcessAction(true);
- } else {
- console.log('Action unknown ' + result.action);
- Purchasely.onProcessAction(true);
- }
+ // Purchasely 6.0: per-action interceptor. Register a handler per action kind; each
+ // handler receives (info, parameters) and returns a Purchasely.InterceptResult telling
+ // the SDK how it was handled (notHandled = let the SDK proceed, success = app handled it).
+ Purchasely.removeAllActionInterceptors();
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.navigate, (info, parameters) => {
+ console.log('User wants to navigate to website ' + parameters.title + ' ' + parameters.url);
+ console.log('let the Purchasely SDK navigate to website');
+ return Purchasely.InterceptResult.notHandled;
+ });
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.close, (info, parameters) => {
+ console.log('User wants to close paywall - close reason ' + parameters.closeReason);
+ return Purchasely.InterceptResult.notHandled;
+ });
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.close_all, () => {
+ console.log('User wants to close all paywalls');
+ return Purchasely.InterceptResult.notHandled;
+ });
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.login, () => {
+ console.log('User wants to login');
+ // Present your own screen for the user to log in, then report success so the paywall refreshes.
+ Purchasely.closePresentation();
+ Purchasely.userLogin('MY_USER_ID');
+ return Purchasely.InterceptResult.success;
+ });
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.open_presentation, () => {
+ console.log('User wants to open a new paywall');
+ return Purchasely.InterceptResult.notHandled;
+ });
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.open_placement, () => {
+ console.log('User wants to open a new placement');
+ return Purchasely.InterceptResult.notHandled;
+ });
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.purchase, () => {
+ console.log('User wants to purchase');
+ // Let the SDK proceed with the purchase.
+ return Purchasely.InterceptResult.notHandled;
+ });
+
+ Purchasely.interceptAction(Purchasely.PresentationAction.web_checkout, (info, parameters) => {
+ console.log('User wants to proceed to web checkout');
+ console.log('web checkout url: ' + parameters.url);
+ console.log('web checkout provider: ' + parameters.webCheckoutProvider);
+ console.log('web checkout client reference id: ' + parameters.clientReferenceId);
+ console.log('web checkout query parameter key: ' + parameters.queryParameterKey);
+ return Purchasely.InterceptResult.notHandled;
});
Purchasely.clearBuiltInAttributes();
@@ -294,7 +299,7 @@ function openPresentation() {
Purchasely.presentPresentationForPlacement(
'ONBOARDING', //placementId
null, //contentId
- true, //fullscreen
+ Purchasely.TransitionType.fullScreen, //display mode
(callback) => {
console.log(callback);
if(callback.result == Purchasely.PurchaseResult.CANCELLED) {
@@ -315,7 +320,7 @@ function fetchPresentation() {
null, //contentId
(presentation) => {
console.log(safeStringify(presentation));
- Purchasely.presentPresentation(presentation, false, null,
+ Purchasely.presentPresentation(presentation, Purchasely.TransitionType.modal, null,
(callback) => {
console.log(callback);
if(callback.result == Purchasely.PurchaseResult.CANCELLED) {
@@ -333,31 +338,22 @@ function fetchPresentation() {
);
}
-function presentSubscriptions() {
- Purchasely.presentSubscriptions();
-}
-
function purchaseWithPlanVendorId() {
Purchasely.purchaseWithPlanVendorId("PURCHASELY_PLUS_MONTHLY");
}
function processToPayment() {
- // Call this method open paywall again
- Purchasely.showPresentation();
-
- // Call this method in paywallObserver mode to synchronize purchases with Purchasely
- // Purchasely.synchronize();
-
- // Call this method to process to payment or false if you handled it
- Purchasely.onProcessAction(true);
-}
+ // Call this method in observer mode to synchronize purchases with Purchasely
+ // Purchasely.synchronize((ok) => console.log("synchronized " + ok), (e) => console.log(e));
-function showPresentation() {
- Purchasely.showPresentation();
+ // Purchasely 6.0: with the per-action interceptor (interceptAction), each handler returns
+ // its own Purchasely.InterceptResult, so there is no separate "process action" step.
+ // Kept as a no-op for the example's existing button wiring.
+ console.log('processToPayment: no-op in v6 — interceptAction handlers report their own result');
}
-function hidePresentation() {
- Purchasely.hidePresentation();
+function backPresentation() {
+ Purchasely.backPresentation();
}
function closePresentation() {
@@ -416,7 +412,7 @@ function signPromotionalOffer() {
}
function openDeeplink() {
- Purchasely.isDeeplinkHandled(
+ Purchasely.handleDeeplink(
"purchasely://ply/presentations/CAROUSEL",
isHandled => {
console.log("Deeplink is handled ? " + isHandled)
diff --git a/purchasely/package-lock.json b/purchasely/package-lock.json
index a8be305..b8f8cb0 100644
--- a/purchasely/package-lock.json
+++ b/purchasely/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@purchasely/cordova-plugin-purchasely",
- "version": "5.7.3",
+ "version": "6.0.0-rc.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@purchasely/cordova-plugin-purchasely",
- "version": "5.7.3",
+ "version": "6.0.0-rc.1",
"license": "ISC",
"devDependencies": {
"jest": "^29.7.0"
diff --git a/purchasely/package.json b/purchasely/package.json
index 4438ea2..64e7968 100644
--- a/purchasely/package.json
+++ b/purchasely/package.json
@@ -1,6 +1,6 @@
{
"name": "@purchasely/cordova-plugin-purchasely",
- "version": "5.7.3",
+ "version": "6.0.0-rc.1",
"description": "Purchasely is a solution to ease the integration and boost your In-App Purchases & Subscriptions on the App Store, Google Play Store, Amazon Appstore and Huawei App Gallery.",
"cordova": {
"id": "@purchasely/cordova-plugin-purchasely",
diff --git a/purchasely/plugin.xml b/purchasely/plugin.xml
index f773591..b767408 100644
--- a/purchasely/plugin.xml
+++ b/purchasely/plugin.xml
@@ -1,5 +1,5 @@
-
+
Purchasely
@@ -38,7 +38,7 @@
-
+