@grabjs/superapp-sdk 2.0.0-beta.12 → 2.0.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -4,4 +4,4 @@
4
4
  * This source code is licensed under the MIT license found in the LICENSE file in the root
5
5
  * directory of this source tree.
6
6
  */
7
- var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function r(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var t=e.default;if("function"==typeof t){var r=function e(){var r=!1;try{r=this instanceof e}catch{}return r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}),r}var n,o={exports:{}},i=(n||(n=1,function(e){function t(e){var t=!1;return{isUnsubscribed:function(){return t},unsubscribe:function(){t||(e(),t=!0)}}}function r(e){return{subscribe:e,then:function(t,r){return new Promise(function(n,o){try{var i=null,a=!1;i=e({next:function(e){n(null==t?void 0:t(e)),i&&i.unsubscribe(),a=!0}}),a&&i&&i.unsubscribe()}catch(e){null==r?o(e):n(r(e))}})}}}function n(n,o){return o.funcNameToWrap,function(n,o){var i=o.callbackNameFunc,a=o.funcToWrap;return r(function(r){var o,s=i();return n[s]=function(t){if(function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return!1;var n=function(e){return Object.keys(e).concat(Object.getOwnPropertyNames(Object.getPrototypeOf(e)))}(e);return t.every(function(e){return 0<=n.indexOf(e)})}(t.result,"event"))t.result.event===e.StreamEvent.STREAM_TERMINATED&&o.unsubscribe();else{var n=t.result,i=t.error,a=t.status_code;r&&r.next&&r.next({result:null===n?void 0:n,error:null===i?void 0:i,status_code:null===a?void 0:a})}},a(s),o=t(function(){n[s]=void 0,r&&r.complete&&r.complete()})})}(n,function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&(r[n[o]]=e[n[o]])}return r}(o,["funcNameToWrap"]))}(e.StreamEvent||(e.StreamEvent={})).STREAM_TERMINATED="STREAM_TERMINATED",e.createDataStream=r,e.createSubscription=t,e.getModuleEnvironment=function(e,t){return e[t]?"android":e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]?"ios":void 0},e.wrapModule=function(e,t){var r;e[(r=t,"Wrapped"+r)]=function(e,t,r){return{invoke:function(o,i){return n(e,{funcNameToWrap:o,callbackNameFunc:function(){return function(e,t){var r=t.moduleName,n=t.funcName,o=0;return function(){for(var t,i,a="";(a=(t={moduleName:r,funcName:n,requestID:o}).moduleName+"_"+t.funcName+"Callback"+(null!==(i=t.requestID)?"_"+i:""))in e;)o+=1;return o+=1,a}()}(e,{moduleName:t,funcName:o})},funcToWrap:function(e){return r({callback:e,method:o,module:t,parameters:null!=i?i:{}})}})}}}(e,t,function(r){if(e[t]&&e[t][r.method]instanceof Function)e[t][r.method](JSON.stringify(r));else{if(!(e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]))throw new Error("Unexpected method '"+r.method+"' for module '"+t+"'");e.webkit.messageHandlers[t].postMessage(r)}})},Object.defineProperty(e,"__esModule",{value:!0})}(o.exports)),o.exports);class a{get wrappedModule(){return window[`Wrapped${this.name}`]}constructor(e){if(this.name=e,!this.wrappedModule)try{i.wrapModule(window,this.name)}catch(e){throw new Error(`Failed to initialize ${this.name}: ${e.message}`,{cause:e})}}}function s(e){return 200===e.status_code||204===e.status_code}function u(e){return 200===e.status_code}function c(e){return 204===e.status_code}function d(e){return 302===e.status_code}function l(e){return 400===e.status_code||403===e.status_code||404===e.status_code||424===e.status_code||500===e.status_code}function p(e){return 400===e.status_code||403===e.status_code||404===e.status_code||424===e.status_code}function h(e){return 500===e.status_code}function f(e){return 400===e.status_code}function g(e){return 403===e.status_code}function v(e){return 404===e.status_code}function m(e){return 424===e.status_code}function w(e){return 500===e.status_code}class y extends a{constructor(){super("CameraModule")}scanQRCode(e){return this.wrappedModule.invoke("scanQRCode",e)}}class _ extends a{constructor(){super("CheckoutModule")}triggerCheckout(e){return this.wrappedModule.invoke("triggerCheckout",e)}}function b(){if("undefined"==typeof window||!window.navigator)return null;const e=window.navigator.userAgent;return e?function(e){if(!e||"string"!=typeof e)return null;const t=e.match(/(Grab|GrabBeta|GrabBetaDebug|GrabTaxi|GrabEarlyAccess)\/v?([0-9]+)\.([0-9]+)\.([0-9]+) \(.*(Android|iOS).*\)/i);return t?{appName:t[1],version:{major:Number(t[2]),minor:Number(t[3]),patch:Number(t[4])},platform:t[5]}:null}(e):null}class M extends a{constructor(){super("ContainerModule")}setBackgroundColor(e){return this.wrappedModule.invoke("setBackgroundColor",{backgroundColor:e})}setTitle(e){return this.wrappedModule.invoke("setTitle",{title:e})}hideBackButton(){return this.wrappedModule.invoke("hideBackButton")}showBackButton(){return this.wrappedModule.invoke("showBackButton")}hideRefreshButton(){return this.wrappedModule.invoke("hideRefreshButton")}showRefreshButton(){return this.wrappedModule.invoke("showRefreshButton")}close(){return this.wrappedModule.invoke("close")}onContentLoaded(){return this.wrappedModule.invoke("onContentLoaded")}showLoader(){return this.wrappedModule.invoke("showLoader")}hideLoader(){return this.wrappedModule.invoke("hideLoader")}openExternalLink(e){return this.wrappedModule.invoke("openExternalLink",{url:e})}onCtaTap(e){return this.wrappedModule.invoke("onCtaTap",{action:e})}sendAnalyticsEvent(e){const t=this.validateAnalyticsEvent(e);return t?Promise.resolve({status_code:400,result:void 0,error:t}):this.wrappedModule.invoke("sendAnalyticsEvent",{state:e.state,name:e.name,data:e.data?JSON.stringify(e.data):null})}isConnected(){const e=function(){if("undefined"==typeof window||!window.navigator)return!1;const e=window.navigator.userAgent;return!!e&&/grab[a-z]*\//i.test(e)}();return Promise.resolve(e?{status_code:200,result:null,error:null}:{status_code:404,error:"Not connected to Grab app",result:null})}getSessionParams(){return this.wrappedModule.invoke("getSessionParams")}validateAnalyticsEvent(e){return null==e.name?"name is required":"string"!=typeof e.name?"name must be a string":null==e.state?"state is required":"string"!=typeof e.state?"state must be a string":null!=e.data&&"object"!=typeof e.data?"data must be undefined or an object":null}}const E={HOMEPAGE:"HOMEPAGE",CHECKOUT_PAGE:"CHECKOUT_PAGE",BOOKING_COMPLETION:"BOOKING_COMPLETION",CUSTOM:"CUSTOM"},C={DEFAULT:"DEFAULT"},S={TRANSACTION_AMOUNT:"transaction_amount",TRANSACTION_CURRENCY:"transaction_currency",PAGE:"page"};var A,k,I={exports:{}},N={exports:{}},O=r(Object.freeze({__proto__:null,default:{}}));function T(){return A||(A=1,N.exports=(t=t||function(t){var r;if("undefined"!=typeof window&&window.crypto&&(r=window.crypto),"undefined"!=typeof self&&self.crypto&&(r=self.crypto),"undefined"!=typeof globalThis&&globalThis.crypto&&(r=globalThis.crypto),!r&&"undefined"!=typeof window&&window.msCrypto&&(r=window.msCrypto),!r&&void 0!==e&&e.crypto&&(r=e.crypto),!r)try{r=O}catch(e){}var n=function(){if(r){if("function"==typeof r.getRandomValues)try{return r.getRandomValues(new Uint32Array(1))[0]}catch(e){}if("function"==typeof r.randomBytes)try{return r.randomBytes(4).readInt32LE()}catch(e){}}throw new Error("Native crypto module could not be used to get secure random number.")},o=Object.create||function(){function e(){}return function(t){var r;return e.prototype=t,r=new e,e.prototype=null,r}}(),i={},a=i.lib={},s=a.Base={extend:function(e){var t=o(this);return e&&t.mixIn(e),t.hasOwnProperty("init")&&this.init!==t.init||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},u=a.WordArray=s.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=null!=t?t:4*e.length},toString:function(e){return(e||d).stringify(this)},concat:function(e){var t=this.words,r=e.words,n=this.sigBytes,o=e.sigBytes;if(this.clamp(),n%4)for(var i=0;i<o;i++){var a=r[i>>>2]>>>24-i%4*8&255;t[n+i>>>2]|=a<<24-(n+i)%4*8}else for(var s=0;s<o;s+=4)t[n+s>>>2]=r[s>>>2];return this.sigBytes+=o,this},clamp:function(){var e=this.words,r=this.sigBytes;e[r>>>2]&=4294967295<<32-r%4*8,e.length=t.ceil(r/4)},clone:function(){var e=s.clone.call(this);return e.words=this.words.slice(0),e},random:function(e){for(var t=[],r=0;r<e;r+=4)t.push(n());return new u.init(t,e)}}),c=i.enc={},d=c.Hex={stringify:function(e){for(var t=e.words,r=e.sigBytes,n=[],o=0;o<r;o++){var i=t[o>>>2]>>>24-o%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,r=[],n=0;n<t;n+=2)r[n>>>3]|=parseInt(e.substr(n,2),16)<<24-n%8*4;return new u.init(r,t/2)}},l=c.Latin1={stringify:function(e){for(var t=e.words,r=e.sigBytes,n=[],o=0;o<r;o++){var i=t[o>>>2]>>>24-o%4*8&255;n.push(String.fromCharCode(i))}return n.join("")},parse:function(e){for(var t=e.length,r=[],n=0;n<t;n++)r[n>>>2]|=(255&e.charCodeAt(n))<<24-n%4*8;return new u.init(r,t)}},p=c.Utf8={stringify:function(e){try{return decodeURIComponent(escape(l.stringify(e)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(e){return l.parse(unescape(encodeURIComponent(e)))}},h=a.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new u.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=p.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(e){var r,n=this._data,o=n.words,i=n.sigBytes,a=this.blockSize,s=i/(4*a),c=(s=e?t.ceil(s):t.max((0|s)-this._minBufferSize,0))*a,d=t.min(4*c,i);if(c){for(var l=0;l<c;l+=a)this._doProcessBlock(o,l);r=o.splice(0,c),n.sigBytes-=d}return new u.init(r,d)},clone:function(){var e=s.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});a.Hasher=h.extend({cfg:s.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){h.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,r){return new e.init(r).finalize(t)}},_createHmacHelper:function(e){return function(t,r){return new f.HMAC.init(e,r).finalize(t)}}});var f=i.algo={};return i}(Math),t)),N.exports;var t}var P,R,x=t(k?I.exports:(k=1,I.exports=(P=T(),function(e){var t=P,r=t.lib,n=r.WordArray,o=r.Hasher,i=t.algo,a=[],s=[];!function(){function t(t){for(var r=e.sqrt(t),n=2;n<=r;n++)if(!(t%n))return!1;return!0}function r(e){return 4294967296*(e-(0|e))|0}for(var n=2,o=0;o<64;)t(n)&&(o<8&&(a[o]=r(e.pow(n,.5))),s[o]=r(e.pow(n,1/3)),o++),n++}();var u=[],c=i.SHA256=o.extend({_doReset:function(){this._hash=new n.init(a.slice(0))},_doProcessBlock:function(e,t){for(var r=this._hash.words,n=r[0],o=r[1],i=r[2],a=r[3],c=r[4],d=r[5],l=r[6],p=r[7],h=0;h<64;h++){if(h<16)u[h]=0|e[t+h];else{var f=u[h-15],g=(f<<25|f>>>7)^(f<<14|f>>>18)^f>>>3,v=u[h-2],m=(v<<15|v>>>17)^(v<<13|v>>>19)^v>>>10;u[h]=g+u[h-7]+m+u[h-16]}var w=n&o^n&i^o&i,y=(n<<30|n>>>2)^(n<<19|n>>>13)^(n<<10|n>>>22),_=p+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&d^~c&l)+s[h]+u[h];p=l,l=d,d=c,c=a+_|0,a=i,i=o,o=n,n=_+(y+w)|0}r[0]=r[0]+n|0,r[1]=r[1]+o|0,r[2]=r[2]+i|0,r[3]=r[3]+a|0,r[4]=r[4]+c|0,r[5]=r[5]+d|0,r[6]=r[6]+l|0,r[7]=r[7]+p|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,o=8*t.sigBytes;return r[o>>>5]|=128<<24-o%32,r[14+(o+64>>>9<<4)]=e.floor(n/4294967296),r[15+(o+64>>>9<<4)]=n,t.sigBytes=4*r.length,this._process(),this._hash},clone:function(){var e=o.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=o._createHelper(c),t.HmacSHA256=o._createHmacHelper(c)}(Math),P.SHA256))),B={exports:{}},U=(R||(R=1,B.exports=function(e){return r=(t=e).lib.WordArray,t.enc.Base64={stringify:function(e){var t=e.words,r=e.sigBytes,n=this._map;e.clamp();for(var o=[],i=0;i<r;i+=3)for(var a=(t[i>>>2]>>>24-i%4*8&255)<<16|(t[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|t[i+2>>>2]>>>24-(i+2)%4*8&255,s=0;s<4&&i+.75*s<r;s++)o.push(n.charAt(a>>>6*(3-s)&63));var u=n.charAt(64);if(u)for(;o.length%4;)o.push(u);return o.join("")},parse:function(e){var t=e.length,n=this._map,o=this._reverseMap;if(!o){o=this._reverseMap=[];for(var i=0;i<n.length;i++)o[n.charCodeAt(i)]=i}var a=n.charAt(64);if(a){var s=e.indexOf(a);-1!==s&&(t=s)}return function(e,t,n){for(var o=[],i=0,a=0;a<t;a++)if(a%4){var s=n[e.charCodeAt(a-1)]<<a%4*2|n[e.charCodeAt(a)]>>>6-a%4*2;o[i>>>2]|=s<<24-i%4*8,i++}return r.create(o,i)}(e,t,o)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},e.enc.Base64;var t,r}(T())),B.exports),z=t(U);function L(e,t){return e.major!==t.major?e.major>t.major:e.minor!==t.minor?e.minor>t.minor:e.patch>=t.patch}class H extends a{constructor(){super("IdentityModule")}get NAMESPACE(){return"grabid"}get CODE_CHALLENGE_METHOD(){return"S256"}get NONCE_LENGTH(){return 16}get STATE_LENGTH(){return 7}get CODE_VERIFIER_LENGTH(){return 64}get OPENID_CONFIG_ENDPOINTS(){return{staging:"https://partner-api.stg-myteksi.com/grabid/v1/oauth2/.well-known/openid-configuration",production:"https://partner-api.grab.com/grabid/v1/oauth2/.well-known/openid-configuration"}}async fetchAuthorizationEndpoint(e){const t=this.OPENID_CONFIG_ENDPOINTS[e];if(!t)throw new Error(`Invalid environment: ${e}. Must be 'staging' or 'production'`);try{const e=await fetch(t);if(!e.ok)throw console.error(`Failed to fetch OpenID configuration from ${t}: ${e.status} ${e.statusText}`),new Error("Failed to fetch authorization configuration");const r=await e.json();if(!r.authorization_endpoint)throw console.error("authorization_endpoint not found in OpenID configuration response"),new Error("Invalid authorization configuration");return r.authorization_endpoint}catch(e){if(console.error("Error fetching authorization endpoint:",e),"Failed to fetch authorization configuration"===e.message||"Invalid authorization configuration"===e.message)throw e;throw new Error("Something wrong happened when fetching authorization configuration",{cause:e})}}static generateRandomString(e){const t=new Uint32Array(e);crypto.getRandomValues(t);let r="";for(let n=0;n<e;n+=1)r+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(t[n]%62);return r}static base64URLEncode(e){return e.toString(z).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}static generateCodeVerifier(e){return H.base64URLEncode(H.generateRandomString(e))}static generateCodeChallenge(e){return H.base64URLEncode(x(e))}generatePKCEArtifacts(){const e=H.generateRandomString(this.NONCE_LENGTH),t=H.generateRandomString(this.STATE_LENGTH),r=H.generateCodeVerifier(this.CODE_VERIFIER_LENGTH);return{nonce:e,state:t,codeVerifier:r,codeChallenge:H.generateCodeChallenge(r),codeChallengeMethod:this.CODE_CHALLENGE_METHOD}}storePKCEArtifacts(e){this.setStorageItem("nonce",e.nonce),this.setStorageItem("state",e.state),this.setStorageItem("code_verifier",e.codeVerifier),this.setStorageItem("redirect_uri",e.redirectUri)}async getAuthorizationArtifacts(){const e=this.getStorageItem("state"),t=this.getStorageItem("code_verifier"),r=this.getStorageItem("nonce"),n=this.getStorageItem("redirect_uri"),o=[e,t,r,n].filter(e=>null!==e).length;return 4===o?Promise.resolve({status_code:200,result:{state:e,codeVerifier:t,nonce:r,redirectUri:n},error:null}):0===o?Promise.resolve({status_code:204,result:null,error:null}):Promise.resolve({status_code:400,result:null,error:"Inconsistent authorization artifacts in storage"})}async clearAuthorizationArtifacts(){return window.localStorage.removeItem(`${this.NAMESPACE}:nonce`),window.localStorage.removeItem(`${this.NAMESPACE}:state`),window.localStorage.removeItem(`${this.NAMESPACE}:code_verifier`),window.localStorage.removeItem(`${this.NAMESPACE}:redirect_uri`),window.localStorage.removeItem(`${this.NAMESPACE}:login_return_uri`),Promise.resolve({status_code:204,result:null,error:null})}setStorageItem(e,t){window.localStorage.setItem(`${this.NAMESPACE}:${e}`,t)}getStorageItem(e){return window.localStorage.getItem(`${this.NAMESPACE}:${e}`)}static normalizeUrl(e){const t=new URL(e);return`${t.origin}${t.pathname}`}static buildAuthorizeUrl(e,t){return`${e}?${Object.entries(t).filter(e=>void 0!==e[1]&&null!==e[1]).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}`}static shouldUseWebConsent(e){const t=b();return!t||"staging"!==e.environment&&!L(t.version,{major:5,minor:396,patch:0})}async performWebAuthorization(e){let t;this.setStorageItem("login_return_uri",window.location.href),this.setStorageItem("redirect_uri",e.redirectUri);try{t=await this.fetchAuthorizationEndpoint(e.environment)}catch(e){return Promise.resolve({status_code:400,error:e.message,result:void 0})}const r={client_id:e.clientId,scope:e.scope,response_type:"code",redirect_uri:e.redirectUri,nonce:e.nonce,state:e.state,code_challenge_method:e.codeChallengeMethod,code_challenge:e.codeChallenge},n=H.buildAuthorizeUrl(t,r);return window.location.assign(n),Promise.resolve({status_code:302,result:null})}async performNativeAuthorization(e){return this.wrappedModule.invoke("authorize",{clientId:e.clientId,redirectUri:e.actualRedirectUri,scope:e.scope,nonce:e.nonce,state:e.state,codeChallenge:e.codeChallenge,codeChallengeMethod:e.codeChallengeMethod,responseMode:e.responseMode})}async authorize(e){const t=H.validateAuthorizeRequest(e);if(t)return Promise.resolve({status_code:400,result:void 0,error:t});const r=this.generatePKCEArtifacts(),n=e.responseMode||"redirect",o="in_place"===n?H.normalizeUrl(window.location.href):e.redirectUri;this.storePKCEArtifacts({...r,redirectUri:o});const i={clientId:e.clientId,redirectUri:e.redirectUri,scope:e.scope,nonce:r.nonce,state:r.state,codeChallenge:r.codeChallenge,codeChallengeMethod:r.codeChallengeMethod};if(H.shouldUseWebConsent(e))return this.performWebAuthorization({...i,environment:e.environment});try{const t=await this.performNativeAuthorization({...i,actualRedirectUri:o,responseMode:n});return l(t)&&[400,401,403].includes(t.status_code)?(console.error(`Native authorization returned ${t.status_code}, falling back to web flow:`,t.error),this.performWebAuthorization({...i,environment:e.environment})):t}catch(t){return console.error("Native authorization failed, falling back to web flow:",t),this.performWebAuthorization({...i,environment:e.environment})}}static validateRequiredString(e,t){return e&&"string"==typeof e&&""!==e.trim()?null:`${t} is required and must be a non-empty string`}static validateAuthorizeRequest(e){if(null==e)return"request is required";const t=H.validateRequiredString(e.scope,"scope");if(t)return t;const r=H.validateRequiredString(e.clientId,"clientId");if(r)return r;const n=H.validateRequiredString(e.redirectUri,"redirectUri");if(n)return n;try{if(!new URL(e.redirectUri))return"redirectUri must be a valid URL"}catch{return"redirectUri must be a valid URL"}return H.validateRequiredString(e.environment,"environment")||("staging"!==e.environment&&"production"!==e.environment?"environment must be either 'staging' or 'production'":null)}}class D extends a{constructor(){super("ProfileModule")}static isSupported(){const e=b();return!!e&&L(e.version,{major:5,minor:399,patch:0})}fetchEmail(){return D.isSupported()?this.wrappedModule.invoke("fetchEmail"):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}verifyEmail(e){return D.isSupported()?this.wrappedModule.invoke("verifyEmail",e):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}}class j extends a{constructor(){super("LocaleModule")}getLanguageLocaleIdentifier(){return this.wrappedModule.invoke("getLanguageLocaleIdentifier")}}class G extends a{constructor(){super("LocationModule")}getCoordinate(){return this.wrappedModule.invoke("getCoordinate")}observeLocationChange(){return this.wrappedModule.invoke("observeLocationChange")}getCountryCode(){return this.wrappedModule.invoke("getCountryCode")}}class $ extends a{constructor(){super("MediaModule")}playDRMContent(e){return this.wrappedModule.invoke("playDRMContent",{data:e})}observePlayDRMContent(e){return this.wrappedModule.invoke("observePlayDRMContent",{data:e})}}class W extends a{constructor(){super("PlatformModule")}back(){return this.wrappedModule.invoke("back")}}class q extends a{constructor(){super("ScopeModule")}hasAccessTo(e,t){return this.wrappedModule.invoke("hasAccessTo",{module:e,method:t})}reloadScopes(){return this.wrappedModule.invoke("reloadScopes")}}class F extends a{constructor(){super("StorageModule")}setBoolean(e,t){return this.wrappedModule.invoke("setBoolean",{key:e,value:t})}getBoolean(e){return this.wrappedModule.invoke("getBoolean",{key:e})}setInt(e,t){return this.wrappedModule.invoke("setInt",{key:e,value:t})}getInt(e){return this.wrappedModule.invoke("getInt",{key:e})}setString(e,t){return this.wrappedModule.invoke("setString",{key:e,value:t})}getString(e){return this.wrappedModule.invoke("getString",{key:e})}setDouble(e,t){return this.wrappedModule.invoke("setDouble",{key:e,value:t})}getDouble(e){return this.wrappedModule.invoke("getDouble",{key:e})}remove(e){return this.wrappedModule.invoke("remove",{key:e})}removeAll(){return this.wrappedModule.invoke("removeAll")}}class V extends a{constructor(){super("SystemWebViewKitModule")}redirectToSystemWebView(e){return this.wrappedModule.invoke("redirectToSystemWebView",e)}}export{a as BaseModule,y as CameraModule,_ as CheckoutModule,S as ContainerAnalyticsEventData,C as ContainerAnalyticsEventName,E as ContainerAnalyticsEventState,M as ContainerModule,H as IdentityModule,j as LocaleModule,G as LocationModule,$ as MediaModule,W as PlatformModule,D as ProfileModule,q as ScopeModule,F as StorageModule,V as SystemWebViewKitModule,f as isResponseBadRequest,p as isResponseClientError,l as isResponseError,m as isResponseFailedDependency,g as isResponseForbidden,w as isResponseInternalServerError,c as isResponseNoContent,v as isResponseNotFound,u as isResponseOk,d as isResponseRedirect,h as isResponseServerError,s as isResponseSuccess};
7
+ var e,t={exports:{}},r=(e||(e=1,function(e){function t(e){var t=!1;return{isUnsubscribed:function(){return t},unsubscribe:function(){t||(e(),t=!0)}}}function r(e){return{subscribe:e,then:function(t,r){return new Promise(function(n,o){try{var i=null,a=!1;i=e({next:function(e){n(null==t?void 0:t(e)),i&&i.unsubscribe(),a=!0}}),a&&i&&i.unsubscribe()}catch(e){null==r?o(e):n(r(e))}})}}}function n(n,o){return o.funcNameToWrap,function(n,o){var i=o.callbackNameFunc,a=o.funcToWrap;return r(function(r){var o,s=i();return n[s]=function(t){if(function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return!1;var n=function(e){return Object.keys(e).concat(Object.getOwnPropertyNames(Object.getPrototypeOf(e)))}(e);return t.every(function(e){return 0<=n.indexOf(e)})}(t.result,"event"))t.result.event===e.StreamEvent.STREAM_TERMINATED&&o.unsubscribe();else{var n=t.result,i=t.error,a=t.status_code;r&&r.next&&r.next({result:null===n?void 0:n,error:null===i?void 0:i,status_code:null===a?void 0:a})}},a(s),o=t(function(){n[s]=void 0,r&&r.complete&&r.complete()})})}(n,function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&(r[n[o]]=e[n[o]])}return r}(o,["funcNameToWrap"]))}(e.StreamEvent||(e.StreamEvent={})).STREAM_TERMINATED="STREAM_TERMINATED",e.createDataStream=r,e.createSubscription=t,e.getModuleEnvironment=function(e,t){return e[t]?"android":e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]?"ios":void 0},e.wrapModule=function(e,t){var r;e[(r=t,"Wrapped"+r)]=function(e,t,r){return{invoke:function(o,i){return n(e,{funcNameToWrap:o,callbackNameFunc:function(){return function(e,t){var r=t.moduleName,n=t.funcName,o=0;return function(){for(var t,i,a="";(a=(t={moduleName:r,funcName:n,requestID:o}).moduleName+"_"+t.funcName+"Callback"+(null!==(i=t.requestID)?"_"+i:""))in e;)o+=1;return o+=1,a}()}(e,{moduleName:t,funcName:o})},funcToWrap:function(e){return r({callback:e,method:o,module:t,parameters:null!=i?i:{}})}})}}}(e,t,function(r){if(e[t]&&e[t][r.method]instanceof Function)e[t][r.method](JSON.stringify(r));else{if(!(e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]))throw new Error("Unexpected method '"+r.method+"' for module '"+t+"'");e.webkit.messageHandlers[t].postMessage(r)}})},Object.defineProperty(e,"__esModule",{value:!0})}(t.exports)),t.exports);function n(e){return e instanceof Error?e.message:String(e)}function o(e,t){return e instanceof Error&&e.message===t}function i(){if("undefined"==typeof window||!window.navigator)return null;const e=window.navigator.userAgent;return e?function(e){if(!e||"string"!=typeof e)return null;const t=e.match(/(Grab|GrabBeta|GrabBetaDebug|GrabTaxi|GrabEarlyAccess)\/v?([0-9]+)\.([0-9]+)\.([0-9]+) \(.*(Android|iOS).*\)/i);return t?{appName:t[1],version:{major:Number(t[2]),minor:Number(t[3]),patch:Number(t[4])},platform:t[5]}:null}(e):null}function a(){if("undefined"==typeof window||!window.navigator)return!1;const e=window.navigator.userAgent;return!!e&&/grab[a-z]*\//i.test(e)}class s{get wrappedModule(){return window[`Wrapped${this.name}`]}constructor(e){if(this.name=e,!this.wrappedModule)try{r.wrapModule(window,this.name)}catch(e){throw new Error(`Failed to initialize ${this.name}: ${n(e)}`,{cause:e})}}invoke(e,t){return a()?this.wrappedModule.invoke(e,t):Promise.resolve({status_code:501,result:void 0,error:"Not implemented: This method requires the Grab app environment"})}}class u extends s{constructor(){super("CameraModule")}scanQRCode(e){return this.invoke("scanQRCode",e)}}class c extends s{constructor(){super("CheckoutModule")}triggerCheckout(e){return this.invoke("triggerCheckout",e)}}const l={HOMEPAGE:"HOMEPAGE",CHECKOUT_PAGE:"CHECKOUT_PAGE",BOOKING_COMPLETION:"BOOKING_COMPLETION",CUSTOM:"CUSTOM"},d={DEFAULT:"DEFAULT"},h={TRANSACTION_AMOUNT:"transaction_amount",TRANSACTION_CURRENCY:"transaction_currency",PAGE:"page"};class m extends s{constructor(){super("ContainerModule")}setBackgroundColor(e){return this.invoke("setBackgroundColor",{backgroundColor:e})}setTitle(e){return this.invoke("setTitle",{title:e})}hideBackButton(){return this.invoke("hideBackButton")}showBackButton(){return this.invoke("showBackButton")}hideRefreshButton(){return this.invoke("hideRefreshButton")}showRefreshButton(){return this.invoke("showRefreshButton")}close(){return this.invoke("close")}onContentLoaded(){return this.invoke("onContentLoaded")}showLoader(){return this.invoke("showLoader")}hideLoader(){return this.invoke("hideLoader")}openExternalLink(e){return this.invoke("openExternalLink",{url:e})}onCtaTap(e){return this.invoke("onCtaTap",{action:e})}sendAnalyticsEvent(e){const t=this.validateAnalyticsEvent(e);return t?Promise.resolve({status_code:400,result:void 0,error:t}):this.invoke("sendAnalyticsEvent",{state:e.state,name:e.name,data:e.data?JSON.stringify(e.data):null})}isConnected(){const e=a();return Promise.resolve(e?{status_code:200,result:{connected:!0},error:null}:{status_code:404,error:"Not connected to Grab app",result:null})}getSessionParams(){return this.invoke("getSessionParams")}validateAnalyticsEvent(e){return null==e.name?"name is required":"string"!=typeof e.name?"name must be a string":null==e.state?"state is required":"string"!=typeof e.state?"state must be a string":null!=e.data&&"object"!=typeof e.data?"data must be undefined or an object":null}}function v(e){const t=new Uint32Array(e);crypto.getRandomValues(t);let r="";for(let n=0;n<e;n+=1)r+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(t[n]%62);return r}async function g(e){const t=(new TextEncoder).encode(e);return function(e){const t=new Uint8Array(e);let r="";for(let e=0;e<t.byteLength;e+=1)r+=String.fromCharCode(t[e]);return btoa(r).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}(await crypto.subtle.digest("SHA-256",t))}function f(e,t){return e.major!==t.major?e.major>t.major:e.minor!==t.minor?e.minor>t.minor:e.patch>=t.patch}const p="grabid",w={staging:"https://partner-api.stg-myteksi.com/grabid/v1/oauth2/.well-known/openid-configuration",production:"https://partner-api.grab.com/grabid/v1/oauth2/.well-known/openid-configuration"};class b extends s{constructor(){super("IdentityModule")}async fetchAuthorizationEndpoint(e){const t=w[e];if(!t)throw new Error(`Invalid environment: ${e}. Must be 'staging' or 'production'`);try{const e=await fetch(t);if(!e.ok)throw console.error(`Failed to fetch OpenID configuration from ${t}: ${e.status} ${e.statusText}`),new Error("Failed to fetch authorization configuration");const r=await e.json();if(!r.authorization_endpoint)throw console.error("authorization_endpoint not found in OpenID configuration response"),new Error("Invalid authorization configuration");return r.authorization_endpoint}catch(e){if(console.error("Error fetching authorization endpoint:",e),o(e,"Failed to fetch authorization configuration")||o(e,"Invalid authorization configuration"))throw e;throw new Error("Something wrong happened when fetching authorization configuration",{cause:e})}}async generatePKCEArtifacts(){const e=v(16),t=v(7),r=(n=v(64),btoa(n).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_"));var n;return{nonce:e,state:t,codeVerifier:r,codeChallenge:await g(r),codeChallengeMethod:"S256"}}storePKCEArtifacts(e){this.setStorageItem("nonce",e.nonce),this.setStorageItem("state",e.state),this.setStorageItem("code_verifier",e.codeVerifier),this.setStorageItem("redirect_uri",e.redirectUri)}async getAuthorizationArtifacts(){const e=this.getStorageItem("state"),t=this.getStorageItem("code_verifier"),r=this.getStorageItem("nonce"),n=this.getStorageItem("redirect_uri"),o=[e,t,r,n].filter(e=>null!==e).length;return 4===o?Promise.resolve({status_code:200,result:{state:e,codeVerifier:t,nonce:r,redirectUri:n},error:null}):0===o?Promise.resolve({status_code:204,result:null,error:null}):Promise.resolve({status_code:400,result:null,error:"Inconsistent authorization artifacts in storage"})}async clearAuthorizationArtifacts(){return window.localStorage.removeItem(`${p}:nonce`),window.localStorage.removeItem(`${p}:state`),window.localStorage.removeItem(`${p}:code_verifier`),window.localStorage.removeItem(`${p}:redirect_uri`),window.localStorage.removeItem(`${p}:login_return_uri`),Promise.resolve({status_code:204,result:null,error:null})}setStorageItem(e,t){window.localStorage.setItem(`${p}:${e}`,t)}getStorageItem(e){return window.localStorage.getItem(`${p}:${e}`)}static normalizeUrl(e){const t=new URL(e);return`${t.origin}${t.pathname}`}static buildAuthorizeUrl(e,t){return`${e}?${Object.entries(t).filter(e=>void 0!==e[1]&&null!==e[1]).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}`}static shouldUseWebConsent(e){const t=i();return!t||"staging"!==e.environment&&!f(t.version,{major:5,minor:396,patch:0})}async performWebAuthorization(e){let t;this.setStorageItem("login_return_uri",window.location.href),this.setStorageItem("redirect_uri",e.redirectUri);try{t=await this.fetchAuthorizationEndpoint(e.environment)}catch(e){return Promise.resolve({status_code:400,error:n(e),result:void 0})}const r={client_id:e.clientId,scope:e.scope,response_type:"code",redirect_uri:e.redirectUri,nonce:e.nonce,state:e.state,code_challenge_method:e.codeChallengeMethod,code_challenge:e.codeChallenge},o=b.buildAuthorizeUrl(t,r);return window.location.assign(o),Promise.resolve({status_code:302,result:null})}async performNativeAuthorization(e){return this.wrappedModule.invoke("authorize",{clientId:e.clientId,redirectUri:e.actualRedirectUri,scope:e.scope,nonce:e.nonce,state:e.state,codeChallenge:e.codeChallenge,codeChallengeMethod:e.codeChallengeMethod,responseMode:e.responseMode})}async authorize(e){const t=b.validateAuthorizeRequest(e);if(t)return Promise.resolve({status_code:400,result:void 0,error:t});const r=await this.generatePKCEArtifacts(),n=e.responseMode||"redirect",o="in_place"===n?b.normalizeUrl(window.location.href):e.redirectUri;this.storePKCEArtifacts({...r,redirectUri:o});const i={clientId:e.clientId,redirectUri:e.redirectUri,scope:e.scope,nonce:r.nonce,state:r.state,codeChallenge:r.codeChallenge,codeChallengeMethod:r.codeChallengeMethod};if(b.shouldUseWebConsent(e))return this.performWebAuthorization({...i,environment:e.environment});try{const t=await this.performNativeAuthorization({...i,actualRedirectUri:o,responseMode:n});return 400===t.status_code||401===t.status_code||403===t.status_code?(console.error(`Native authorization returned ${t.status_code}, falling back to web flow:`,t.error),this.performWebAuthorization({...i,environment:e.environment})):t}catch(t){return console.error("Native authorization failed, falling back to web flow:",t),this.performWebAuthorization({...i,environment:e.environment})}}static validateRequiredString(e,t){return e&&"string"==typeof e&&""!==e.trim()?null:`${t} is required and must be a non-empty string`}static validateAuthorizeRequest(e){if(null==e)return"request is required";const t=b.validateRequiredString(e.scope,"scope");if(t)return t;const r=b.validateRequiredString(e.clientId,"clientId");if(r)return r;const n=b.validateRequiredString(e.redirectUri,"redirectUri");if(n)return n;try{if(!new URL(e.redirectUri))return"redirectUri must be a valid URL"}catch{return"redirectUri must be a valid URL"}return b.validateRequiredString(e.environment,"environment")||("staging"!==e.environment&&"production"!==e.environment?"environment must be either 'staging' or 'production'":null)}}class k extends s{constructor(){super("LocaleModule")}getLanguageLocaleIdentifier(){return this.invoke("getLanguageLocaleIdentifier")}}class y extends s{constructor(){super("LocationModule")}getCoordinate(){return this.invoke("getCoordinate")}observeLocationChange(){return this.wrappedModule.invoke("observeLocationChange")}getCountryCode(){return this.invoke("getCountryCode")}}class C extends s{constructor(){super("MediaModule")}playDRMContent(e){return this.invoke("playDRMContent",{data:e})}observePlayDRMContent(e){return this.wrappedModule.invoke("observePlayDRMContent",{data:e})}}class S extends s{constructor(){super("PlatformModule")}back(){return this.invoke("back")}}class _ extends s{constructor(){super("ProfileModule")}static isSupported(){const e=i();return!!e&&f(e.version,{major:5,minor:399,patch:0})}fetchEmail(){return _.isSupported()?this.invoke("fetchEmail"):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}verifyEmail(e){return _.isSupported()?this.invoke("verifyEmail",e):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}}class A extends s{constructor(){super("ScopeModule")}hasAccessTo(e,t){return this.invoke("hasAccessTo",{module:e,method:t})}reloadScopes(){return this.invoke("reloadScopes")}}class E extends s{constructor(){super("StorageModule")}setBoolean(e,t){return this.invoke("setBoolean",{key:e,value:t})}getBoolean(e){return this.invoke("getBoolean",{key:e})}setInt(e,t){return this.invoke("setInt",{key:e,value:t})}getInt(e){return this.invoke("getInt",{key:e})}setString(e,t){return this.invoke("setString",{key:e,value:t})}getString(e){return this.invoke("getString",{key:e})}setDouble(e,t){return this.invoke("setDouble",{key:e,value:t})}getDouble(e){return this.invoke("getDouble",{key:e})}remove(e){return this.invoke("remove",{key:e})}removeAll(){return this.invoke("removeAll")}}class I extends s{constructor(){super("SystemWebViewKitModule")}redirectToSystemWebView(e){return this.invoke("redirectToSystemWebView",e)}}export{s as BaseModule,u as CameraModule,c as CheckoutModule,h as ContainerAnalyticsEventData,d as ContainerAnalyticsEventName,l as ContainerAnalyticsEventState,m as ContainerModule,b as IdentityModule,k as LocaleModule,y as LocationModule,C as MediaModule,S as PlatformModule,_ as ProfileModule,A as ScopeModule,E as StorageModule,I as SystemWebViewKitModule};
package/dist/index.js CHANGED
@@ -4,4 +4,4 @@
4
4
  * This source code is licensed under the MIT license found in the LICENSE file in the root
5
5
  * directory of this source tree.
6
6
  */
7
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).SuperAppSDK={})}(this,function(e){"use strict";var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function r(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var t=e.default;if("function"==typeof t){var r=function e(){var r=!1;try{r=this instanceof e}catch{}return r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}),r}var o,i={exports:{}},s=(o||(o=1,function(e){function t(e){var t=!1;return{isUnsubscribed:function(){return t},unsubscribe:function(){t||(e(),t=!0)}}}function r(e){return{subscribe:e,then:function(t,r){return new Promise(function(n,o){try{var i=null,s=!1;i=e({next:function(e){n(null==t?void 0:t(e)),i&&i.unsubscribe(),s=!0}}),s&&i&&i.unsubscribe()}catch(e){null==r?o(e):n(r(e))}})}}}function n(n,o){return o.funcNameToWrap,function(n,o){var i=o.callbackNameFunc,s=o.funcToWrap;return r(function(r){var o,a=i();return n[a]=function(t){if(function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return!1;var n=function(e){return Object.keys(e).concat(Object.getOwnPropertyNames(Object.getPrototypeOf(e)))}(e);return t.every(function(e){return 0<=n.indexOf(e)})}(t.result,"event"))t.result.event===e.StreamEvent.STREAM_TERMINATED&&o.unsubscribe();else{var n=t.result,i=t.error,s=t.status_code;r&&r.next&&r.next({result:null===n?void 0:n,error:null===i?void 0:i,status_code:null===s?void 0:s})}},s(a),o=t(function(){n[a]=void 0,r&&r.complete&&r.complete()})})}(n,function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&(r[n[o]]=e[n[o]])}return r}(o,["funcNameToWrap"]))}(e.StreamEvent||(e.StreamEvent={})).STREAM_TERMINATED="STREAM_TERMINATED",e.createDataStream=r,e.createSubscription=t,e.getModuleEnvironment=function(e,t){return e[t]?"android":e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]?"ios":void 0},e.wrapModule=function(e,t){var r;e[(r=t,"Wrapped"+r)]=function(e,t,r){return{invoke:function(o,i){return n(e,{funcNameToWrap:o,callbackNameFunc:function(){return function(e,t){var r=t.moduleName,n=t.funcName,o=0;return function(){for(var t,i,s="";(s=(t={moduleName:r,funcName:n,requestID:o}).moduleName+"_"+t.funcName+"Callback"+(null!==(i=t.requestID)?"_"+i:""))in e;)o+=1;return o+=1,s}()}(e,{moduleName:t,funcName:o})},funcToWrap:function(e){return r({callback:e,method:o,module:t,parameters:null!=i?i:{}})}})}}}(e,t,function(r){if(e[t]&&e[t][r.method]instanceof Function)e[t][r.method](JSON.stringify(r));else{if(!(e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]))throw new Error("Unexpected method '"+r.method+"' for module '"+t+"'");e.webkit.messageHandlers[t].postMessage(r)}})},Object.defineProperty(e,"__esModule",{value:!0})}(i.exports)),i.exports);class a{get wrappedModule(){return window[`Wrapped${this.name}`]}constructor(e){if(this.name=e,!this.wrappedModule)try{s.wrapModule(window,this.name)}catch(e){throw new Error(`Failed to initialize ${this.name}: ${e.message}`,{cause:e})}}}function u(e){return 400===e.status_code||403===e.status_code||404===e.status_code||424===e.status_code||500===e.status_code}function c(){if("undefined"==typeof window||!window.navigator)return null;const e=window.navigator.userAgent;return e?function(e){if(!e||"string"!=typeof e)return null;const t=e.match(/(Grab|GrabBeta|GrabBetaDebug|GrabTaxi|GrabEarlyAccess)\/v?([0-9]+)\.([0-9]+)\.([0-9]+) \(.*(Android|iOS).*\)/i);return t?{appName:t[1],version:{major:Number(t[2]),minor:Number(t[3]),patch:Number(t[4])},platform:t[5]}:null}(e):null}var d,l,p={exports:{}},f={exports:{}},h=n(Object.freeze({__proto__:null,default:{}}));function g(){return d||(d=1,function(e){var r;e.exports=(r=r||function(e){var r;if("undefined"!=typeof window&&window.crypto&&(r=window.crypto),"undefined"!=typeof self&&self.crypto&&(r=self.crypto),"undefined"!=typeof globalThis&&globalThis.crypto&&(r=globalThis.crypto),!r&&"undefined"!=typeof window&&window.msCrypto&&(r=window.msCrypto),!r&&void 0!==t&&t.crypto&&(r=t.crypto),!r)try{r=h}catch(e){}var n=function(){if(r){if("function"==typeof r.getRandomValues)try{return r.getRandomValues(new Uint32Array(1))[0]}catch(e){}if("function"==typeof r.randomBytes)try{return r.randomBytes(4).readInt32LE()}catch(e){}}throw new Error("Native crypto module could not be used to get secure random number.")},o=Object.create||function(){function e(){}return function(t){var r;return e.prototype=t,r=new e,e.prototype=null,r}}(),i={},s=i.lib={},a=s.Base={extend:function(e){var t=o(this);return e&&t.mixIn(e),t.hasOwnProperty("init")&&this.init!==t.init||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},u=s.WordArray=a.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=null!=t?t:4*e.length},toString:function(e){return(e||d).stringify(this)},concat:function(e){var t=this.words,r=e.words,n=this.sigBytes,o=e.sigBytes;if(this.clamp(),n%4)for(var i=0;i<o;i++){var s=r[i>>>2]>>>24-i%4*8&255;t[n+i>>>2]|=s<<24-(n+i)%4*8}else for(var a=0;a<o;a+=4)t[n+a>>>2]=r[a>>>2];return this.sigBytes+=o,this},clamp:function(){var t=this.words,r=this.sigBytes;t[r>>>2]&=4294967295<<32-r%4*8,t.length=e.ceil(r/4)},clone:function(){var e=a.clone.call(this);return e.words=this.words.slice(0),e},random:function(e){for(var t=[],r=0;r<e;r+=4)t.push(n());return new u.init(t,e)}}),c=i.enc={},d=c.Hex={stringify:function(e){for(var t=e.words,r=e.sigBytes,n=[],o=0;o<r;o++){var i=t[o>>>2]>>>24-o%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,r=[],n=0;n<t;n+=2)r[n>>>3]|=parseInt(e.substr(n,2),16)<<24-n%8*4;return new u.init(r,t/2)}},l=c.Latin1={stringify:function(e){for(var t=e.words,r=e.sigBytes,n=[],o=0;o<r;o++){var i=t[o>>>2]>>>24-o%4*8&255;n.push(String.fromCharCode(i))}return n.join("")},parse:function(e){for(var t=e.length,r=[],n=0;n<t;n++)r[n>>>2]|=(255&e.charCodeAt(n))<<24-n%4*8;return new u.init(r,t)}},p=c.Utf8={stringify:function(e){try{return decodeURIComponent(escape(l.stringify(e)))}catch(e){throw new Error("Malformed UTF-8 data")}},parse:function(e){return l.parse(unescape(encodeURIComponent(e)))}},f=s.BufferedBlockAlgorithm=a.extend({reset:function(){this._data=new u.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=p.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var r,n=this._data,o=n.words,i=n.sigBytes,s=this.blockSize,a=i/(4*s),c=(a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0))*s,d=e.min(4*c,i);if(c){for(var l=0;l<c;l+=s)this._doProcessBlock(o,l);r=o.splice(0,c),n.sigBytes-=d}return new u.init(r,d)},clone:function(){var e=a.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});s.Hasher=f.extend({cfg:a.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){f.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,r){return new e.init(r).finalize(t)}},_createHmacHelper:function(e){return function(t,r){return new g.HMAC.init(e,r).finalize(t)}}});var g=i.algo={};return i}(Math),r)}(f)),f.exports}var v,m=r((l||(l=1,function(e){var t;e.exports=(t=g(),function(e){var r=t,n=r.lib,o=n.WordArray,i=n.Hasher,s=r.algo,a=[],u=[];!function(){function t(t){for(var r=e.sqrt(t),n=2;n<=r;n++)if(!(t%n))return!1;return!0}function r(e){return 4294967296*(e-(0|e))|0}for(var n=2,o=0;o<64;)t(n)&&(o<8&&(a[o]=r(e.pow(n,.5))),u[o]=r(e.pow(n,1/3)),o++),n++}();var c=[],d=s.SHA256=i.extend({_doReset:function(){this._hash=new o.init(a.slice(0))},_doProcessBlock:function(e,t){for(var r=this._hash.words,n=r[0],o=r[1],i=r[2],s=r[3],a=r[4],d=r[5],l=r[6],p=r[7],f=0;f<64;f++){if(f<16)c[f]=0|e[t+f];else{var h=c[f-15],g=(h<<25|h>>>7)^(h<<14|h>>>18)^h>>>3,v=c[f-2],m=(v<<15|v>>>17)^(v<<13|v>>>19)^v>>>10;c[f]=g+c[f-7]+m+c[f-16]}var w=n&o^n&i^o&i,y=(n<<30|n>>>2)^(n<<19|n>>>13)^(n<<10|n>>>22),_=p+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&d^~a&l)+u[f]+c[f];p=l,l=d,d=a,a=s+_|0,s=i,i=o,o=n,n=_+(y+w)|0}r[0]=r[0]+n|0,r[1]=r[1]+o|0,r[2]=r[2]+i|0,r[3]=r[3]+s|0,r[4]=r[4]+a|0,r[5]=r[5]+d|0,r[6]=r[6]+l|0,r[7]=r[7]+p|0},_doFinalize:function(){var t=this._data,r=t.words,n=8*this._nDataBytes,o=8*t.sigBytes;return r[o>>>5]|=128<<24-o%32,r[14+(o+64>>>9<<4)]=e.floor(n/4294967296),r[15+(o+64>>>9<<4)]=n,t.sigBytes=4*r.length,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});r.SHA256=i._createHelper(d),r.HmacSHA256=i._createHmacHelper(d)}(Math),t.SHA256)}(p)),p.exports)),w={exports:{}},y=r((v||(v=1,function(e){var t,r,n;e.exports=(t=g(),n=(r=t).lib.WordArray,r.enc.Base64={stringify:function(e){var t=e.words,r=e.sigBytes,n=this._map;e.clamp();for(var o=[],i=0;i<r;i+=3)for(var s=(t[i>>>2]>>>24-i%4*8&255)<<16|(t[i+1>>>2]>>>24-(i+1)%4*8&255)<<8|t[i+2>>>2]>>>24-(i+2)%4*8&255,a=0;a<4&&i+.75*a<r;a++)o.push(n.charAt(s>>>6*(3-a)&63));var u=n.charAt(64);if(u)for(;o.length%4;)o.push(u);return o.join("")},parse:function(e){var t=e.length,r=this._map,o=this._reverseMap;if(!o){o=this._reverseMap=[];for(var i=0;i<r.length;i++)o[r.charCodeAt(i)]=i}var s=r.charAt(64);if(s){var a=e.indexOf(s);-1!==a&&(t=a)}return function(e,t,r){for(var o=[],i=0,s=0;s<t;s++)if(s%4){var a=r[e.charCodeAt(s-1)]<<s%4*2|r[e.charCodeAt(s)]>>>6-s%4*2;o[i>>>2]|=a<<24-i%4*8,i++}return n.create(o,i)}(e,t,o)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},t.enc.Base64)}(w)),w.exports));function _(e,t){return e.major!==t.major?e.major>t.major:e.minor!==t.minor?e.minor>t.minor:e.patch>=t.patch}class b extends a{constructor(){super("IdentityModule")}get NAMESPACE(){return"grabid"}get CODE_CHALLENGE_METHOD(){return"S256"}get NONCE_LENGTH(){return 16}get STATE_LENGTH(){return 7}get CODE_VERIFIER_LENGTH(){return 64}get OPENID_CONFIG_ENDPOINTS(){return{staging:"https://partner-api.stg-myteksi.com/grabid/v1/oauth2/.well-known/openid-configuration",production:"https://partner-api.grab.com/grabid/v1/oauth2/.well-known/openid-configuration"}}async fetchAuthorizationEndpoint(e){const t=this.OPENID_CONFIG_ENDPOINTS[e];if(!t)throw new Error(`Invalid environment: ${e}. Must be 'staging' or 'production'`);try{const e=await fetch(t);if(!e.ok)throw console.error(`Failed to fetch OpenID configuration from ${t}: ${e.status} ${e.statusText}`),new Error("Failed to fetch authorization configuration");const r=await e.json();if(!r.authorization_endpoint)throw console.error("authorization_endpoint not found in OpenID configuration response"),new Error("Invalid authorization configuration");return r.authorization_endpoint}catch(e){if(console.error("Error fetching authorization endpoint:",e),"Failed to fetch authorization configuration"===e.message||"Invalid authorization configuration"===e.message)throw e;throw new Error("Something wrong happened when fetching authorization configuration",{cause:e})}}static generateRandomString(e){const t=new Uint32Array(e);crypto.getRandomValues(t);let r="";for(let n=0;n<e;n+=1)r+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(t[n]%62);return r}static base64URLEncode(e){return e.toString(y).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}static generateCodeVerifier(e){return b.base64URLEncode(b.generateRandomString(e))}static generateCodeChallenge(e){return b.base64URLEncode(m(e))}generatePKCEArtifacts(){const e=b.generateRandomString(this.NONCE_LENGTH),t=b.generateRandomString(this.STATE_LENGTH),r=b.generateCodeVerifier(this.CODE_VERIFIER_LENGTH);return{nonce:e,state:t,codeVerifier:r,codeChallenge:b.generateCodeChallenge(r),codeChallengeMethod:this.CODE_CHALLENGE_METHOD}}storePKCEArtifacts(e){this.setStorageItem("nonce",e.nonce),this.setStorageItem("state",e.state),this.setStorageItem("code_verifier",e.codeVerifier),this.setStorageItem("redirect_uri",e.redirectUri)}async getAuthorizationArtifacts(){const e=this.getStorageItem("state"),t=this.getStorageItem("code_verifier"),r=this.getStorageItem("nonce"),n=this.getStorageItem("redirect_uri"),o=[e,t,r,n].filter(e=>null!==e).length;return 4===o?Promise.resolve({status_code:200,result:{state:e,codeVerifier:t,nonce:r,redirectUri:n},error:null}):0===o?Promise.resolve({status_code:204,result:null,error:null}):Promise.resolve({status_code:400,result:null,error:"Inconsistent authorization artifacts in storage"})}async clearAuthorizationArtifacts(){return window.localStorage.removeItem(`${this.NAMESPACE}:nonce`),window.localStorage.removeItem(`${this.NAMESPACE}:state`),window.localStorage.removeItem(`${this.NAMESPACE}:code_verifier`),window.localStorage.removeItem(`${this.NAMESPACE}:redirect_uri`),window.localStorage.removeItem(`${this.NAMESPACE}:login_return_uri`),Promise.resolve({status_code:204,result:null,error:null})}setStorageItem(e,t){window.localStorage.setItem(`${this.NAMESPACE}:${e}`,t)}getStorageItem(e){return window.localStorage.getItem(`${this.NAMESPACE}:${e}`)}static normalizeUrl(e){const t=new URL(e);return`${t.origin}${t.pathname}`}static buildAuthorizeUrl(e,t){return`${e}?${Object.entries(t).filter(e=>void 0!==e[1]&&null!==e[1]).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}`}static shouldUseWebConsent(e){const t=c();return!t||"staging"!==e.environment&&!_(t.version,{major:5,minor:396,patch:0})}async performWebAuthorization(e){let t;this.setStorageItem("login_return_uri",window.location.href),this.setStorageItem("redirect_uri",e.redirectUri);try{t=await this.fetchAuthorizationEndpoint(e.environment)}catch(e){return Promise.resolve({status_code:400,error:e.message,result:void 0})}const r={client_id:e.clientId,scope:e.scope,response_type:"code",redirect_uri:e.redirectUri,nonce:e.nonce,state:e.state,code_challenge_method:e.codeChallengeMethod,code_challenge:e.codeChallenge},n=b.buildAuthorizeUrl(t,r);return window.location.assign(n),Promise.resolve({status_code:302,result:null})}async performNativeAuthorization(e){return this.wrappedModule.invoke("authorize",{clientId:e.clientId,redirectUri:e.actualRedirectUri,scope:e.scope,nonce:e.nonce,state:e.state,codeChallenge:e.codeChallenge,codeChallengeMethod:e.codeChallengeMethod,responseMode:e.responseMode})}async authorize(e){const t=b.validateAuthorizeRequest(e);if(t)return Promise.resolve({status_code:400,result:void 0,error:t});const r=this.generatePKCEArtifacts(),n=e.responseMode||"redirect",o="in_place"===n?b.normalizeUrl(window.location.href):e.redirectUri;this.storePKCEArtifacts({...r,redirectUri:o});const i={clientId:e.clientId,redirectUri:e.redirectUri,scope:e.scope,nonce:r.nonce,state:r.state,codeChallenge:r.codeChallenge,codeChallengeMethod:r.codeChallengeMethod};if(b.shouldUseWebConsent(e))return this.performWebAuthorization({...i,environment:e.environment});try{const t=await this.performNativeAuthorization({...i,actualRedirectUri:o,responseMode:n});return u(t)&&[400,401,403].includes(t.status_code)?(console.error(`Native authorization returned ${t.status_code}, falling back to web flow:`,t.error),this.performWebAuthorization({...i,environment:e.environment})):t}catch(t){return console.error("Native authorization failed, falling back to web flow:",t),this.performWebAuthorization({...i,environment:e.environment})}}static validateRequiredString(e,t){return e&&"string"==typeof e&&""!==e.trim()?null:`${t} is required and must be a non-empty string`}static validateAuthorizeRequest(e){if(null==e)return"request is required";const t=b.validateRequiredString(e.scope,"scope");if(t)return t;const r=b.validateRequiredString(e.clientId,"clientId");if(r)return r;const n=b.validateRequiredString(e.redirectUri,"redirectUri");if(n)return n;try{if(!new URL(e.redirectUri))return"redirectUri must be a valid URL"}catch{return"redirectUri must be a valid URL"}return b.validateRequiredString(e.environment,"environment")||("staging"!==e.environment&&"production"!==e.environment?"environment must be either 'staging' or 'production'":null)}}class M extends a{constructor(){super("ProfileModule")}static isSupported(){const e=c();return!!e&&_(e.version,{major:5,minor:399,patch:0})}fetchEmail(){return M.isSupported()?this.wrappedModule.invoke("fetchEmail"):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}verifyEmail(e){return M.isSupported()?this.wrappedModule.invoke("verifyEmail",e):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}}e.BaseModule=a,e.CameraModule=class extends a{constructor(){super("CameraModule")}scanQRCode(e){return this.wrappedModule.invoke("scanQRCode",e)}},e.CheckoutModule=class extends a{constructor(){super("CheckoutModule")}triggerCheckout(e){return this.wrappedModule.invoke("triggerCheckout",e)}},e.ContainerAnalyticsEventData={TRANSACTION_AMOUNT:"transaction_amount",TRANSACTION_CURRENCY:"transaction_currency",PAGE:"page"},e.ContainerAnalyticsEventName={DEFAULT:"DEFAULT"},e.ContainerAnalyticsEventState={HOMEPAGE:"HOMEPAGE",CHECKOUT_PAGE:"CHECKOUT_PAGE",BOOKING_COMPLETION:"BOOKING_COMPLETION",CUSTOM:"CUSTOM"},e.ContainerModule=class extends a{constructor(){super("ContainerModule")}setBackgroundColor(e){return this.wrappedModule.invoke("setBackgroundColor",{backgroundColor:e})}setTitle(e){return this.wrappedModule.invoke("setTitle",{title:e})}hideBackButton(){return this.wrappedModule.invoke("hideBackButton")}showBackButton(){return this.wrappedModule.invoke("showBackButton")}hideRefreshButton(){return this.wrappedModule.invoke("hideRefreshButton")}showRefreshButton(){return this.wrappedModule.invoke("showRefreshButton")}close(){return this.wrappedModule.invoke("close")}onContentLoaded(){return this.wrappedModule.invoke("onContentLoaded")}showLoader(){return this.wrappedModule.invoke("showLoader")}hideLoader(){return this.wrappedModule.invoke("hideLoader")}openExternalLink(e){return this.wrappedModule.invoke("openExternalLink",{url:e})}onCtaTap(e){return this.wrappedModule.invoke("onCtaTap",{action:e})}sendAnalyticsEvent(e){const t=this.validateAnalyticsEvent(e);return t?Promise.resolve({status_code:400,result:void 0,error:t}):this.wrappedModule.invoke("sendAnalyticsEvent",{state:e.state,name:e.name,data:e.data?JSON.stringify(e.data):null})}isConnected(){const e=function(){if("undefined"==typeof window||!window.navigator)return!1;const e=window.navigator.userAgent;return!!e&&/grab[a-z]*\//i.test(e)}();return Promise.resolve(e?{status_code:200,result:null,error:null}:{status_code:404,error:"Not connected to Grab app",result:null})}getSessionParams(){return this.wrappedModule.invoke("getSessionParams")}validateAnalyticsEvent(e){return null==e.name?"name is required":"string"!=typeof e.name?"name must be a string":null==e.state?"state is required":"string"!=typeof e.state?"state must be a string":null!=e.data&&"object"!=typeof e.data?"data must be undefined or an object":null}},e.IdentityModule=b,e.LocaleModule=class extends a{constructor(){super("LocaleModule")}getLanguageLocaleIdentifier(){return this.wrappedModule.invoke("getLanguageLocaleIdentifier")}},e.LocationModule=class extends a{constructor(){super("LocationModule")}getCoordinate(){return this.wrappedModule.invoke("getCoordinate")}observeLocationChange(){return this.wrappedModule.invoke("observeLocationChange")}getCountryCode(){return this.wrappedModule.invoke("getCountryCode")}},e.MediaModule=class extends a{constructor(){super("MediaModule")}playDRMContent(e){return this.wrappedModule.invoke("playDRMContent",{data:e})}observePlayDRMContent(e){return this.wrappedModule.invoke("observePlayDRMContent",{data:e})}},e.PlatformModule=class extends a{constructor(){super("PlatformModule")}back(){return this.wrappedModule.invoke("back")}},e.ProfileModule=M,e.ScopeModule=class extends a{constructor(){super("ScopeModule")}hasAccessTo(e,t){return this.wrappedModule.invoke("hasAccessTo",{module:e,method:t})}reloadScopes(){return this.wrappedModule.invoke("reloadScopes")}},e.StorageModule=class extends a{constructor(){super("StorageModule")}setBoolean(e,t){return this.wrappedModule.invoke("setBoolean",{key:e,value:t})}getBoolean(e){return this.wrappedModule.invoke("getBoolean",{key:e})}setInt(e,t){return this.wrappedModule.invoke("setInt",{key:e,value:t})}getInt(e){return this.wrappedModule.invoke("getInt",{key:e})}setString(e,t){return this.wrappedModule.invoke("setString",{key:e,value:t})}getString(e){return this.wrappedModule.invoke("getString",{key:e})}setDouble(e,t){return this.wrappedModule.invoke("setDouble",{key:e,value:t})}getDouble(e){return this.wrappedModule.invoke("getDouble",{key:e})}remove(e){return this.wrappedModule.invoke("remove",{key:e})}removeAll(){return this.wrappedModule.invoke("removeAll")}},e.SystemWebViewKitModule=class extends a{constructor(){super("SystemWebViewKitModule")}redirectToSystemWebView(e){return this.wrappedModule.invoke("redirectToSystemWebView",e)}},e.isResponseBadRequest=function(e){return 400===e.status_code},e.isResponseClientError=function(e){return 400===e.status_code||403===e.status_code||404===e.status_code||424===e.status_code},e.isResponseError=u,e.isResponseFailedDependency=function(e){return 424===e.status_code},e.isResponseForbidden=function(e){return 403===e.status_code},e.isResponseInternalServerError=function(e){return 500===e.status_code},e.isResponseNoContent=function(e){return 204===e.status_code},e.isResponseNotFound=function(e){return 404===e.status_code},e.isResponseOk=function(e){return 200===e.status_code},e.isResponseRedirect=function(e){return 302===e.status_code},e.isResponseServerError=function(e){return 500===e.status_code},e.isResponseSuccess=function(e){return 200===e.status_code||204===e.status_code}});
7
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).SuperAppSDK={})}(this,function(e){"use strict";var t,r={exports:{}},n=(t||(t=1,function(e){function t(e){var t=!1;return{isUnsubscribed:function(){return t},unsubscribe:function(){t||(e(),t=!0)}}}function r(e){return{subscribe:e,then:function(t,r){return new Promise(function(n,o){try{var i=null,a=!1;i=e({next:function(e){n(null==t?void 0:t(e)),i&&i.unsubscribe(),a=!0}}),a&&i&&i.unsubscribe()}catch(e){null==r?o(e):n(r(e))}})}}}function n(n,o){return o.funcNameToWrap,function(n,o){var i=o.callbackNameFunc,a=o.funcToWrap;return r(function(r){var o,s=i();return n[s]=function(t){if(function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return!1;var n=function(e){return Object.keys(e).concat(Object.getOwnPropertyNames(Object.getPrototypeOf(e)))}(e);return t.every(function(e){return 0<=n.indexOf(e)})}(t.result,"event"))t.result.event===e.StreamEvent.STREAM_TERMINATED&&o.unsubscribe();else{var n=t.result,i=t.error,a=t.status_code;r&&r.next&&r.next({result:null===n?void 0:n,error:null===i?void 0:i,status_code:null===a?void 0:a})}},a(s),o=t(function(){n[s]=void 0,r&&r.complete&&r.complete()})})}(n,function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&(r[n[o]]=e[n[o]])}return r}(o,["funcNameToWrap"]))}(e.StreamEvent||(e.StreamEvent={})).STREAM_TERMINATED="STREAM_TERMINATED",e.createDataStream=r,e.createSubscription=t,e.getModuleEnvironment=function(e,t){return e[t]?"android":e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]?"ios":void 0},e.wrapModule=function(e,t){var r;e[(r=t,"Wrapped"+r)]=function(e,t,r){return{invoke:function(o,i){return n(e,{funcNameToWrap:o,callbackNameFunc:function(){return function(e,t){var r=t.moduleName,n=t.funcName,o=0;return function(){for(var t,i,a="";(a=(t={moduleName:r,funcName:n,requestID:o}).moduleName+"_"+t.funcName+"Callback"+(null!==(i=t.requestID)?"_"+i:""))in e;)o+=1;return o+=1,a}()}(e,{moduleName:t,funcName:o})},funcToWrap:function(e){return r({callback:e,method:o,module:t,parameters:null!=i?i:{}})}})}}}(e,t,function(r){if(e[t]&&e[t][r.method]instanceof Function)e[t][r.method](JSON.stringify(r));else{if(!(e.webkit&&e.webkit.messageHandlers&&e.webkit.messageHandlers[t]))throw new Error("Unexpected method '"+r.method+"' for module '"+t+"'");e.webkit.messageHandlers[t].postMessage(r)}})},Object.defineProperty(e,"__esModule",{value:!0})}(r.exports)),r.exports);function o(e){return e instanceof Error?e.message:String(e)}function i(e,t){return e instanceof Error&&e.message===t}function a(){if("undefined"==typeof window||!window.navigator)return null;const e=window.navigator.userAgent;return e?function(e){if(!e||"string"!=typeof e)return null;const t=e.match(/(Grab|GrabBeta|GrabBetaDebug|GrabTaxi|GrabEarlyAccess)\/v?([0-9]+)\.([0-9]+)\.([0-9]+) \(.*(Android|iOS).*\)/i);return t?{appName:t[1],version:{major:Number(t[2]),minor:Number(t[3]),patch:Number(t[4])},platform:t[5]}:null}(e):null}function s(){if("undefined"==typeof window||!window.navigator)return!1;const e=window.navigator.userAgent;return!!e&&/grab[a-z]*\//i.test(e)}class u{get wrappedModule(){return window[`Wrapped${this.name}`]}constructor(e){if(this.name=e,!this.wrappedModule)try{n.wrapModule(window,this.name)}catch(e){throw new Error(`Failed to initialize ${this.name}: ${o(e)}`,{cause:e})}}invoke(e,t){return s()?this.wrappedModule.invoke(e,t):Promise.resolve({status_code:501,result:void 0,error:"Not implemented: This method requires the Grab app environment"})}}function c(e){const t=new Uint32Array(e);crypto.getRandomValues(t);let r="";for(let n=0;n<e;n+=1)r+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(t[n]%62);return r}async function l(e){const t=(new TextEncoder).encode(e);return function(e){const t=new Uint8Array(e);let r="";for(let e=0;e<t.byteLength;e+=1)r+=String.fromCharCode(t[e]);return btoa(r).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}(await crypto.subtle.digest("SHA-256",t))}function d(e,t){return e.major!==t.major?e.major>t.major:e.minor!==t.minor?e.minor>t.minor:e.patch>=t.patch}const h="grabid",m={staging:"https://partner-api.stg-myteksi.com/grabid/v1/oauth2/.well-known/openid-configuration",production:"https://partner-api.grab.com/grabid/v1/oauth2/.well-known/openid-configuration"};class f extends u{constructor(){super("IdentityModule")}async fetchAuthorizationEndpoint(e){const t=m[e];if(!t)throw new Error(`Invalid environment: ${e}. Must be 'staging' or 'production'`);try{const e=await fetch(t);if(!e.ok)throw console.error(`Failed to fetch OpenID configuration from ${t}: ${e.status} ${e.statusText}`),new Error("Failed to fetch authorization configuration");const r=await e.json();if(!r.authorization_endpoint)throw console.error("authorization_endpoint not found in OpenID configuration response"),new Error("Invalid authorization configuration");return r.authorization_endpoint}catch(e){if(console.error("Error fetching authorization endpoint:",e),i(e,"Failed to fetch authorization configuration")||i(e,"Invalid authorization configuration"))throw e;throw new Error("Something wrong happened when fetching authorization configuration",{cause:e})}}async generatePKCEArtifacts(){const e=c(16),t=c(7),r=(n=c(64),btoa(n).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_"));var n;return{nonce:e,state:t,codeVerifier:r,codeChallenge:await l(r),codeChallengeMethod:"S256"}}storePKCEArtifacts(e){this.setStorageItem("nonce",e.nonce),this.setStorageItem("state",e.state),this.setStorageItem("code_verifier",e.codeVerifier),this.setStorageItem("redirect_uri",e.redirectUri)}async getAuthorizationArtifacts(){const e=this.getStorageItem("state"),t=this.getStorageItem("code_verifier"),r=this.getStorageItem("nonce"),n=this.getStorageItem("redirect_uri"),o=[e,t,r,n].filter(e=>null!==e).length;return 4===o?Promise.resolve({status_code:200,result:{state:e,codeVerifier:t,nonce:r,redirectUri:n},error:null}):0===o?Promise.resolve({status_code:204,result:null,error:null}):Promise.resolve({status_code:400,result:null,error:"Inconsistent authorization artifacts in storage"})}async clearAuthorizationArtifacts(){return window.localStorage.removeItem(`${h}:nonce`),window.localStorage.removeItem(`${h}:state`),window.localStorage.removeItem(`${h}:code_verifier`),window.localStorage.removeItem(`${h}:redirect_uri`),window.localStorage.removeItem(`${h}:login_return_uri`),Promise.resolve({status_code:204,result:null,error:null})}setStorageItem(e,t){window.localStorage.setItem(`${h}:${e}`,t)}getStorageItem(e){return window.localStorage.getItem(`${h}:${e}`)}static normalizeUrl(e){const t=new URL(e);return`${t.origin}${t.pathname}`}static buildAuthorizeUrl(e,t){return`${e}?${Object.entries(t).filter(e=>void 0!==e[1]&&null!==e[1]).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&")}`}static shouldUseWebConsent(e){const t=a();return!t||"staging"!==e.environment&&!d(t.version,{major:5,minor:396,patch:0})}async performWebAuthorization(e){let t;this.setStorageItem("login_return_uri",window.location.href),this.setStorageItem("redirect_uri",e.redirectUri);try{t=await this.fetchAuthorizationEndpoint(e.environment)}catch(e){return Promise.resolve({status_code:400,error:o(e),result:void 0})}const r={client_id:e.clientId,scope:e.scope,response_type:"code",redirect_uri:e.redirectUri,nonce:e.nonce,state:e.state,code_challenge_method:e.codeChallengeMethod,code_challenge:e.codeChallenge},n=f.buildAuthorizeUrl(t,r);return window.location.assign(n),Promise.resolve({status_code:302,result:null})}async performNativeAuthorization(e){return this.wrappedModule.invoke("authorize",{clientId:e.clientId,redirectUri:e.actualRedirectUri,scope:e.scope,nonce:e.nonce,state:e.state,codeChallenge:e.codeChallenge,codeChallengeMethod:e.codeChallengeMethod,responseMode:e.responseMode})}async authorize(e){const t=f.validateAuthorizeRequest(e);if(t)return Promise.resolve({status_code:400,result:void 0,error:t});const r=await this.generatePKCEArtifacts(),n=e.responseMode||"redirect",o="in_place"===n?f.normalizeUrl(window.location.href):e.redirectUri;this.storePKCEArtifacts({...r,redirectUri:o});const i={clientId:e.clientId,redirectUri:e.redirectUri,scope:e.scope,nonce:r.nonce,state:r.state,codeChallenge:r.codeChallenge,codeChallengeMethod:r.codeChallengeMethod};if(f.shouldUseWebConsent(e))return this.performWebAuthorization({...i,environment:e.environment});try{const t=await this.performNativeAuthorization({...i,actualRedirectUri:o,responseMode:n});return 400===t.status_code||401===t.status_code||403===t.status_code?(console.error(`Native authorization returned ${t.status_code}, falling back to web flow:`,t.error),this.performWebAuthorization({...i,environment:e.environment})):t}catch(t){return console.error("Native authorization failed, falling back to web flow:",t),this.performWebAuthorization({...i,environment:e.environment})}}static validateRequiredString(e,t){return e&&"string"==typeof e&&""!==e.trim()?null:`${t} is required and must be a non-empty string`}static validateAuthorizeRequest(e){if(null==e)return"request is required";const t=f.validateRequiredString(e.scope,"scope");if(t)return t;const r=f.validateRequiredString(e.clientId,"clientId");if(r)return r;const n=f.validateRequiredString(e.redirectUri,"redirectUri");if(n)return n;try{if(!new URL(e.redirectUri))return"redirectUri must be a valid URL"}catch{return"redirectUri must be a valid URL"}return f.validateRequiredString(e.environment,"environment")||("staging"!==e.environment&&"production"!==e.environment?"environment must be either 'staging' or 'production'":null)}}class v extends u{constructor(){super("ProfileModule")}static isSupported(){const e=a();return!!e&&d(e.version,{major:5,minor:399,patch:0})}fetchEmail(){return v.isSupported()?this.invoke("fetchEmail"):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}verifyEmail(e){return v.isSupported()?this.invoke("verifyEmail",e):Promise.resolve({status_code:403,result:void 0,error:"This feature requires Grab app version 5.399 or above."})}}e.BaseModule=u,e.CameraModule=class extends u{constructor(){super("CameraModule")}scanQRCode(e){return this.invoke("scanQRCode",e)}},e.CheckoutModule=class extends u{constructor(){super("CheckoutModule")}triggerCheckout(e){return this.invoke("triggerCheckout",e)}},e.ContainerAnalyticsEventData={TRANSACTION_AMOUNT:"transaction_amount",TRANSACTION_CURRENCY:"transaction_currency",PAGE:"page"},e.ContainerAnalyticsEventName={DEFAULT:"DEFAULT"},e.ContainerAnalyticsEventState={HOMEPAGE:"HOMEPAGE",CHECKOUT_PAGE:"CHECKOUT_PAGE",BOOKING_COMPLETION:"BOOKING_COMPLETION",CUSTOM:"CUSTOM"},e.ContainerModule=class extends u{constructor(){super("ContainerModule")}setBackgroundColor(e){return this.invoke("setBackgroundColor",{backgroundColor:e})}setTitle(e){return this.invoke("setTitle",{title:e})}hideBackButton(){return this.invoke("hideBackButton")}showBackButton(){return this.invoke("showBackButton")}hideRefreshButton(){return this.invoke("hideRefreshButton")}showRefreshButton(){return this.invoke("showRefreshButton")}close(){return this.invoke("close")}onContentLoaded(){return this.invoke("onContentLoaded")}showLoader(){return this.invoke("showLoader")}hideLoader(){return this.invoke("hideLoader")}openExternalLink(e){return this.invoke("openExternalLink",{url:e})}onCtaTap(e){return this.invoke("onCtaTap",{action:e})}sendAnalyticsEvent(e){const t=this.validateAnalyticsEvent(e);return t?Promise.resolve({status_code:400,result:void 0,error:t}):this.invoke("sendAnalyticsEvent",{state:e.state,name:e.name,data:e.data?JSON.stringify(e.data):null})}isConnected(){const e=s();return Promise.resolve(e?{status_code:200,result:{connected:!0},error:null}:{status_code:404,error:"Not connected to Grab app",result:null})}getSessionParams(){return this.invoke("getSessionParams")}validateAnalyticsEvent(e){return null==e.name?"name is required":"string"!=typeof e.name?"name must be a string":null==e.state?"state is required":"string"!=typeof e.state?"state must be a string":null!=e.data&&"object"!=typeof e.data?"data must be undefined or an object":null}},e.IdentityModule=f,e.LocaleModule=class extends u{constructor(){super("LocaleModule")}getLanguageLocaleIdentifier(){return this.invoke("getLanguageLocaleIdentifier")}},e.LocationModule=class extends u{constructor(){super("LocationModule")}getCoordinate(){return this.invoke("getCoordinate")}observeLocationChange(){return this.wrappedModule.invoke("observeLocationChange")}getCountryCode(){return this.invoke("getCountryCode")}},e.MediaModule=class extends u{constructor(){super("MediaModule")}playDRMContent(e){return this.invoke("playDRMContent",{data:e})}observePlayDRMContent(e){return this.wrappedModule.invoke("observePlayDRMContent",{data:e})}},e.PlatformModule=class extends u{constructor(){super("PlatformModule")}back(){return this.invoke("back")}},e.ProfileModule=v,e.ScopeModule=class extends u{constructor(){super("ScopeModule")}hasAccessTo(e,t){return this.invoke("hasAccessTo",{module:e,method:t})}reloadScopes(){return this.invoke("reloadScopes")}},e.StorageModule=class extends u{constructor(){super("StorageModule")}setBoolean(e,t){return this.invoke("setBoolean",{key:e,value:t})}getBoolean(e){return this.invoke("getBoolean",{key:e})}setInt(e,t){return this.invoke("setInt",{key:e,value:t})}getInt(e){return this.invoke("getInt",{key:e})}setString(e,t){return this.invoke("setString",{key:e,value:t})}getString(e){return this.invoke("getString",{key:e})}setDouble(e,t){return this.invoke("setDouble",{key:e,value:t})}getDouble(e){return this.invoke("getDouble",{key:e})}remove(e){return this.invoke("remove",{key:e})}removeAll(){return this.invoke("removeAll")}},e.SystemWebViewKitModule=class extends u{constructor(){super("SystemWebViewKitModule")}redirectToSystemWebView(e){return this.invoke("redirectToSystemWebView",e)}}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grabjs/superapp-sdk",
3
- "version": "2.0.0-beta.12",
3
+ "version": "2.0.0-beta.14",
4
4
  "description": "SDK for Grab SuperApp WebView.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -59,14 +59,11 @@
59
59
  "url": "https://github.com/grab/superapp-sdk/issues"
60
60
  },
61
61
  "homepage": "https://github.com/grab/superapp-sdk#readme",
62
- "dependencies": {
63
- "@grabjs/mobile-kit-bridge-sdk": "^2.2.2",
64
- "crypto-js": "^4.2.0"
65
- },
66
62
  "devDependencies": {
67
63
  "@eslint/js": "^10.0.1",
68
64
  "@eslint/json": "^1.0.1",
69
65
  "@eslint/markdown": "^7.5.1",
66
+ "@grabjs/mobile-kit-bridge-sdk": "^2.2.2",
70
67
  "@microsoft/api-extractor": "^7.57.6",
71
68
  "@rollup/plugin-commonjs": "^29.0.0",
72
69
  "@rollup/plugin-node-resolve": "^16.0.3",
@@ -74,7 +71,9 @@
74
71
  "@rollup/plugin-typescript": "^12.3.0",
75
72
  "@types/node": "@types/node@^24",
76
73
  "eslint": "^10.0.2",
74
+ "eslint-plugin-jsdoc": "^62.7.1",
77
75
  "eslint-plugin-license-header": "^0.9.0",
76
+ "eslint-plugin-simple-import-sort": "^12.1.1",
78
77
  "globals": "^17.4.0",
79
78
  "husky": "^9.1.7",
80
79
  "lint-staged": "^16.3.1",