@spare-technologies/spare-link 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,9 +14,15 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
14
14
  * 1. If `mobileAppUrl` is provided (e.g. `altareq://authorize?...`), try
15
15
  * `Linking.openURL` after checking `canOpenURL` — this launches the
16
16
  * bank's app directly without a browser tab.
17
- * 2. Otherwise (or if step 1 fails) open `authorizationUrl` via
18
- * `expo-web-browser`'s in-app browser if installed; fall back to the
19
- * system browser via `Linking.openURL`.
17
+ * 2. Otherwise (or if step 1 fails) hand `authorizationUrl` to the OS with
18
+ * `Linking.openURL`, so the bank's app opens it where one claims the URL.
19
+ * 3. Only if that throws, retry in `expo-web-browser`'s in-app browser tab.
20
+ *
21
+ * Steps 2 and 3 are in that order because the redirection guide requires it:
22
+ * https://nebras-open-finance.com/tech/tpp-standards/security/fapi/opening-the-redirect
23
+ * An in-app browser tab is a permitted fallback — it is a real browser surface,
24
+ * not an embedded webview — but it takes the routing decision away from the OS,
25
+ * so preferring it means app-to-app redirection never gets the chance to happen.
20
26
  */
21
27
  const log = (0, _logger.createLogger)('BankRedirect');
22
28
  async function loadWebBrowser() {
@@ -41,13 +47,18 @@ async function launchBankRedirect(args) {
41
47
  log.warning(`launch: mobile deep link failed (${e instanceof Error ? e.message : String(e)}) — falling back`);
42
48
  }
43
49
  }
44
- const wb = await loadWebBrowser();
45
- if (wb?.openBrowserAsync) {
46
- log.info('launch: opening authorization URL in in-app browser');
47
- await wb.openBrowserAsync(args.authorizationUrl);
50
+ try {
51
+ await _reactNative.Linking.openURL(args.authorizationUrl);
52
+ log.info('launch: authorization URL handed to the OS');
48
53
  return;
54
+ } catch (e) {
55
+ log.warning(`launch: OS could not open the authorization URL (${e instanceof Error ? e.message : String(e)}) — retrying in an in-app browser tab`);
56
+ }
57
+ const wb = await loadWebBrowser();
58
+ if (!wb?.openBrowserAsync) {
59
+ throw new Error('Unable to open bank authorization URL');
49
60
  }
50
- log.info('launch: opening authorization URL in system browser');
51
- await _reactNative.Linking.openURL(args.authorizationUrl);
61
+ log.info('launch: opening authorization URL in in-app browser tab');
62
+ await wb.openBrowserAsync(args.authorizationUrl);
52
63
  }
53
64
  //# sourceMappingURL=bank-redirect.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_logger","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","log","createLogger","loadWebBrowser","Promise","resolve","then","launchBankRedirect","args","mobileAppUrl","info","can","Linking","canOpenURL","openURL","warning","Error","message","String","wb","openBrowserAsync","authorizationUrl"],"sourceRoot":"../../../src","sources":["internal/bank-redirect.ts"],"mappings":";;;;;;AAYA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAAwC,SAAAE,wBAAAC,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAH,uBAAA,YAAAA,CAAAC,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA,KAbxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA,MAAMkB,GAAG,GAAG,IAAAC,oBAAY,EAAC,cAAc,CAAC;AAWxC,eAAeC,cAAcA,CAAA,EAAmC;EAC9D,IAAI;IACF,OAAQ,MAAAC,OAAA,CAAAC,OAAA,GAAAC,IAAA,OAAAzB,uBAAA,CAAAF,OAAA,CAAa,kBAAkB,GAAC;EAC1C,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEO,eAAe4B,kBAAkBA,CAACC,IAAsB,EAAiB;EAC9E,IAAIA,IAAI,CAACC,YAAY,EAAE;IACrBR,GAAG,CAACS,IAAI,CAAC,qCAAqC,CAAC;IAC/C,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMC,oBAAO,CAACC,UAAU,CAACL,IAAI,CAACC,YAAY,CAAC;MACvD,IAAIE,GAAG,EAAE;QACP,MAAMC,oBAAO,CAACE,OAAO,CAACN,IAAI,CAACC,YAAY,CAAC;QACxCR,GAAG,CAACS,IAAI,CAAC,wCAAwC,CAAC;QAClD;MACF;MACAT,GAAG,CAACc,OAAO,CAAC,gEAAgE,CAAC;IAC/E,CAAC,CAAC,OAAOjC,CAAC,EAAE;MACVmB,GAAG,CAACc,OAAO,CACT,oCAAoCjC,CAAC,YAAYkC,KAAK,GAAGlC,CAAC,CAACmC,OAAO,GAAGC,MAAM,CAACpC,CAAC,CAAC,kBAChF,CAAC;IACH;EACF;EAEA,MAAMqC,EAAE,GAAG,MAAMhB,cAAc,CAAC,CAAC;EACjC,IAAIgB,EAAE,EAAEC,gBAAgB,EAAE;IACxBnB,GAAG,CAACS,IAAI,CAAC,qDAAqD,CAAC;IAC/D,MAAMS,EAAE,CAACC,gBAAgB,CAACZ,IAAI,CAACa,gBAAgB,CAAC;IAChD;EACF;EACApB,GAAG,CAACS,IAAI,CAAC,qDAAqD,CAAC;EAC/D,MAAME,oBAAO,CAACE,OAAO,CAACN,IAAI,CAACa,gBAAgB,CAAC;AAC9C","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_logger","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","log","createLogger","loadWebBrowser","Promise","resolve","then","launchBankRedirect","args","mobileAppUrl","info","can","Linking","canOpenURL","openURL","warning","Error","message","String","authorizationUrl","wb","openBrowserAsync"],"sourceRoot":"../../../src","sources":["internal/bank-redirect.ts"],"mappings":"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","ignoreList":[]}
@@ -12,5 +12,5 @@ exports.SDK_VERSION = void 0;
12
12
  * `changeset version`). The src/index.ts smoke test asserts this matches
13
13
  * package.json's version.
14
14
  */
15
- const SDK_VERSION = exports.SDK_VERSION = '1.0.0';
15
+ const SDK_VERSION = exports.SDK_VERSION = '1.0.1';
16
16
  //# sourceMappingURL=version.js.map
@@ -8,9 +8,15 @@
8
8
  * 1. If `mobileAppUrl` is provided (e.g. `altareq://authorize?...`), try
9
9
  * `Linking.openURL` after checking `canOpenURL` — this launches the
10
10
  * bank's app directly without a browser tab.
11
- * 2. Otherwise (or if step 1 fails) open `authorizationUrl` via
12
- * `expo-web-browser`'s in-app browser if installed; fall back to the
13
- * system browser via `Linking.openURL`.
11
+ * 2. Otherwise (or if step 1 fails) hand `authorizationUrl` to the OS with
12
+ * `Linking.openURL`, so the bank's app opens it where one claims the URL.
13
+ * 3. Only if that throws, retry in `expo-web-browser`'s in-app browser tab.
14
+ *
15
+ * Steps 2 and 3 are in that order because the redirection guide requires it:
16
+ * https://nebras-open-finance.com/tech/tpp-standards/security/fapi/opening-the-redirect
17
+ * An in-app browser tab is a permitted fallback — it is a real browser surface,
18
+ * not an embedded webview — but it takes the routing decision away from the OS,
19
+ * so preferring it means app-to-app redirection never gets the chance to happen.
14
20
  */
15
21
  import { Linking } from 'react-native';
16
22
  import { createLogger } from "./logger.js";
@@ -37,13 +43,18 @@ export async function launchBankRedirect(args) {
37
43
  log.warning(`launch: mobile deep link failed (${e instanceof Error ? e.message : String(e)}) — falling back`);
38
44
  }
39
45
  }
40
- const wb = await loadWebBrowser();
41
- if (wb?.openBrowserAsync) {
42
- log.info('launch: opening authorization URL in in-app browser');
43
- await wb.openBrowserAsync(args.authorizationUrl);
46
+ try {
47
+ await Linking.openURL(args.authorizationUrl);
48
+ log.info('launch: authorization URL handed to the OS');
44
49
  return;
50
+ } catch (e) {
51
+ log.warning(`launch: OS could not open the authorization URL (${e instanceof Error ? e.message : String(e)}) — retrying in an in-app browser tab`);
52
+ }
53
+ const wb = await loadWebBrowser();
54
+ if (!wb?.openBrowserAsync) {
55
+ throw new Error('Unable to open bank authorization URL');
45
56
  }
46
- log.info('launch: opening authorization URL in system browser');
47
- await Linking.openURL(args.authorizationUrl);
57
+ log.info('launch: opening authorization URL in in-app browser tab');
58
+ await wb.openBrowserAsync(args.authorizationUrl);
48
59
  }
49
60
  //# sourceMappingURL=bank-redirect.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Linking","createLogger","log","loadWebBrowser","launchBankRedirect","args","mobileAppUrl","info","can","canOpenURL","openURL","warning","e","Error","message","String","wb","openBrowserAsync","authorizationUrl"],"sourceRoot":"../../../src","sources":["internal/bank-redirect.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,OAAO,QAAQ,cAAc;AACtC,SAASC,YAAY,QAAQ,aAAU;AAEvC,MAAMC,GAAG,GAAGD,YAAY,CAAC,cAAc,CAAC;AAWxC,eAAeE,cAAcA,CAAA,EAAmC;EAC9D,IAAI;IACF,OAAQ,MAAM,MAAM,CAAC,kBAAkB,CAAC;EAC1C,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,OAAO,eAAeC,kBAAkBA,CAACC,IAAsB,EAAiB;EAC9E,IAAIA,IAAI,CAACC,YAAY,EAAE;IACrBJ,GAAG,CAACK,IAAI,CAAC,qCAAqC,CAAC;IAC/C,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMR,OAAO,CAACS,UAAU,CAACJ,IAAI,CAACC,YAAY,CAAC;MACvD,IAAIE,GAAG,EAAE;QACP,MAAMR,OAAO,CAACU,OAAO,CAACL,IAAI,CAACC,YAAY,CAAC;QACxCJ,GAAG,CAACK,IAAI,CAAC,wCAAwC,CAAC;QAClD;MACF;MACAL,GAAG,CAACS,OAAO,CAAC,gEAAgE,CAAC;IAC/E,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVV,GAAG,CAACS,OAAO,CACT,oCAAoCC,CAAC,YAAYC,KAAK,GAAGD,CAAC,CAACE,OAAO,GAAGC,MAAM,CAACH,CAAC,CAAC,kBAChF,CAAC;IACH;EACF;EAEA,MAAMI,EAAE,GAAG,MAAMb,cAAc,CAAC,CAAC;EACjC,IAAIa,EAAE,EAAEC,gBAAgB,EAAE;IACxBf,GAAG,CAACK,IAAI,CAAC,qDAAqD,CAAC;IAC/D,MAAMS,EAAE,CAACC,gBAAgB,CAACZ,IAAI,CAACa,gBAAgB,CAAC;IAChD;EACF;EACAhB,GAAG,CAACK,IAAI,CAAC,qDAAqD,CAAC;EAC/D,MAAMP,OAAO,CAACU,OAAO,CAACL,IAAI,CAACa,gBAAgB,CAAC;AAC9C","ignoreList":[]}
1
+ {"version":3,"names":["Linking","createLogger","log","loadWebBrowser","launchBankRedirect","args","mobileAppUrl","info","can","canOpenURL","openURL","warning","e","Error","message","String","authorizationUrl","wb","openBrowserAsync"],"sourceRoot":"../../../src","sources":["internal/bank-redirect.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,OAAO,QAAQ,cAAc;AACtC,SAASC,YAAY,QAAQ,aAAU;AAEvC,MAAMC,GAAG,GAAGD,YAAY,CAAC,cAAc,CAAC;AAWxC,eAAeE,cAAcA,CAAA,EAAmC;EAC9D,IAAI;IACF,OAAQ,MAAM,MAAM,CAAC,kBAAkB,CAAC;EAC1C,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,OAAO,eAAeC,kBAAkBA,CAACC,IAAsB,EAAiB;EAC9E,IAAIA,IAAI,CAACC,YAAY,EAAE;IACrBJ,GAAG,CAACK,IAAI,CAAC,qCAAqC,CAAC;IAC/C,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMR,OAAO,CAACS,UAAU,CAACJ,IAAI,CAACC,YAAY,CAAC;MACvD,IAAIE,GAAG,EAAE;QACP,MAAMR,OAAO,CAACU,OAAO,CAACL,IAAI,CAACC,YAAY,CAAC;QACxCJ,GAAG,CAACK,IAAI,CAAC,wCAAwC,CAAC;QAClD;MACF;MACAL,GAAG,CAACS,OAAO,CAAC,gEAAgE,CAAC;IAC/E,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVV,GAAG,CAACS,OAAO,CACT,oCAAoCC,CAAC,YAAYC,KAAK,GAAGD,CAAC,CAACE,OAAO,GAAGC,MAAM,CAACH,CAAC,CAAC,kBAChF,CAAC;IACH;EACF;EAEA,IAAI;IACF,MAAMZ,OAAO,CAACU,OAAO,CAACL,IAAI,CAACW,gBAAgB,CAAC;IAC5Cd,GAAG,CAACK,IAAI,CAAC,4CAA4C,CAAC;IACtD;EACF,CAAC,CAAC,OAAOK,CAAC,EAAE;IACVV,GAAG,CAACS,OAAO,CACT,oDAAoDC,CAAC,YAAYC,KAAK,GAAGD,CAAC,CAACE,OAAO,GAAGC,MAAM,CAACH,CAAC,CAAC,uCAChG,CAAC;EACH;EAEA,MAAMK,EAAE,GAAG,MAAMd,cAAc,CAAC,CAAC;EACjC,IAAI,CAACc,EAAE,EAAEC,gBAAgB,EAAE;IACzB,MAAM,IAAIL,KAAK,CAAC,uCAAuC,CAAC;EAC1D;EACAX,GAAG,CAACK,IAAI,CAAC,yDAAyD,CAAC;EACnE,MAAMU,EAAE,CAACC,gBAAgB,CAACb,IAAI,CAACW,gBAAgB,CAAC;AAClD","ignoreList":[]}
@@ -8,5 +8,5 @@
8
8
  * `changeset version`). The src/index.ts smoke test asserts this matches
9
9
  * package.json's version.
10
10
  */
11
- export const SDK_VERSION = '1.0.0';
11
+ export const SDK_VERSION = '1.0.1';
12
12
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bank-redirect.d.ts","sourceRoot":"","sources":["../../../../src/internal/bank-redirect.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B9E"}
1
+ {"version":3,"file":"bank-redirect.d.ts","sourceRoot":"","sources":["../../../../src/internal/bank-redirect.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC9E"}
@@ -6,5 +6,5 @@
6
6
  * `changeset version`). The src/index.ts smoke test asserts this matches
7
7
  * package.json's version.
8
8
  */
9
- export declare const SDK_VERSION: "1.0.0";
9
+ export declare const SDK_VERSION: "1.0.1";
10
10
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bank-redirect.d.ts","sourceRoot":"","sources":["../../../../src/internal/bank-redirect.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B9E"}
1
+ {"version":3,"file":"bank-redirect.d.ts","sourceRoot":"","sources":["../../../../src/internal/bank-redirect.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC9E"}
@@ -6,5 +6,5 @@
6
6
  * `changeset version`). The src/index.ts smoke test asserts this matches
7
7
  * package.json's version.
8
8
  */
9
- export declare const SDK_VERSION: "1.0.0";
9
+ export declare const SDK_VERSION: "1.0.1";
10
10
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spare-technologies/spare-link",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "React Native SDK for Spare Link — open-banking payments for iOS and Android.",
5
5
  "main": "./lib/commonjs/index.js",
6
6
  "module": "./lib/module/index.js",
@@ -6,9 +6,15 @@
6
6
  * 1. If `mobileAppUrl` is provided (e.g. `altareq://authorize?...`), try
7
7
  * `Linking.openURL` after checking `canOpenURL` — this launches the
8
8
  * bank's app directly without a browser tab.
9
- * 2. Otherwise (or if step 1 fails) open `authorizationUrl` via
10
- * `expo-web-browser`'s in-app browser if installed; fall back to the
11
- * system browser via `Linking.openURL`.
9
+ * 2. Otherwise (or if step 1 fails) hand `authorizationUrl` to the OS with
10
+ * `Linking.openURL`, so the bank's app opens it where one claims the URL.
11
+ * 3. Only if that throws, retry in `expo-web-browser`'s in-app browser tab.
12
+ *
13
+ * Steps 2 and 3 are in that order because the redirection guide requires it:
14
+ * https://nebras-open-finance.com/tech/tpp-standards/security/fapi/opening-the-redirect
15
+ * An in-app browser tab is a permitted fallback — it is a real browser surface,
16
+ * not an embedded webview — but it takes the routing decision away from the OS,
17
+ * so preferring it means app-to-app redirection never gets the chance to happen.
12
18
  */
13
19
  import { Linking } from 'react-native';
14
20
  import { createLogger } from './logger';
@@ -50,12 +56,20 @@ export async function launchBankRedirect(args: BankRedirectArgs): Promise<void>
50
56
  }
51
57
  }
52
58
 
53
- const wb = await loadWebBrowser();
54
- if (wb?.openBrowserAsync) {
55
- log.info('launch: opening authorization URL in in-app browser');
56
- await wb.openBrowserAsync(args.authorizationUrl);
59
+ try {
60
+ await Linking.openURL(args.authorizationUrl);
61
+ log.info('launch: authorization URL handed to the OS');
57
62
  return;
63
+ } catch (e) {
64
+ log.warning(
65
+ `launch: OS could not open the authorization URL (${e instanceof Error ? e.message : String(e)}) — retrying in an in-app browser tab`,
66
+ );
67
+ }
68
+
69
+ const wb = await loadWebBrowser();
70
+ if (!wb?.openBrowserAsync) {
71
+ throw new Error('Unable to open bank authorization URL');
58
72
  }
59
- log.info('launch: opening authorization URL in system browser');
60
- await Linking.openURL(args.authorizationUrl);
73
+ log.info('launch: opening authorization URL in in-app browser tab');
74
+ await wb.openBrowserAsync(args.authorizationUrl);
61
75
  }
package/src/version.ts CHANGED
@@ -6,4 +6,4 @@
6
6
  * `changeset version`). The src/index.ts smoke test asserts this matches
7
7
  * package.json's version.
8
8
  */
9
- export const SDK_VERSION = '1.0.0' as const;
9
+ export const SDK_VERSION = '1.0.1' as const;