@webority/mobile-core 0.1.0 → 0.2.0

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.
Files changed (185) hide show
  1. package/README.md +32 -0
  2. package/lib/commonjs/api/clientHeaders.js +1 -0
  3. package/lib/commonjs/api/minAppVersion.js +1 -0
  4. package/lib/commonjs/api/publicClient.js +1 -1
  5. package/lib/commonjs/api/requestDefaults.js +1 -0
  6. package/lib/commonjs/api/retry.js +1 -1
  7. package/lib/commonjs/api/tokenRefresh.js +1 -1
  8. package/lib/commonjs/api/userClient.js +1 -1
  9. package/lib/commonjs/auth/authStore.js +1 -1
  10. package/lib/commonjs/auth/index.js +1 -1
  11. package/lib/commonjs/config/index.js +1 -1
  12. package/lib/commonjs/errors/extractApiError.js +1 -0
  13. package/lib/commonjs/errors/index.js +1 -0
  14. package/lib/commonjs/formatters/currency.js +1 -1
  15. package/lib/commonjs/formatters/date.js +1 -1
  16. package/lib/commonjs/formatters/dateMath.js +1 -1
  17. package/lib/commonjs/formatters/formatConfig.js +1 -0
  18. package/lib/commonjs/formatters/house.js +1 -0
  19. package/lib/commonjs/formatters/index.js +1 -1
  20. package/lib/commonjs/formatters/number.js +1 -1
  21. package/lib/commonjs/index.js +1 -1
  22. package/lib/commonjs/initSDK.js +1 -1
  23. package/lib/commonjs/initUserAuth.js +1 -1
  24. package/lib/commonjs/logger/index.js +1 -1
  25. package/lib/commonjs/query/apiBaseQuery.js +1 -0
  26. package/lib/commonjs/query/createAppApi.js +1 -0
  27. package/lib/commonjs/query/index.js +1 -0
  28. package/lib/commonjs/query/listeners.js +1 -0
  29. package/lib/commonjs/query/paging.js +1 -0
  30. package/lib/commonjs/query/tags.js +1 -0
  31. package/lib/commonjs/redux/errorToastMiddleware.js +1 -0
  32. package/lib/commonjs/redux/index.js +1 -0
  33. package/lib/commonjs/redux/rootReducer.js +1 -0
  34. package/lib/commonjs/redux/serializableCheck.js +1 -0
  35. package/lib/commonjs/versionCheck/buildNumber.js +1 -0
  36. package/lib/commonjs/versionCheck/index.js +1 -1
  37. package/lib/module/api/baseUrl.js +1 -1
  38. package/lib/module/api/clientHeaders.js +1 -0
  39. package/lib/module/api/curl.js +1 -1
  40. package/lib/module/api/minAppVersion.js +1 -0
  41. package/lib/module/api/multipart.js +1 -1
  42. package/lib/module/api/publicClient.js +1 -1
  43. package/lib/module/api/requestDefaults.js +1 -0
  44. package/lib/module/api/responseBodyText.js +1 -1
  45. package/lib/module/api/retry.js +1 -1
  46. package/lib/module/api/tokenRefresh.js +1 -1
  47. package/lib/module/api/userClient.js +1 -1
  48. package/lib/module/auth/authStore.js +1 -1
  49. package/lib/module/auth/index.js +1 -1
  50. package/lib/module/auth/jwt.js +1 -1
  51. package/lib/module/config/index.js +1 -1
  52. package/lib/module/deepLink/index.js +1 -1
  53. package/lib/module/download/adapters/expoFs.js +1 -1
  54. package/lib/module/download/adapters/shared.js +1 -1
  55. package/lib/module/download/index.js +1 -1
  56. package/lib/module/errors/extractApiError.js +1 -0
  57. package/lib/module/errors/index.js +1 -0
  58. package/lib/module/formatters/currency.js +1 -1
  59. package/lib/module/formatters/date.js +1 -1
  60. package/lib/module/formatters/dateMath.js +1 -1
  61. package/lib/module/formatters/formatConfig.js +1 -0
  62. package/lib/module/formatters/house.js +1 -0
  63. package/lib/module/formatters/index.js +1 -1
  64. package/lib/module/formatters/initials.js +1 -1
  65. package/lib/module/formatters/intlCache.js +1 -1
  66. package/lib/module/formatters/number.js +1 -1
  67. package/lib/module/formatters/phone.js +1 -1
  68. package/lib/module/formatters/windowsToIanaTable.js +1 -1
  69. package/lib/module/geolocation/adapters/expoLocation.js +1 -1
  70. package/lib/module/geolocation/index.js +1 -1
  71. package/lib/module/index.js +1 -1
  72. package/lib/module/initSDK.js +1 -1
  73. package/lib/module/initUserAuth.js +1 -1
  74. package/lib/module/logger/crashlytics.js +1 -1
  75. package/lib/module/logger/index.js +1 -1
  76. package/lib/module/logger/redact.js +1 -1
  77. package/lib/module/network/index.js +1 -1
  78. package/lib/module/network/networkStatus.js +1 -1
  79. package/lib/module/permissions/calendar.js +1 -1
  80. package/lib/module/permissions/camera.js +1 -1
  81. package/lib/module/permissions/contacts.js +1 -1
  82. package/lib/module/permissions/index.js +1 -1
  83. package/lib/module/permissions/location.js +1 -1
  84. package/lib/module/permissions/mediaLibrary.js +1 -1
  85. package/lib/module/permissions/notifications.js +1 -1
  86. package/lib/module/permissions/photos.js +1 -1
  87. package/lib/module/phone/countries.js +1 -1
  88. package/lib/module/push/index.js +1 -1
  89. package/lib/module/push/push.js +1 -1
  90. package/lib/module/push/status.js +1 -1
  91. package/lib/module/push/task.js +1 -1
  92. package/lib/module/query/apiBaseQuery.js +1 -0
  93. package/lib/module/query/createAppApi.js +1 -0
  94. package/lib/module/query/index.js +1 -0
  95. package/lib/module/query/listeners.js +1 -0
  96. package/lib/module/query/paging.js +1 -0
  97. package/lib/module/query/tags.js +1 -0
  98. package/lib/module/redux/errorToastMiddleware.js +1 -0
  99. package/lib/module/redux/index.js +1 -0
  100. package/lib/module/redux/rootReducer.js +1 -0
  101. package/lib/module/redux/serializableCheck.js +1 -0
  102. package/lib/module/secureScreen/index.js +1 -1
  103. package/lib/module/share/index.js +1 -1
  104. package/lib/module/smsRetriever/index.js +1 -1
  105. package/lib/module/specs/NativeSmsRetriever.js +1 -1
  106. package/lib/module/sqlite/adapters/expo.js +1 -1
  107. package/lib/module/sqlite/index.js +1 -1
  108. package/lib/module/storage/index.js +1 -1
  109. package/lib/module/types/axios.js +1 -1
  110. package/lib/module/types/globals.d.js +1 -1
  111. package/lib/module/utils/base64.js +1 -1
  112. package/lib/module/utils/imageCompression.js +1 -1
  113. package/lib/module/utils/index.js +1 -1
  114. package/lib/module/validators/index.js +1 -1
  115. package/lib/module/versionCheck/buildNumber.js +1 -0
  116. package/lib/module/versionCheck/index.js +1 -1
  117. package/lib/typescript/commonjs/api/clientHeaders.d.ts +25 -0
  118. package/lib/typescript/commonjs/api/minAppVersion.d.ts +24 -0
  119. package/lib/typescript/commonjs/api/requestDefaults.d.ts +21 -0
  120. package/lib/typescript/commonjs/api/retry.d.ts +23 -9
  121. package/lib/typescript/commonjs/api/tokenRefresh.d.ts +14 -2
  122. package/lib/typescript/commonjs/api/userClient.d.ts +1 -1
  123. package/lib/typescript/commonjs/auth/authStore.d.ts +76 -0
  124. package/lib/typescript/commonjs/auth/index.d.ts +2 -2
  125. package/lib/typescript/commonjs/config/index.d.ts +31 -2
  126. package/lib/typescript/commonjs/errors/extractApiError.d.ts +69 -0
  127. package/lib/typescript/commonjs/errors/index.d.ts +3 -0
  128. package/lib/typescript/commonjs/formatters/currency.d.ts +22 -7
  129. package/lib/typescript/commonjs/formatters/date.d.ts +13 -13
  130. package/lib/typescript/commonjs/formatters/dateMath.d.ts +4 -2
  131. package/lib/typescript/commonjs/formatters/formatConfig.d.ts +48 -0
  132. package/lib/typescript/commonjs/formatters/house.d.ts +143 -0
  133. package/lib/typescript/commonjs/formatters/index.d.ts +4 -0
  134. package/lib/typescript/commonjs/formatters/number.d.ts +15 -5
  135. package/lib/typescript/commonjs/index.d.ts +21 -8
  136. package/lib/typescript/commonjs/initSDK.d.ts +18 -6
  137. package/lib/typescript/commonjs/initUserAuth.d.ts +29 -0
  138. package/lib/typescript/commonjs/logger/index.d.ts +17 -0
  139. package/lib/typescript/commonjs/query/apiBaseQuery.d.ts +55 -0
  140. package/lib/typescript/commonjs/query/createAppApi.d.ts +21 -0
  141. package/lib/typescript/commonjs/query/index.d.ts +9 -0
  142. package/lib/typescript/commonjs/query/listeners.d.ts +11 -0
  143. package/lib/typescript/commonjs/query/paging.d.ts +42 -0
  144. package/lib/typescript/commonjs/query/tags.d.ts +31 -0
  145. package/lib/typescript/commonjs/redux/errorToastMiddleware.d.ts +51 -0
  146. package/lib/typescript/commonjs/redux/index.d.ts +6 -0
  147. package/lib/typescript/commonjs/redux/rootReducer.d.ts +19 -0
  148. package/lib/typescript/commonjs/redux/serializableCheck.d.ts +14 -0
  149. package/lib/typescript/commonjs/versionCheck/buildNumber.d.ts +14 -0
  150. package/lib/typescript/commonjs/versionCheck/index.d.ts +28 -17
  151. package/lib/typescript/module/api/clientHeaders.d.ts +25 -0
  152. package/lib/typescript/module/api/minAppVersion.d.ts +24 -0
  153. package/lib/typescript/module/api/requestDefaults.d.ts +21 -0
  154. package/lib/typescript/module/api/retry.d.ts +23 -9
  155. package/lib/typescript/module/api/tokenRefresh.d.ts +14 -2
  156. package/lib/typescript/module/api/userClient.d.ts +1 -1
  157. package/lib/typescript/module/auth/authStore.d.ts +76 -0
  158. package/lib/typescript/module/auth/index.d.ts +2 -2
  159. package/lib/typescript/module/config/index.d.ts +31 -2
  160. package/lib/typescript/module/errors/extractApiError.d.ts +69 -0
  161. package/lib/typescript/module/errors/index.d.ts +3 -0
  162. package/lib/typescript/module/formatters/currency.d.ts +22 -7
  163. package/lib/typescript/module/formatters/date.d.ts +13 -13
  164. package/lib/typescript/module/formatters/dateMath.d.ts +4 -2
  165. package/lib/typescript/module/formatters/formatConfig.d.ts +48 -0
  166. package/lib/typescript/module/formatters/house.d.ts +143 -0
  167. package/lib/typescript/module/formatters/index.d.ts +4 -0
  168. package/lib/typescript/module/formatters/number.d.ts +15 -5
  169. package/lib/typescript/module/index.d.ts +21 -8
  170. package/lib/typescript/module/initSDK.d.ts +18 -6
  171. package/lib/typescript/module/initUserAuth.d.ts +29 -0
  172. package/lib/typescript/module/logger/index.d.ts +17 -0
  173. package/lib/typescript/module/query/apiBaseQuery.d.ts +55 -0
  174. package/lib/typescript/module/query/createAppApi.d.ts +21 -0
  175. package/lib/typescript/module/query/index.d.ts +9 -0
  176. package/lib/typescript/module/query/listeners.d.ts +11 -0
  177. package/lib/typescript/module/query/paging.d.ts +42 -0
  178. package/lib/typescript/module/query/tags.d.ts +31 -0
  179. package/lib/typescript/module/redux/errorToastMiddleware.d.ts +51 -0
  180. package/lib/typescript/module/redux/index.d.ts +6 -0
  181. package/lib/typescript/module/redux/rootReducer.d.ts +19 -0
  182. package/lib/typescript/module/redux/serializableCheck.d.ts +14 -0
  183. package/lib/typescript/module/versionCheck/buildNumber.d.ts +14 -0
  184. package/lib/typescript/module/versionCheck/index.d.ts +28 -17
  185. package/package.json +30 -2
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.useVersionCheck=exports.setDeviceInfoImplementation=exports.default=exports.VersionCheck=void 0;var Application=_interopRequireWildcard(require("expo-application")),_react=require("react"),_index=require("../config/index.js"),_index2=require("../logger/index.js");function _interopRequireWildcard(e,r){if("function"==typeof WeakMap)var n=new WeakMap,t=new WeakMap;return(_interopRequireWildcard=function(e,r){if(!r&&e&&e.__esModule)return e;var o,i,a={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return a;if(o=r?t:n){if(o.has(e))return o.get(e);o.set(e,a)}for(const r in e)"default"!==r&&{}.hasOwnProperty.call(e,r)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,r))&&(i.get||i.set)?o(a,r,i):a[r]=e[r]);return a})(e,r)}const expoApplicationBackend={getBundleId:()=>Application.applicationId??"",getVersion:()=>Application.nativeApplicationVersion??""};let deviceInfo=null;const setDeviceInfoImplementation=e=>{deviceInfo=e};exports.setDeviceInfoImplementation=setDeviceInfoImplementation;const missing=(e,r)=>{const n=new Error(`[VersionCheck] the app's ${e} is not available. Call setConfig({ ${r}: '...' }) — every Webority app already has this value in appsettings.Compiled.json — or setDeviceInfoImplementation() with a native provider.`);return _index2.Logger.error(n.message),n},getSystemName=()=>{const{Platform:e}=require("react-native");return e.OS},getBundleId=()=>{const e=(0,_index.getConfigValue)("appId");if(e)return e;const r=(deviceInfo??expoApplicationBackend).getBundleId();if(r)return r;throw missing("store identifier","appId")},getVersion=()=>{const e=(0,_index.getConfigValue)("appVersion");if(e)return e;const r=(deviceInfo??expoApplicationBackend).getVersion();if(r)return r;throw missing("version","appVersion")},MAX_RETRIES=3,RETRY_DELAY=3e3,getCountry=()=>(0,_index.getConfigValue)("country","in").toLowerCase(),parseVersion=e=>{_index2.Logger.info(`Parsing version: ${e}`);const r=e.replace(/[^0-9.]/g,"").split(".").map(Number);return{major:r[0]||0,minor:r[1]||0,patch:r[2]||0,prerelease:e.includes("-")?e.split("-")[1]??"":""}},diffLoose=(e,r)=>{if(_index2.Logger.info(`Comparing versions: ${e} and ${r}`),e===r)return null;const n=parseVersion(e),t=parseVersion(r);return n.major<t.major?"major":n.major>t.major?null:n.minor<t.minor?"minor":n.minor>t.minor?null:n.patch<t.patch?"patch":n.patch>t.patch?null:n.prerelease&&!t.prerelease?"prerelease":!n.prerelease&&t.prerelease?null:n.prerelease<t.prerelease?"prerelease":(n.prerelease,t.prerelease,null)},versionCompare=(e,r)=>{if(_index2.Logger.info(`Comparing current version: ${e} with latest version: ${r}`),!r)return{needsUpdate:!1,updateType:null,notice:"Error: could not get latest version"};try{const n=diffLoose(e,r);return{needsUpdate:!!n,updateType:n}}catch(n){const t=n instanceof Error?n.message:String(n);_index2.Logger.error(`Error comparing versions: ${t}`);const o=e!==r&&r>e;return{needsUpdate:o,updateType:o?"minor":null,notice:t.replace(/^Invalid Version:/,"Not a valid version:")}}},fetchAndroidVersion=async e=>{let r;_index2.Logger.info(`Fetching Android version from URL: ${e}`);try{r=await fetch(e,{headers:{"User-Agent":"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36","sec-fetch-site":"same-origin"}})}catch(e){const r=e instanceof Error?e.message:String(e);throw _index2.Logger.error(`Error fetching data from Google Play Store: ${r}`),new Error("Error fetching data from Google Play Store.")}if(!r.ok){if(404===r.status)throw _index2.Logger.error("App with app ID not found in Google Play."),new Error("App with app ID not found in Google Play.");throw _index2.Logger.error(`Error fetching data: ${r.statusText}`),new Error(r.statusText)}const n=await r.text();let t=n.match(/\[\[\[['"]((\d+\.)+\d+)['"]\]\],/);if(t||(t=n.match(/Current Version[^\d]+((\d+\.)+\d+)/i)),t||(t=n.match(/itemprop="softwareVersion"[^>]*>((\d+\.)+\d+)</i)),!t){const e=n.match(/(\d+\.\d+(\.\d+)?)/g);t=e&&e.length>0?[null,e[0]]:null}const o=t?t[1]??null:null;o||_index2.Logger.warn("Could not extract version from Play Store. Using fallback method.");const i=n.match(/<div itemprop="description">(.*?)<\/div>/),a=i?i[1]??"":"";return{version:o,releasedAt:(new Date).toISOString(),notes:a,url:e,lastChecked:(new Date).toISOString()}},fetchIosVersion=async e=>{let r;_index2.Logger.info(`Fetching iOS version from URL: ${e}`);try{r=await fetch(e)}catch{throw _index2.Logger.error("Error connecting to iTunes."),new Error("Error connecting to iTunes.")}const n=await r.json();if(!n||!("results"in n))throw _index2.Logger.error("Unknown error connecting to iTunes."),new Error("Unknown error connecting to iTunes.");if(!n.results.length)throw _index2.Logger.error("App for this bundle ID not found."),new Error("App for this bundle ID not found.");const t=n.results[0];return{version:t.version||null,released:t.currentVersionReleaseDate||t.releaseDate||null,notes:t.releaseNotes||"",url:t.trackViewUrl||t.artistViewUrl||t.sellerUrl||null,country:getCountry(),lastChecked:(new Date).toISOString()}},lookupVersion=async(e,r)=>{_index2.Logger.info(`Looking up version for platform: ${e}, identifier: ${r}`);const n=getCountry(),t="ios"===e?`https://itunes.apple.com/lookup?bundleId=${r}&country=${n}&_=${(new Date).valueOf()}`:`https://play.google.com/store/apps/details?id=${r}&hl=${n}`;return"ios"===e?fetchIosVersion(t):fetchAndroidVersion(t)},checkForUpdates=async()=>{const e=getSystemName().toLowerCase(),r=getBundleId(),n=getVersion();let t=0,o=null;for(;t<=3;)try{_index2.Logger.info(`Checking if new version is available (attempt ${t+1}/4)`),_index2.Logger.info(`Platform: ${e}, identifier: ${r}, current version: ${n}`);const o=await lookupVersion(e,r),i=versionCompare(n,o.version);return{isNewVersionAvailable:i.needsUpdate,updateType:i.updateType,url:o.url}}catch(e){o=e;const r=e instanceof Error?e.message:String(e);if(_index2.Logger.error(`Error checking version (attempt ${t+1}/4): ${r}`),3===t)throw e;t++,_index2.Logger.info("Retrying version check in 3000ms..."),await new Promise(e=>setTimeout(e,3e3))}throw o instanceof Error?o:new Error("Failed to check for updates after multiple attempts")},getFallbackStoreUrl=()=>{const e=getSystemName().toLowerCase(),r=getBundleId(),n=getCountry();return"ios"===e?`https://apps.apple.com/${n}/app/${r}`:`https://play.google.com/store/apps/details?id=${r}&hl=${n}`},VersionCheck=exports.VersionCheck={isNewVersionAvailable:async()=>checkForUpdates(),openUpdateUrl:async e=>{const{Linking:r}=require("react-native");try{if(e)_index2.Logger.info(`Opening app store URL: ${e}`),await r.openURL(e);else{const e=getFallbackStoreUrl();_index2.Logger.info(`Opening fallback store URL: ${e}`),await r.openURL(e)}return!0}catch(n){const t=n instanceof Error?n.message:String(n);_index2.Logger.error(`Failed to open store URL: ${t}`);try{if(e){const e=getFallbackStoreUrl();return _index2.Logger.info(`Trying fallback store URL: ${e}`),await r.openURL(e),!0}}catch(e){const r=e instanceof Error?e.message:String(e);_index2.Logger.error(`Failed to open fallback URL: ${r}`)}return!1}},getFallbackStoreUrl:getFallbackStoreUrl},useVersionCheck=(e,r=(0,_index.getConfigValue)("environment","Development"))=>{const[n,t]=(0,_react.useState)({isUpdateRequired:!1,updateUrl:null});return(0,_react.useEffect)(()=>{let n=!0;return e&&"Production"===r&&(async()=>{try{const{isNewVersionAvailable:e,url:r}=await VersionCheck.isNewVersionAvailable();e&&n?(_index2.Logger.info("Update required. URL:",r||"Not available yet"),t({isUpdateRequired:!0,updateUrl:r})):n&&_index2.Logger.info("App is up to date")}catch(e){_index2.Logger.error("Error checking app version:",e)}})(),()=>{n=!1}},[e,r]),n};exports.useVersionCheck=useVersionCheck;var _default=exports.default=VersionCheck;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.VersionCheck=void 0,Object.defineProperty(exports,"isBuildBelowMinimum",{enumerable:!0,get:function(){return _buildNumber.isBuildBelowMinimum}}),Object.defineProperty(exports,"parseBuildNumber",{enumerable:!0,get:function(){return _buildNumber.parseBuildNumber}}),exports.useVersionCheck=exports.setDeviceInfoImplementation=void 0;var Application=_interopRequireWildcard(require("expo-application")),_react=require("react"),_minAppVersion=require("../api/minAppVersion.js"),_index=require("../config/index.js"),_index2=require("../logger/index.js"),_buildNumber=require("./buildNumber.js");function _interopRequireWildcard(e,r){if("function"==typeof WeakMap)var i=new WeakMap,t=new WeakMap;return(_interopRequireWildcard=function(e,r){if(!r&&e&&e.__esModule)return e;var n,o,l={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return l;if(n=r?t:i){if(n.has(e))return n.get(e);n.set(e,l)}for(const r in e)"default"!==r&&{}.hasOwnProperty.call(e,r)&&((o=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,r))&&(o.get||o.set)?n(l,r,o):l[r]=e[r]);return l})(e,r)}const expoApplicationBackend={getBundleId:()=>Application.applicationId??"",getVersion:()=>Application.nativeApplicationVersion??"",getBuildNumber:()=>Application.nativeBuildVersion??""};let deviceInfo=null;const setDeviceInfoImplementation=e=>{deviceInfo=e};exports.setDeviceInfoImplementation=setDeviceInfoImplementation;const missing=(e,r)=>{const i=new Error(`[VersionCheck] the app's ${e} is not available. Call setConfig({ ${r}: ... }) — every Webority app already has this value in appsettings.Compiled.json — or setDeviceInfoImplementation() with a native provider.`);return _index2.Logger.error(i.message),i},getSystemName=()=>{const{Platform:e}=require("react-native");return e.OS},getBundleId=()=>{const e=(0,_index.getConfigValue)("appId");if(e)return e;const r=(deviceInfo??expoApplicationBackend).getBundleId();if(r)return r;throw missing("store identifier","appId")},getBuildNumber=()=>{const e=(0,_buildNumber.parseBuildNumber)((0,_index.getConfigValue)("appBuild"));if(null!==e)return e;const r=(0,_buildNumber.parseBuildNumber)(deviceInfo?.getBuildNumber?.()??expoApplicationBackend.getBuildNumber());if(null!==r)return r;throw missing("build number","appBuild")},getCountry=()=>(0,_index.getConfigValue)("country","in").toLowerCase(),subscribeMinimum=e=>(0,_minAppVersion.addMinAppVersionListener)(()=>e()),getFallbackStoreUrl=()=>{const e=getSystemName().toLowerCase(),r=getCountry();if("ios"===e){const e=(0,_index.getConfigValue)("appStoreId");return e?`https://apps.apple.com/${r}/app/id${e}`:`https://apps.apple.com/${r}/app/${getBundleId()}`}return`https://play.google.com/store/apps/details?id=${getBundleId()}&hl=${r}`},storeUrlOrNull=()=>{try{return getFallbackStoreUrl()}catch{return null}},checkForUpdates=()=>{const e=(0,_buildNumber.isBuildBelowMinimum)(getBuildNumber(),(0,_minAppVersion.getMinAppVersion)());return{isNewVersionAvailable:e,updateType:e?"major":null,url:e?storeUrlOrNull():null}},VersionCheck=exports.VersionCheck={isNewVersionAvailable:async()=>checkForUpdates(),openUpdateUrl:async e=>{const{Linking:r}=require("react-native");try{if(e)_index2.Logger.info(`Opening app store URL: ${e}`),await r.openURL(e);else{const e=getFallbackStoreUrl();_index2.Logger.info(`Opening fallback store URL: ${e}`),await r.openURL(e)}return!0}catch(i){const t=i instanceof Error?i.message:String(i);_index2.Logger.error(`Failed to open store URL: ${t}`);try{if(e){const e=getFallbackStoreUrl();return _index2.Logger.info(`Trying fallback store URL: ${e}`),await r.openURL(e),!0}}catch(e){const r=e instanceof Error?e.message:String(e);_index2.Logger.error(`Failed to open fallback URL: ${r}`)}return!1}},getFallbackStoreUrl:getFallbackStoreUrl},NOT_REQUIRED={isUpdateRequired:!1,updateUrl:null},useVersionCheck=(e,r=(0,_index.getConfigValue)("environment","Development"))=>{const i=(0,_react.useSyncExternalStore)(subscribeMinimum,_minAppVersion.getMinAppVersion,_minAppVersion.getMinAppVersion);return(0,_react.useMemo)(()=>{if(!e||"Production"!==r||null===i)return NOT_REQUIRED;try{if(!(0,_buildNumber.isBuildBelowMinimum)(getBuildNumber(),i))return NOT_REQUIRED}catch{return NOT_REQUIRED}return{isUpdateRequired:!0,updateUrl:storeUrlOrNull()}},[e,r,i])};exports.useVersionCheck=useVersionCheck;var _default=exports.default=VersionCheck;
@@ -1 +1 @@
1
- import{getConfigValue as e}from"../config/index.js";export const applyConfiguredBaseUrl=r=>{r.interceptors.request.use(r=>(r.baseURL||(r.baseURL=e("baseUrl")??void 0),r))};
1
+ "use strict";import{getConfigValue}from"../config/index.js";export const applyConfiguredBaseUrl=e=>{e.interceptors.request.use(e=>(e.baseURL||(e.baseURL=getConfigValue("baseUrl")??void 0),e))};
@@ -0,0 +1 @@
1
+ "use strict";import{getConfigValue}from"../config/index.js";export const CLIENT_BUILD_HEADER="X-Client-Build";export const CLIENT_KIND_HEADER="X-Client-Kind";export const ACCOUNT_ID_HEADER="X-Account-Id";export const CLIENT_KIND="MobileApp";export const getClientBuild=()=>{const t=getConfigValue("appVersion");if(!t)return null;const e=getConfigValue("commit");return e?`${t}+${e}`:t};const setIfAbsent=(t,e,n)=>{n&&!t.has(e)&&t.set(e,n)};export const applyClientHeaders=t=>{t.interceptors.request.use(t=>(setIfAbsent(t.headers,"X-Client-Kind","MobileApp"),setIfAbsent(t.headers,"X-Client-Build",getClientBuild()),t))};export const applyAccountIdHeader=async(t,e)=>{const n=e?await e():null;n&&t.set("X-Account-Id",n)};
@@ -1 +1 @@
1
- import{Logger as t}from"../logger/index.js";const e=new Set(["authorization","proxy-authorization","cookie","set-cookie","x-api-key","x-auth-token","x-access-token","x-refresh-token","api-key"]),r=/pass(word|code)|secret|token|otp|pin|cvv|authoriz/i,o=new Set(["common","delete","get","head","post","put","patch"]),a="<redacted>",redactBody=(t,e,o=0)=>{if(null===t||"object"!=typeof t)return t;if(e.has(t))return"<circular>";if(o>6)return"<truncated>";if(e.add(t),Array.isArray(t))return t.map(t=>redactBody(t,e,o+1));const n={};for(const[i,c]of Object.entries(t))n[i]=r.test(i)?a:redactBody(c,e,o+1);return n};export const buildCurl=t=>{let r=`curl -X ${(t.method??"get").toUpperCase()} "${(t=>{const e=t.url??"",r=t.baseURL?t.baseURL.replace(/\/$/,""):"";let o=e.startsWith("http")?e:`${r}/${e.replace(/^\//,"")}`;if(t.params){const e=new URLSearchParams(t.params).toString();e&&(o+=(o.includes("?")?"&":"?")+e)}return o})(t)}"`;const n=t.headers;if(n)for(const[t,i]of Object.entries(n)){if(o.has(t))continue;if("string"!=typeof i&&"number"!=typeof i)continue;const n=e.has(t.toLowerCase())?a:i;r+=` -H "${t}: ${n}"`}if(void 0!==t.data&&null!==t.data){const e="object"==typeof t.data?redactBody(t.data,new WeakSet):t.data;r+=` -d '${("object"==typeof e?JSON.stringify(e):String(e)).replace(/'/g,"'\\''")}'`}return r};export const logCurl=e=>{try{t.info("CURL Command:",buildCurl(e))}catch(e){t.warn("[api] Failed to build a curl command for the request",e)}};
1
+ "use strict";import{Logger}from"../logger/index.js";const SECRET_HEADERS=new Set(["authorization","proxy-authorization","cookie","set-cookie","x-api-key","x-auth-token","x-access-token","x-refresh-token","api-key"]),SECRET_BODY_PATTERN=/pass(word|code)|secret|token|otp|pin|cvv|authoriz/i,AXIOS_METHOD_KEYS=new Set(["common","delete","get","head","post","put","patch"]),REDACTED="<redacted>",redactBody=(t,e,r=0)=>{if(null===t||"object"!=typeof t)return t;if(e.has(t))return"<circular>";if(r>6)return"<truncated>";if(e.add(t),Array.isArray(t))return t.map(t=>redactBody(t,e,r+1));const o={};for(const[a,n]of Object.entries(t))o[a]=SECRET_BODY_PATTERN.test(a)?REDACTED:redactBody(n,e,r+1);return o},buildUrl=t=>{const e=t.url??"",r=t.baseURL?t.baseURL.replace(/\/$/,""):"";let o=e.startsWith("http")?e:`${r}/${e.replace(/^\//,"")}`;if(t.params){const e=new URLSearchParams(t.params).toString();e&&(o+=(o.includes("?")?"&":"?")+e)}return o};export const buildCurl=t=>{let e=`curl -X ${(t.method??"get").toUpperCase()} "${buildUrl(t)}"`;const r=t.headers;if(r)for(const[t,o]of Object.entries(r)){if(AXIOS_METHOD_KEYS.has(t))continue;if("string"!=typeof o&&"number"!=typeof o)continue;const r=SECRET_HEADERS.has(t.toLowerCase())?REDACTED:o;e+=` -H "${t}: ${r}"`}if(void 0!==t.data&&null!==t.data){const r="object"==typeof t.data?redactBody(t.data,new WeakSet):t.data;e+=` -d '${("object"==typeof r?JSON.stringify(r):String(r)).replace(/'/g,"'\\''")}'`}return e};export const logCurl=t=>{try{Logger.info("CURL Command:",buildCurl(t))}catch(t){Logger.warn("[api] Failed to build a curl command for the request",t)}};
@@ -0,0 +1 @@
1
+ "use strict";import{Logger}from"../logger/index.js";export const MIN_APP_VERSION_HEADER="X-Min-App-Version";let current=null;const listeners=new Set;export const getMinAppVersion=()=>current;export const addMinAppVersionListener=e=>(listeners.add(e),null!==current&&e(current),()=>{listeners.delete(e)});const readHeader=e=>{if(!e||"object"!=typeof e)return;const r=e.get;return"function"==typeof r?r.call(e,"X-Min-App-Version"):e["X-Min-App-Version".toLowerCase()]},record=e=>{const r=readHeader(e?.headers);if(null==r||""===r)return;const n=String(r).trim();if(!/^\d+$/.test(n))return void Logger.warn(`[minAppVersion] ignored a non-integer X-Min-App-Version: ${n}`);const t=Number.parseInt(n,10);if(t!==current){current=t;for(const e of[...listeners])try{e(t)}catch(e){Logger.error("[minAppVersion] a listener threw",e)}}};export const readMinAppVersion=e=>{e.interceptors.response.use(e=>(record(e),e),e=>(record(e?.response),Promise.reject(e)))};
@@ -1 +1 @@
1
- export const sendFormDataAsMultipart=e=>{e.interceptors.request.use(e=>("undefined"!=typeof FormData&&e.data instanceof FormData&&e.headers?.delete?.("Content-Type"),e))};
1
+ "use strict";export const sendFormDataAsMultipart=e=>{e.interceptors.request.use(e=>("undefined"!=typeof FormData&&e.data instanceof FormData&&e.headers?.delete?.("Content-Type"),e))};
@@ -1 +1 @@
1
- import r from"axios";import{getConfigValue as e}from"../config/index.js";import{Logger as o}from"../logger/index.js";import"../types/axios.js";import{applyConfiguredBaseUrl as s}from"./baseUrl.js";import{logCurl as t}from"./curl.js";import{sendFormDataAsMultipart as n}from"./multipart.js";import{responseBodyText as i}from"./responseBodyText.js";import{attachRetry as p}from"./retry.js";const m=r.create({headers:{"Content-Type":"application/json",Accept:"application/json"},timeout:3e4});s(m),n(m),p(m),m.interceptors.request.use(r=>(o.info(`Request: ${r.method?.toUpperCase()} ${r.url}`),e("logCurl")&&t(r),r),r=>{const e=r instanceof Error?r.message:String(r);return o.error("Request error:",e),Promise.reject(r)}),m.interceptors.response.use(r=>(o.info(`Response: ${r.status} from ${r.config.url}`),r),e=>{if(r.isAxiosError(e)){const r=e.config;if(r?.skipErrorLog)return Promise.reject(e);e.response?o.error(`Response error: ${i(e.response.data,e.message)}, URL: ${r?.url}, Status: ${e.response.status}`):o.error(`Network error or no response from server: ${e.message}, URL: ${r?.url}`)}else{const r=e instanceof Error?e.message:String(e);o.error(`Unknown response error: ${r}`)}return Promise.reject(e)});export default m;
1
+ "use strict";import axios from"axios";import{getConfigValue}from"../config/index.js";import{Logger}from"../logger/index.js";import"../types/axios.js";import{applyConfiguredBaseUrl}from"./baseUrl.js";import{applyClientHeaders}from"./clientHeaders.js";import{logCurl}from"./curl.js";import{readMinAppVersion}from"./minAppVersion.js";import{sendFormDataAsMultipart}from"./multipart.js";import{applyRequestDefaults}from"./requestDefaults.js";import{responseBodyText}from"./responseBodyText.js";import{attachRetry}from"./retry.js";const publicClient=axios.create({headers:{"Content-Type":"application/json",Accept:"application/json"}});applyConfiguredBaseUrl(publicClient),applyRequestDefaults(publicClient),sendFormDataAsMultipart(publicClient),readMinAppVersion(publicClient),attachRetry(publicClient),publicClient.interceptors.request.use(e=>(Logger.info(`Request: ${e.method?.toUpperCase()} ${e.url}`),getConfigValue("logCurl")&&logCurl(e),e),e=>{const r=e instanceof Error?e.message:String(e);return Logger.error("Request error:",r),Promise.reject(e)}),applyClientHeaders(publicClient),publicClient.interceptors.response.use(e=>(Logger.info(`Response: ${e.status} from ${e.config.url}`),e),e=>{if(axios.isAxiosError(e)){const r=e.config;if(r?.skipErrorLog)return Promise.reject(e);e.response?Logger.error(`Response error: ${responseBodyText(e.response.data,e.message)}, URL: ${r?.url}, Status: ${e.response.status}`):Logger.error(`Network error or no response from server: ${e.message}, URL: ${r?.url}`)}else{const r=e instanceof Error?e.message:String(e);Logger.error(`Unknown response error: ${r}`)}return Promise.reject(e)});export default publicClient;
@@ -0,0 +1 @@
1
+ "use strict";import{getConfigValue}from"../config/index.js";export const newCorrelationId=()=>{const e=globalThis.crypto;if("function"==typeof e?.randomUUID)return e.randomUUID();const t=new Uint8Array(16);if("function"==typeof e?.getRandomValues)e.getRandomValues(t);else for(let e=0;e<t.length;e+=1)t[e]=Math.floor(256*Math.random());t[6]=15&(t[6]??0)|64,t[8]=63&(t[8]??0)|128;const o=Array.from(t,e=>e.toString(16).padStart(2,"0")).join("");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`};export const applyRequestDefaults=e=>{e.defaults.timeout=void 0,e.interceptors.request.use(e=>{void 0===e.timeout&&(e.timeout=getConfigValue("timeoutMs"));const t=getConfigValue("correlationIdHeader");return t&&!e.headers.has(t)&&e.headers.set(t,newCorrelationId()),e})};
@@ -1 +1 @@
1
- export const responseBodyText=(e,n)=>{if(null==e||""===e)return n;if(e instanceof ArrayBuffer)return`binary response (${e.byteLength} bytes)`;if("undefined"!=typeof Blob&&e instanceof Blob)return`binary response (${e.size} bytes)`;const r="string"==typeof e?e:JSON.stringify(e);return r.length>500?`${r.slice(0,500)}...`:r};
1
+ "use strict";const MAX_LENGTH=500;export const responseBodyText=(e,n)=>{if(null==e||""===e)return n;if(e instanceof ArrayBuffer)return`binary response (${e.byteLength} bytes)`;if("undefined"!=typeof Blob&&e instanceof Blob)return`binary response (${e.size} bytes)`;const t="string"==typeof e?e:JSON.stringify(e);return t.length>500?`${t.slice(0,500)}...`:t};
@@ -1 +1 @@
1
- export const isRetryableStatus=e=>"number"==typeof e&&(429===e||e>=500&&e<=599);const e=new Set(["get","head","options","put","delete"]),t={retries:3,retryDelayMs:e=>e<=1?0:2**e*1e3,shouldRetry:t=>{const r=t.response?.status;if(!isRetryableStatus(r))return!1;const s=(t.config?.method??"get").toLowerCase();return e.has(s)||429===r||503===r},onRetry:()=>{}};export const attachRetry=(e,r={})=>{e.interceptors.response.use(void 0,async s=>{const o=s,n=o?.config;if(!n||!1===n.retry)return Promise.reject(s);const i="object"==typeof n.retry?n.retry:{},a={...t,...r,...i},c=(n.__retryAttempt??0)+1;if(c>a.retries||!a.shouldRetry(o))return Promise.reject(s);if(n.signal?.aborted)return Promise.reject(s);n.__retryAttempt=c,n.transformRequest=[e=>e],a.onRetry(c,o);var y,u;return await(y=a.retryDelayMs(c),u=n.signal,new Promise(e=>{const onAbort=()=>{clearTimeout(t),e(!1)},t=setTimeout(()=>{u?.removeEventListener?.("abort",onAbort),e(!0)},y);u?.addEventListener?.("abort",onAbort,{once:!0})}))?e.request(n):Promise.reject(s)})};
1
+ "use strict";import axios from"axios";import{getConfigValue}from"../config/index.js";export const IDEMPOTENCY_KEY_HEADER="Idempotency-Key";export const isRetryableStatus=e=>"number"==typeof e&&(429===e||e>=500&&e<=599);const IDEMPOTENT_METHODS=new Set(["get","head","options","put","delete"]),NEVER_SENT_CODES=new Set(["ECONNREFUSED","ENOTFOUND","EAI_AGAIN","ENETUNREACH","EHOSTUNREACH"]);export const isNeverSentError=e=>!e.response&&"string"==typeof e.code&&NEVER_SENT_CODES.has(e.code);const MAX_RETRY_AFTER_MS=3e4;export const retryAfterMs=e=>{const t=e.response;if(!t)return null;const r=t.data,o=t.headers,s="function"==typeof o?.get?o.get("retry-after"):o?.["retry-after"];for(const e of[r?.retryAfterSeconds,s]){const t=Number(e);if(null!=e&&Number.isFinite(t)&&t>0)return 1e3*t}return null};const hasIdempotencyKey=e=>{const t=e?.headers,r="function"==typeof t?.get?t.get("Idempotency-Key"):t?.["Idempotency-Key"];return"string"==typeof r&&""!==r};export const isRetryableFailure=e=>{if(axios.isCancel(e)||"ERR_CANCELED"===e.code)return!1;if(isNeverSentError(e))return!0;const t=(e.config?.method??"get").toLowerCase(),r=IDEMPOTENT_METHODS.has(t),o=e.response?.status;if(void 0===o)return r;if(!isRetryableStatus(o))return!1;const s=retryAfterMs(e);return!(null!==s&&s>3e4)&&(r||(429===o||503===o)&&hasIdempotencyKey(e.config))};const DEFAULT_POLICY={retryDelayMs:e=>e<=1?0:2**e*1e3,shouldRetry:isRetryableFailure,onRetry:()=>{}},waitOrAbort=(e,t)=>new Promise(r=>{const onAbort=()=>{clearTimeout(o),r(!1)},o=setTimeout(()=>{t?.removeEventListener?.("abort",onAbort),r(!0)},e);t?.addEventListener?.("abort",onAbort,{once:!0})});export const attachRetry=(e,t={})=>{e.interceptors.response.use(void 0,async r=>{const o=r,s=o?.config;if(!s||!1===s.retry)return Promise.reject(r);const n="object"==typeof s.retry?s.retry:{},i={...DEFAULT_POLICY,retries:getConfigValue("retries"),...t,...n},c=(s.__retryAttempt??0)+1;if(c>i.retries||!i.shouldRetry(o))return Promise.reject(r);if(s.signal?.aborted)return Promise.reject(r);s.__retryAttempt=c,s.transformRequest=[e=>e],i.onRetry(c,o);const a=retryAfterMs(o)??i.retryDelayMs(c);return await waitOrAbort(a,s.signal)?e.request(s):Promise.reject(r)})};
@@ -1 +1 @@
1
- import e from"axios";import{ACCESS_TOKEN_KEY as r,getToken as o,REFRESH_TOKEN_KEY as s,storeToken as t}from"../auth/authStore.js";import{Logger as n}from"../logger/index.js";import i from"./publicClient.js";let a,c;export const injectStore=e=>{a=e};export const injectUserAuth=e=>{c=e};let h=null,p=[];const processQueue=(e,r=null)=>{p.forEach(({resolve:o,reject:s})=>{e?s(e):null!==r&&o(r)}),p=[]};export const resetRefreshState=()=>{h=null,processQueue(new Error("[@webority/mobile-core] Session ended"))};export const getErrorMessage=e=>e instanceof Error?e.message:"string"==typeof e?e:"Unknown error";const requireAuth=()=>{if(!a||!c)throw new Error("User package store is not initialized. Call initUserAuth first.");return{store:a,auth:c}};export const getRefreshPath=()=>c?.refresh.path;export const dispatchLogout=async()=>{const e=requireAuth();await e.store.dispatch(e.auth.logout())};export const isRefreshInFlight=()=>null!==h;export const queueBehindRefresh=()=>new Promise((e,r)=>{p.push({resolve:e,reject:r})});class SessionEndedError extends Error{constructor(e){super(e),this.name="SessionEndedError",Object.setPrototypeOf(this,SessionEndedError.prototype)}}const asString=(e,r)=>{if("string"!=typeof e||""===e)throw new Error(`The refresh response has no "${r}".`);return e},readWeborityTokens=e=>{const r=e??{};return{accessToken:asString(r.accessToken,"accessToken"),accessTokenExpiry:asString(r.accessTokenExpiration,"accessTokenExpiration"),refreshToken:asString(r.refreshToken,"refreshToken"),refreshTokenExpiry:asString(r.refreshTokenExpiration,"refreshTokenExpiration")}},callRefreshEndpoint=async e=>{const a=await o(s);if(!a?.token)throw new SessionEndedError("No refresh token available");if(Date.parse(a.expiry)<=Date.now())throw new SessionEndedError("Refresh token expired");const c=await o(r),h={accessToken:c?.token??null,refreshToken:a.token},p=e.body?await e.body(h):h;n.info("Refreshing the access token");const{data:f}=await i.post(e.path,p),l=(e.readTokens??readWeborityTokens)(f);return await t(r,l.accessToken,l.accessTokenExpiry),await t(s,l.refreshToken,l.refreshTokenExpiry),n.info("Access token refreshed"),l.accessToken};export const refreshAccessToken=()=>{if(h)return h;const r=(async()=>{try{const e=await callRefreshEndpoint(requireAuth().auth.refresh);return processQueue(null,e),e}catch(r){const o=e.isAxiosError(r)?r.response?.data:void 0;throw n.error("Token refresh failed:",o??getErrorMessage(r)),processQueue(r,null),(r=>r instanceof SessionEndedError||e.isAxiosError(r)&&(400===r.response?.status||401===r.response?.status))(r)&&await dispatchLogout(),r}})().finally(()=>{h===r&&(h=null)});return h=r,r};
1
+ "use strict";import axios from"axios";import{ACCESS_TOKEN_KEY,clearSession,getToken,REFRESH_TOKEN_KEY,storeToken}from"../auth/authStore.js";import{Logger}from"../logger/index.js";import publicClient from"./publicClient.js";let store,auth;export const injectStore=e=>{store=e};export const injectUserAuth=e=>{auth=e};let refreshTokenPromise=null,failedQueue=[];const processQueue=(e,r=null)=>{failedQueue.forEach(({resolve:o,reject:s})=>{e?s(e):null!==r&&o(r)}),failedQueue=[]};export const resetRefreshState=()=>{refreshTokenPromise=null,processQueue(new Error("[@webority/mobile-core] Session ended"))};export const getErrorMessage=e=>e instanceof Error?e.message:"string"==typeof e?e:"Unknown error";const requireAuth=()=>{if(!store||!auth)throw new Error("User package store is not initialized. Call initUserAuth first.");return{store:store,auth:auth}};export const getAccountIdProvider=()=>auth?.accountId;export const getRefreshPath=()=>auth?.refresh.path;export const dispatchLogout=async()=>{const e=requireAuth();await e.store.dispatch(e.auth.logout())};export const SIGN_OUT_REASON_HEADER="X-Sign-Out-Reason";export const readSignOutReason=e=>{const r=void 0===auth?.signOutReasonHeader?"X-Sign-Out-Reason":auth.signOutReasonHeader;if(!r||!e||"object"!=typeof e)return null;const o=e.get,s="function"==typeof o?o.call(e,r):e[r.toLowerCase()];return"string"==typeof s&&""!==s.trim()?s.trim():null};export const endSessionAndLogout=async(e,r)=>{await clearSession(e,{signOutReason:r}),await dispatchLogout()};export const isRefreshInFlight=()=>null!==refreshTokenPromise;export const queueBehindRefresh=()=>new Promise((e,r)=>{failedQueue.push({resolve:e,reject:r})});class SessionEndedError extends Error{constructor(e){super(e),this.name="SessionEndedError",Object.setPrototypeOf(this,SessionEndedError.prototype)}}const endsSession=e=>e instanceof SessionEndedError||axios.isAxiosError(e)&&(400===e.response?.status||401===e.response?.status),asString=(e,r)=>{if("string"!=typeof e||""===e)throw new Error(`The refresh response has no "${r}".`);return e},readWeborityTokens=e=>{const r=e??{};return{accessToken:asString(r.accessToken,"accessToken"),accessTokenExpiry:asString(r.accessTokenExpiration,"accessTokenExpiration"),refreshToken:asString(r.refreshToken,"refreshToken"),refreshTokenExpiry:asString(r.refreshTokenExpiration,"refreshTokenExpiration")}},callRefreshEndpoint=async e=>{const r=await getToken(REFRESH_TOKEN_KEY);if(!r?.token)throw new SessionEndedError("No refresh token available");if(Date.parse(r.expiry)<=Date.now())throw new SessionEndedError("Refresh token expired");const o=await getToken(ACCESS_TOKEN_KEY),s={accessToken:o?.token??null,refreshToken:r.token},t=e.body?await e.body(s):s,n=e.headers?await e.headers():void 0;Logger.info("Refreshing the access token");const{data:i}=await publicClient.post(e.path,t,n?{headers:n}:void 0),a=(e.readTokens??readWeborityTokens)(i);return await storeToken(ACCESS_TOKEN_KEY,a.accessToken,a.accessTokenExpiry),await storeToken(REFRESH_TOKEN_KEY,a.refreshToken,a.refreshTokenExpiry),Logger.info("Access token refreshed"),a.accessToken};export const refreshAccessToken=()=>{if(refreshTokenPromise)return refreshTokenPromise;const e=(async()=>{try{const e=await callRefreshEndpoint(requireAuth().auth.refresh);return processQueue(null,e),e}catch(e){const r=axios.isAxiosError(e)?e.response?.data:void 0;throw Logger.error("Token refresh failed:",r??getErrorMessage(e)),processQueue(e,null),endsSession(e)&&await endSessionAndLogout("rejected",axios.isAxiosError(e)?readSignOutReason(e.response?.headers):null),e}})().finally(()=>{refreshTokenPromise===e&&(refreshTokenPromise=null)});return refreshTokenPromise=e,e};
@@ -1 +1 @@
1
- import e,{AxiosHeaders as r}from"axios";import{ACCESS_TOKEN_KEY as t,getToken as o}from"../auth/authStore.js";import{getConfigValue as s}from"../config/index.js";import{Logger as n}from"../logger/index.js";import{getLastKnownNetworkStatus as i}from"../network/networkStatus.js";import"../types/axios.js";import{applyConfiguredBaseUrl as a}from"./baseUrl.js";import{logCurl as c}from"./curl.js";import{sendFormDataAsMultipart as u}from"./multipart.js";import{responseBodyText as f}from"./responseBodyText.js";import{attachRetry as p}from"./retry.js";import{dispatchLogout as m,getErrorMessage as E,getRefreshPath as l,isRefreshInFlight as S,queueBehindRefresh as j,refreshAccessToken as d,resetRefreshState as h}from"./tokenRefresh.js";export{injectStore,injectUserAuth,resetRefreshState}from"./tokenRefresh.js";export class RequestOfflineError extends Error{constructor(e="Request blocked: device is offline"){super(e),this.name="RequestOfflineError",Object.setPrototypeOf(this,RequestOfflineError.prototype)}}export const SESSION_TERMINATION_CODES={TERMINATED:"SESSION_TERMINATED",EXPIRED:"SESSION_EXPIRED"};const R=new Set(Object.values(SESSION_TERMINATION_CODES));export const SESSION_INVALID_HEADER="x-security-stamp-invalid";const I=e.create({headers:{"Content-Type":"application/json"},timeout:3e4});p(I);const setAuthHeader=(e,t)=>{e.headers instanceof r?e.headers.set("Authorization",`Bearer ${t}`):e.headers=r.from({...e.headers,Authorization:`Bearer ${t}`})},isRefreshTokenRequest=e=>{const r=l();return!!r&&!!e?.includes(r)};a(I),u(I),I.interceptors.request.use(e=>(s("logCurl")&&c(e),e)),I.interceptors.request.use(async e=>{if(!1===(await i()).isConnected)return n.warn(`Request blocked: device is offline. URL: ${e.url}`),Promise.reject(new RequestOfflineError);try{if(isRefreshTokenRequest(e.url))return e;const r=await o(t);if(!r?.token)throw new Error("No access token available");const s=Date.now(),i=Date.parse(r.expiry);if(i<=s+3e4){n.info("Access token expired or about to expire, refreshing before request");const r=await d();return setAuthHeader(e,r),e}return setAuthHeader(e,r.token),e}catch(e){return n.error("Failed to attach token:",E(e)),Promise.reject(e)}},e=>(n.error("Request error:",E(e)),Promise.reject(e))),I.interceptors.response.use(e=>e,async r=>{if(!e.isAxiosError(r))return n.error(`Non-axios error in response interceptor: ${E(r)}`),Promise.reject(r);const t=r,o=t.config;if(!t.response)return o?.skipErrorLog||n.error(`Network error or no response from server: ${t.message}, URL: ${o?.url}`),Promise.reject(r);if(401===t.response.status&&o&&!o._retry){if(isRefreshTokenRequest(o.url))return Promise.reject(r);const e=(e=>{if(!e||"object"!=typeof e)return;const r=e,t=r.error,o=[r.code,r.errorCode,t&&"object"==typeof t?t.code:void 0];for(const e of o)if("string"==typeof e&&R.has(e))return e})(t.response.data)??((e=>{if(!e||"object"!=typeof e)return!1;const r=e.get,t="function"==typeof r?r.call(e,SESSION_INVALID_HEADER):e[SESSION_INVALID_HEADER];return"true"===String(t).toLowerCase()})(t.response.headers)?SESSION_TERMINATION_CODES.TERMINATED:void 0);if(e)return n.warn(`Session ${e}, logging out without refresh. URL: ${o.url}`),h(),await m(),Promise.reject(r);if(n.warn(`Unauthorized URL: ${o.url}`),o._retry=!0,S())return j().then(e=>(n.info("Retrying request after token refresh:",o.url),setAuthHeader(o,e),I(o))).catch(e=>(n.error("Failed to retry request after token refresh:",E(e)),Promise.reject(e)));try{const e=await d();return setAuthHeader(o,e),I(o)}catch(e){return Promise.reject(e)}}return o?.skipErrorLog||n.error(`Response error: ${f(t.response?.data,t.message)}, URL: ${o?.url}, Status: ${t.response.status}`),Promise.reject(r)});export default I;
1
+ "use strict";import axios,{AxiosHeaders}from"axios";import{ACCESS_TOKEN_KEY,getToken}from"../auth/authStore.js";import{getConfigValue}from"../config/index.js";import{Logger}from"../logger/index.js";import{getLastKnownNetworkStatus}from"../network/networkStatus.js";import"../types/axios.js";import{applyConfiguredBaseUrl}from"./baseUrl.js";import{applyAccountIdHeader,applyClientHeaders}from"./clientHeaders.js";import{logCurl}from"./curl.js";import{readMinAppVersion}from"./minAppVersion.js";import{sendFormDataAsMultipart}from"./multipart.js";import{applyRequestDefaults}from"./requestDefaults.js";import{responseBodyText}from"./responseBodyText.js";import{attachRetry}from"./retry.js";import{endSessionAndLogout,getAccountIdProvider,getErrorMessage,getRefreshPath,isRefreshInFlight,queueBehindRefresh,readSignOutReason,refreshAccessToken,resetRefreshState}from"./tokenRefresh.js";export{injectStore,injectUserAuth,resetRefreshState,SIGN_OUT_REASON_HEADER}from"./tokenRefresh.js";export class RequestOfflineError extends Error{constructor(e="Request blocked: device is offline"){super(e),this.name="RequestOfflineError",Object.setPrototypeOf(this,RequestOfflineError.prototype)}}export const SESSION_TERMINATION_CODES={TERMINATED:"SESSION_TERMINATED",EXPIRED:"SESSION_EXPIRED"};const TERMINATION_CODES=new Set(Object.values(SESSION_TERMINATION_CODES));export const SESSION_INVALID_HEADER="x-security-stamp-invalid";const hasSessionInvalidHeader=e=>{if(!e||"object"!=typeof e)return!1;const r=e.get,t="function"==typeof r?r.call(e,SESSION_INVALID_HEADER):e[SESSION_INVALID_HEADER];return"true"===String(t).toLowerCase()},getSessionTerminationCode=e=>{if(!e||"object"!=typeof e)return;const r=e,t=r.error,s=[r.code,r.errorCode,t&&"object"==typeof t?t.code:void 0];for(const e of s)if("string"==typeof e&&TERMINATION_CODES.has(e))return e},userClient=axios.create({headers:{"Content-Type":"application/json"}});readMinAppVersion(userClient),attachRetry(userClient);const setAuthHeader=(e,r)=>{e.headers instanceof AxiosHeaders?e.headers.set("Authorization",`Bearer ${r}`):e.headers=AxiosHeaders.from({...e.headers,Authorization:`Bearer ${r}`})},isRefreshTokenRequest=e=>{const r=getRefreshPath();return!!r&&!!e?.includes(r)};applyConfiguredBaseUrl(userClient),applyRequestDefaults(userClient),sendFormDataAsMultipart(userClient),userClient.interceptors.request.use(e=>(getConfigValue("logCurl")&&logCurl(e),e)),applyClientHeaders(userClient),userClient.interceptors.request.use(async e=>{if(!1===(await getLastKnownNetworkStatus()).isConnected)return Logger.warn(`Request blocked: device is offline. URL: ${e.url}`),Promise.reject(new RequestOfflineError);try{if(isRefreshTokenRequest(e.url))return e;const r=await getToken(ACCESS_TOKEN_KEY);if(!r?.token)throw new Error("No access token available");const t=Date.now(),s=Date.parse(r.expiry);if(s<=t+3e4){Logger.info("Access token expired or about to expire, refreshing before request");const r=await refreshAccessToken();return setAuthHeader(e,r),await applyAccountIdHeader(e.headers,getAccountIdProvider()),e}return setAuthHeader(e,r.token),await applyAccountIdHeader(e.headers,getAccountIdProvider()),e}catch(e){return Logger.error("Failed to attach token:",getErrorMessage(e)),Promise.reject(e)}},e=>(Logger.error("Request error:",getErrorMessage(e)),Promise.reject(e))),userClient.interceptors.response.use(e=>e,async e=>{if(!axios.isAxiosError(e))return Logger.error(`Non-axios error in response interceptor: ${getErrorMessage(e)}`),Promise.reject(e);const r=e,t=r.config;if(!r.response)return t?.skipErrorLog||Logger.error(`Network error or no response from server: ${r.message}, URL: ${t?.url}`),Promise.reject(e);if(401===r.response.status&&t&&!t._retry){if(isRefreshTokenRequest(t.url))return Promise.reject(e);const s=readSignOutReason(r.response.headers),o=getSessionTerminationCode(r.response.data)??(hasSessionInvalidHeader(r.response.headers)||null!==s?SESSION_TERMINATION_CODES.TERMINATED:void 0);if(o)return Logger.warn(`Session ${o}, logging out without refresh. URL: ${t.url}`),resetRefreshState(),await endSessionAndLogout("terminated",s),Promise.reject(e);if(Logger.warn(`Unauthorized URL: ${t.url}`),t._retry=!0,isRefreshInFlight())return queueBehindRefresh().then(e=>(Logger.info("Retrying request after token refresh:",t.url),setAuthHeader(t,e),userClient(t))).catch(e=>(Logger.error("Failed to retry request after token refresh:",getErrorMessage(e)),Promise.reject(e)));try{const e=await refreshAccessToken();return setAuthHeader(t,e),userClient(t)}catch(e){return Promise.reject(e)}}return t?.skipErrorLog||Logger.error(`Response error: ${responseBodyText(r.response?.data,r.message)}, URL: ${t?.url}, Status: ${r.response.status}`),Promise.reject(e)});export default userClient;
@@ -1 +1 @@
1
- import*as e from"expo-secure-store";import{Logger as r}from"../logger/index.js";export const ACCESS_TOKEN_KEY="accessToken";export const REFRESH_TOKEN_KEY="refreshToken";let t=null;const keyFor=e=>(e??"default").replace(/[^A-Za-z0-9._-]/g,"_"),n={setGenericPassword:async(r,t,n)=>(await e.setItemAsync(keyFor(n?.service),JSON.stringify({username:r,password:t})),!0),getGenericPassword:async r=>{const t=r?.service,n=await e.getItemAsync(keyFor(t));if(null===n)return!1;const o=JSON.parse(n);return{username:o.username,password:o.password,service:t??"default"}},resetGenericPassword:async r=>(await e.deleteItemAsync(keyFor(r?.service)),!0)},o=new Map;let s=0;const forget=e=>{s+=1,void 0===e?o.clear():o.delete(e)},requireBackend=e=>{const o=t??n;if(!o){const t=new Error(`[authStore] no secure-store backend available; cannot ${e}.`);throw r.error(t.message),t}return o};export const setKeychainImplementation=e=>{t=e,forget()};export const storeToken=async(e,t,n)=>{r.info(`Storing token for key: ${e}`),forget(e);try{const s=JSON.stringify({token:t,expiry:n});await requireBackend("store a token").setGenericPassword("token",s,{service:e}),forget(e),o.set(e,{token:t,expiry:n}),r.info(`Token stored successfully for key: ${e}`)}catch(t){throw forget(e),r.error(`Error storing token for key: ${e}`,t),t}};export const getToken=async e=>{if(o.has(e))return o.get(e)??null;const t=s;try{const n=await requireBackend("read a token").getGenericPassword({service:e});let a=null;if(n){const t=(e=>{if(!e)return null;const{password:r}=e;try{const e=JSON.parse(r);return e&&"object"==typeof e&&"token"in e&&"expiry"in e&&"string"==typeof e.token&&"string"==typeof e.expiry?e:null}catch{return null}})(n);t?a={token:t.token,expiry:t.expiry}:r.warn(`Stored credentials for key "${e}" are not a valid token; ignoring them.`)}return t===s&&o.set(e,a),a}catch(t){const n=t instanceof Error?t.message:String(t);return n.includes("Key permanently invalidated")||n.includes("Secret invalidated")?(r.error(`Stored token for key "${e}" can no longer be decrypted; clearing it.`),await removeToken(e),null):(r.error(`Error retrieving token for key: ${e}`,t),null)}};export const removeToken=async e=>{forget(e);try{await requireBackend("remove a token").resetGenericPassword({service:e}),r.info(`Token removed successfully for key: ${e}`)}catch(t){if(t instanceof Error&&t.message.includes("Item not found"))return void r.info(`No token found to remove for key: ${e}`);r.error(`Failed to remove token for key: ${e}`,t)}finally{forget(e)}};
1
+ "use strict";import*as SecureStore from"expo-secure-store";import{Logger}from"../logger/index.js";import{Storage}from"../storage/index.js";import{getJWTExpiry}from"./jwt.js";export const ACCESS_TOKEN_KEY="accessToken";export const REFRESH_TOKEN_KEY="refreshToken";export const SESSION_USER_KEY="sessionUser";export const LEGACY_REFRESH_TOKEN_LIFETIME_MS=2592e6;let backend=null;const keyFor=e=>(e??"default").replace(/[^A-Za-z0-9._-]/g,"_"),expoSecureStoreBackend={setGenericPassword:async(e,r,o)=>(await SecureStore.setItemAsync(keyFor(o?.service),JSON.stringify({username:e,password:r})),!0),getGenericPassword:async e=>{const r=e?.service,o=await SecureStore.getItemAsync(keyFor(r));if(null===o)return!1;const t=JSON.parse(o);return{username:t.username,password:t.password,service:r??"default"}},resetGenericPassword:async e=>(await SecureStore.deleteItemAsync(keyFor(e?.service)),!0)},resolveBackend=()=>backend??expoSecureStoreBackend,memo=new Map;let generation=0;const forget=e=>{generation+=1,void 0===e?memo.clear():memo.delete(e)},requireBackend=e=>{const r=resolveBackend();if(!r){const r=new Error(`[authStore] no secure-store backend available; cannot ${e}.`);throw Logger.error(r.message),r}return r};export const setKeychainImplementation=e=>{backend=e,forget()};export const storeToken=async(e,r,o)=>{Logger.info(`Storing token for key: ${e}`),forget(e);try{const t=JSON.stringify({token:r,expiry:o});await requireBackend("store a token").setGenericPassword("token",t,{service:e}),forget(e),memo.set(e,{token:r,expiry:o}),Logger.info(`Token stored successfully for key: ${e}`)}catch(r){throw forget(e),Logger.error(`Error storing token for key: ${e}`,r),r}};const parseTokenData=e=>{if(!e)return null;const{password:r}=e;try{const e=JSON.parse(r);return e&&"object"==typeof e&&"token"in e&&"expiry"in e&&"string"==typeof e.token&&"string"==typeof e.expiry?e:null}catch{return null}};export const getToken=async e=>{if(isSessionKey(e)&&legacyKeys&&await migrateLegacySession(),memo.has(e))return memo.get(e)??null;const r=generation;try{const o=await requireBackend("read a token").getGenericPassword({service:e});let t=null;if(o){const r=parseTokenData(o);if(r)t={token:r.token,expiry:r.expiry};else if(Logger.warn(`Stored credentials for key "${e}" are not a valid token; ignoring them.`),isSessionKey(e))return await endSession("corrupt",!0),null}return r===generation&&memo.set(e,t),t}catch(r){const o=r instanceof Error?r.message:String(r);return o.includes("Key permanently invalidated")||o.includes("Secret invalidated")?(Logger.error(`Stored token for key "${e}" can no longer be decrypted; clearing it.`),isSessionKey(e)?await endSession("corrupt",!0):await removeToken(e),null):(Logger.error(`Error retrieving token for key: ${e}`,r),null)}};export const removeToken=async e=>{forget(e);try{await requireBackend("remove a token").resetGenericPassword({service:e}),Logger.info(`Token removed successfully for key: ${e}`)}catch(r){if(r instanceof Error&&r.message.includes("Item not found"))return void Logger.info(`No token found to remove for key: ${e}`);Logger.error(`Failed to remove token for key: ${e}`,r)}finally{forget(e)}};const isSessionKey=e=>"accessToken"===e||"refreshToken"===e;export const storeSessionUser=async e=>{if(!await Storage.setItem("sessionUser",JSON.stringify(e)))throw new Error("[authStore] could not store the session user.")};export const getSessionUser=async()=>{const e=await Storage.getItem("sessionUser");if(null===e)return null;try{return JSON.parse(e)}catch{return Logger.warn("The stored session user is not valid JSON; clearing it."),await removeSessionUser(),null}};export const removeSessionUser=async()=>{await Storage.removeItem("sessionUser")};let legacyKeys=null,legacyCheck=null;export const setLegacyTokenKeys=e=>{legacyKeys=e,legacyCheck=null};const readLegacyToken=e=>{try{const r=JSON.parse(e);if("string"==typeof r)return""===r.trim()?null:{token:r,expiry:null};if(r&&"object"==typeof r&&"string"==typeof r.token&&"string"==typeof r.expiry)return r}catch{}return""===e.trim()?null:{token:e,expiry:null}},expiryOf=e=>3===e.split(".").length?getJWTExpiry(e)?.toISOString()??null:null,readLegacyRaw=async e=>{const r=await resolveBackend().getGenericPassword({service:e});return r?r.password:null},migrateLegacySession=()=>{if(!legacyKeys)return Promise.resolve();if(legacyCheck)return legacyCheck;const e=legacyKeys;return legacyCheck=(async()=>{try{const r=resolveBackend(),o=!await r.getGenericPassword({service:"accessToken"})&&!await r.getGenericPassword({service:"refreshToken"}),t=await readLegacyRaw(e.accessToken),n=await readLegacyRaw(e.refreshToken);if(o&&(null!==t||null!==n)){const o=null===t?null:readLegacyToken(t),s=null===n?null:readLegacyToken(n);if(o){const e=o.expiry??expiryOf(o.token)??(new Date).toISOString();await r.setGenericPassword("token",JSON.stringify({token:o.token,expiry:e}),{service:"accessToken"})}if(s){const e=s.expiry??expiryOf(s.token)??new Date(Date.now()+2592e6).toISOString();await r.setGenericPassword("token",JSON.stringify({token:s.token,expiry:e}),{service:"refreshToken"})}if(e.sessionUser){const r=await Storage.getItem(e.sessionUser);null!==r&&await Storage.setItem("sessionUser",r)}null===o&&null===s||(forget(),Logger.breadcrumb("[authStore] moved a session from the legacy token keys"))}for(const o of[e.accessToken,e.refreshToken])await r.resetGenericPassword({service:o}).catch(()=>{});e.sessionUser&&await Storage.removeItem(e.sessionUser)}catch(e){Logger.error("[authStore] could not move the session from the legacy token keys",e)}})(),legacyCheck},listeners=new Set,emitSessionEnded=(e,r)=>{for(const o of[...listeners])try{o(e,r)}catch(e){Logger.error("[authStore] a session-ended listener threw",e)}};export const addSessionEndedListener=e=>(listeners.add(e),()=>{listeners.delete(e)});const endSession=async(e,r,o=null)=>{const t=r||null!==await getToken("accessToken")||null!==await getToken("refreshToken");await removeToken("accessToken"),await removeToken("refreshToken"),await removeSessionUser(),t&&emitSessionEnded(e,{signOutReason:o})};export const clearSession=async(e="signedOut",r={})=>endSession(e,!1,r.signOutReason??null);
@@ -1 +1 @@
1
- export{getToken,removeToken,storeToken}from"./authStore.js";export{decodeJWT,getJWTExpiry,isJWTExpired}from"./jwt.js";
1
+ "use strict";export{ACCESS_TOKEN_KEY,addSessionEndedListener,clearSession,getSessionUser,getToken,LEGACY_REFRESH_TOKEN_LIFETIME_MS,REFRESH_TOKEN_KEY,removeSessionUser,removeToken,SESSION_USER_KEY,setLegacyTokenKeys,storeSessionUser,storeToken}from"./authStore.js";export{decodeJWT,getJWTExpiry,isJWTExpired}from"./jwt.js";
@@ -1 +1 @@
1
- import{Logger as e}from"../logger/index.js";const decodeBase64=e=>"function"==typeof atob?atob(e):(e=>{let t="";for(let r=0;r<e.length;r+=4){const n=[0,1,2,3].map(t=>"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(e[r+t]??"=")),o=Math.max(n[0],0)<<18|Math.max(n[1],0)<<12|Math.max(n[2],0)<<6|Math.max(n[3],0);t+=String.fromCharCode(o>>16&255),-1!==n[2]&&(t+=String.fromCharCode(o>>8&255)),-1!==n[3]&&(t+=String.fromCharCode(255&o))}return t})(e);export const decodeJWT=t=>{if(!t||"string"!=typeof t)return null;const r=t.split(".");if(3!==r.length)return e.warn("[jwt] decodeJWT: token is not a valid JWT (expected 3 segments)"),null;try{const e=r[1],t=(e=>{try{return decodeURIComponent(e.split("").map(e=>"%"+e.charCodeAt(0).toString(16).padStart(2,"0")).join(""))}catch{return e}})(decodeBase64(((n=e)+"=".repeat((4-n.length%4)%4)).replace(/-/g,"+").replace(/_/g,"/")));return JSON.parse(t)}catch(t){return e.warn("[jwt] decodeJWT failed to parse payload",t),null}var n};export const isJWTExpired=(e,t=30)=>{const r=decodeJWT(e);if(!r||"number"!=typeof r.exp)return!0;const n=Math.floor(Date.now()/1e3);return r.exp<=n+t};export const getJWTExpiry=e=>{const t=decodeJWT(e);return t&&"number"==typeof t.exp?new Date(1e3*t.exp):null};
1
+ "use strict";import{Logger}from"../logger/index.js";const base64UrlToBase64=e=>(e+"=".repeat((4-e.length%4)%4)).replace(/-/g,"+").replace(/_/g,"/"),BASE64_ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",decodeBase64Fallback=e=>{let t="";for(let r=0;r<e.length;r+=4){const o=[0,1,2,3].map(t=>BASE64_ALPHABET.indexOf(e[r+t]??"=")),n=Math.max(o[0],0)<<18|Math.max(o[1],0)<<12|Math.max(o[2],0)<<6|Math.max(o[3],0);t+=String.fromCharCode(n>>16&255),-1!==o[2]&&(t+=String.fromCharCode(n>>8&255)),-1!==o[3]&&(t+=String.fromCharCode(255&n))}return t},decodeBase64=e=>"function"==typeof atob?atob(e):decodeBase64Fallback(e),utf8FromBinary=e=>{try{return decodeURIComponent(e.split("").map(e=>"%"+e.charCodeAt(0).toString(16).padStart(2,"0")).join(""))}catch{return e}};export const decodeJWT=e=>{if(!e||"string"!=typeof e)return null;const t=e.split(".");if(3!==t.length)return Logger.warn("[jwt] decodeJWT: token is not a valid JWT (expected 3 segments)"),null;try{const e=t[1],r=utf8FromBinary(decodeBase64(base64UrlToBase64(e)));return JSON.parse(r)}catch(e){return Logger.warn("[jwt] decodeJWT failed to parse payload",e),null}};export const isJWTExpired=(e,t=30)=>{const r=decodeJWT(e);if(!r||"number"!=typeof r.exp)return!0;const o=Math.floor(Date.now()/1e3);return r.exp<=o+t};export const getJWTExpiry=e=>{const t=decodeJWT(e);return t&&"number"==typeof t.exp?new Date(1e3*t.exp):null};
@@ -1 +1 @@
1
- export const DEFAULT_LOG_LEVEL=__DEV__?"info":"warn";const n={baseUrl:null,loggingEnabled:!0,logLevel:DEFAULT_LOG_LEVEL,environment:"Development",country:"in",appId:null,appVersion:null,logCurl:!1};let o={...n};export const setConfig=n=>{o={...o,...n}};export const getConfig=()=>o;export function getConfigValue(n,e){const t=o[n];return null!==t?t:e}export const resetConfig=()=>{o={...n}};
1
+ "use strict";export const DEFAULT_LOG_LEVEL=__DEV__?"info":"warn";export const DEFAULT_TIMEOUT_MS=3e4;export const DEFAULT_RETRIES=3;export const DEFAULT_CORRELATION_ID_HEADER="X-Correlation-Id";const DEFAULT_CONFIG={baseUrl:null,loggingEnabled:!0,logLevel:DEFAULT_LOG_LEVEL,environment:"Development",country:"in",appId:null,appVersion:null,commit:null,appBuild:null,appStoreId:null,logCurl:!1,timeoutMs:3e4,retries:3,correlationIdHeader:"X-Correlation-Id"};let globalConfig={...DEFAULT_CONFIG};export const setConfig=o=>{globalConfig={...globalConfig,...o}};export const getConfig=()=>globalConfig;export function getConfigValue(o,n){const l=globalConfig[o];return null!==l?l:n}export const resetConfig=()=>{globalConfig={...DEFAULT_CONFIG}};
@@ -1 +1 @@
1
- import{useEffect as e,useRef as t}from"react";import{Linking as r}from"react-native";import{Logger as n}from"../logger/index.js";const o="[@webority/mobile-core]",decodeSafe=e=>{try{return decodeURIComponent(e.replace(/\+/g," "))}catch{return e}},trimSlashes=e=>e.replace(/^\/+/,"").replace(/\/+$/,"");export const parseDeepLink=e=>{if("string"!=typeof e)return null;const t=e.trim();if(!t||/\s/.test(t))return null;const r=t.split("#")[0]??"",n=r.indexOf("://");let o="",s=r;if(n>=0){const e=r.slice(0,n);if(!/^[a-zA-Z][a-zA-Z0-9+.-]*$/.test(e))return null;o=e.toLowerCase(),s=r.slice(n+3)}const i=s.indexOf("?"),c=i>=0?s.slice(0,i):s,l=(e=>{const t={};if(!e)return t;for(const r of e.split("&")){if(!r)continue;const e=r.indexOf("="),n=decodeSafe(e>=0?r.slice(0,e):r);n&&(t[n]=e>=0?decodeSafe(r.slice(e+1)):"")}return t})(i>=0?s.slice(i+1):"");let u="",a=c;if("http"===o||"https"===o){const e=c.indexOf("/");u=e>=0?c.slice(0,e):c,a=e>=0?c.slice(e+1):""}const f=trimSlashes(a),p=f?f.split("/").filter(Boolean):[];return o&&"http"!==o&&"https"!==o&&(u=p[0]??""),{url:t,scheme:o,host:u,path:f,segments:p,query:l}};const matchPattern=(e,t)=>{const r=trimSlashes(e).split("/").filter(Boolean);if(r.length!==t.length)return null;const n={};for(let e=0;e<r.length;e+=1){const o=r[e],s=t[e];if(o.startsWith(":")){const e=o.slice(1);if(!e)return null;n[e]=s}else if(o.toLowerCase()!==s.toLowerCase())return null}return n},matchRegExp=(e,t)=>{(e.global||e.sticky)&&(e.lastIndex=0);const r=e.exec(t);if(!r)return null;const n={};for(let e=1;e<r.length;e+=1){const t=r[e];void 0!==t&&(n[String(e)]=t)}for(const[e,t]of Object.entries(r.groups??{}))void 0!==t&&(n[e]=t);return n};let s=null,i=null,c=!1,l=null,u=null;const dispatch=e=>{const t=s;if(!t)return;const r=((e,t)=>{for(const r of e){const e="string"==typeof r.match?matchPattern(r.match,t.segments):matchRegExp(r.match,t.path);if(e)return{route:r,params:e}}return null})(t.routes,e);if(r)return r.route.requiresAuth&&!(s?.isAuthenticated?.()??1)?(l=e,void t.onUnauthenticated?.(e)):void r.route.handler(e,r.params);t.onUnmatched?.(e)},flushPending=()=>{const e=l;e&&(l=null,dispatch(e))},handleUrl=e=>{if(!s)return void n.error(`${o} DeepLink received a URL before configure() was called; the link was dropped. Call DeepLink.configure({ routes }) (or useDeepLink) during app start.`);const t=parseDeepLink(e);if(!t)return void s.onUnmatched?.({url:"string"==typeof e?e:"",scheme:"",host:"",path:"",segments:[],query:{}});const r=t;(null!==u?u:s?.isReady?.()??1)?dispatch(r):l=r};export const DeepLink={configure:e=>{if(!e||!Array.isArray(e.routes))throw new Error(`${o} DeepLink.configure() needs a config object with a "routes" array. Pass { routes: [{ match: "order/:id", handler }] }.`);s=e},start:async()=>{if(!s)throw new Error(`${o} DeepLink.start() was called before configure(). Call DeepLink.configure({ routes }) first, or use the useDeepLink() hook.`);if(!c){c=!0,i=r.addEventListener("url",e=>{handleUrl(e.url)});try{const e=await r.getInitialURL();e&&handleUrl(e)}catch(e){n.error(`${o} DeepLink could not read the cold-start URL`,e)}}},stop:()=>{i?.remove?.(),i=null,c=!1,l=null,u=null},handleUrl:handleUrl,setReady:e=>{u=e,e&&flushPending()},replayPending:flushPending,getPending:()=>l};export const useDeepLink=r=>{const n=t(r);n.current=r,e(()=>(DeepLink.configure({get routes(){return n.current.routes},isReady:()=>n.current.isReady?.()??!0,isAuthenticated:()=>n.current.isAuthenticated?.()??!0,onUnauthenticated:e=>n.current.onUnauthenticated?.(e),onUnmatched:e=>n.current.onUnmatched?.(e)}),DeepLink.start(),()=>{DeepLink.stop()}),[])};
1
+ "use strict";import{useEffect,useRef}from"react";import{Linking}from"react-native";import{Logger}from"../logger/index.js";const PREFIX="[@webority/mobile-core]",decodeSafe=e=>{try{return decodeURIComponent(e.replace(/\+/g," "))}catch{return e}},parseQuery=e=>{const t={};if(!e)return t;for(const n of e.split("&")){if(!n)continue;const e=n.indexOf("="),r=decodeSafe(e>=0?n.slice(0,e):n);r&&(t[r]=e>=0?decodeSafe(n.slice(e+1)):"")}return t},trimSlashes=e=>e.replace(/^\/+/,"").replace(/\/+$/,"");export const parseDeepLink=e=>{if("string"!=typeof e)return null;const t=e.trim();if(!t||/\s/.test(t))return null;const n=t.split("#")[0]??"",r=n.indexOf("://");let i="",s=n;if(r>=0){const e=n.slice(0,r);if(!/^[a-zA-Z][a-zA-Z0-9+.-]*$/.test(e))return null;i=e.toLowerCase(),s=n.slice(r+3)}const o=s.indexOf("?"),c=o>=0?s.slice(0,o):s,a=parseQuery(o>=0?s.slice(o+1):"");let l="",u=c;if("http"===i||"https"===i){const e=c.indexOf("/");l=e>=0?c.slice(0,e):c,u=e>=0?c.slice(e+1):""}const d=trimSlashes(u),f=d?d.split("/").filter(Boolean):[];return i&&"http"!==i&&"https"!==i&&(l=f[0]??""),{url:t,scheme:i,host:l,path:d,segments:f,query:a}};const matchPattern=(e,t)=>{const n=trimSlashes(e).split("/").filter(Boolean);if(n.length!==t.length)return null;const r={};for(let e=0;e<n.length;e+=1){const i=n[e],s=t[e];if(i.startsWith(":")){const e=i.slice(1);if(!e)return null;r[e]=s}else if(i.toLowerCase()!==s.toLowerCase())return null}return r},matchRegExp=(e,t)=>{(e.global||e.sticky)&&(e.lastIndex=0);const n=e.exec(t);if(!n)return null;const r={};for(let e=1;e<n.length;e+=1){const t=n[e];void 0!==t&&(r[String(e)]=t)}for(const[e,t]of Object.entries(n.groups??{}))void 0!==t&&(r[e]=t);return r},matchRoute=(e,t)=>{for(const n of e){const e="string"==typeof n.match?matchPattern(n.match,t.segments):matchRegExp(n.match,t.path);if(e)return{route:n,params:e}}return null};let config=null,subscription=null,started=!1,pending=null,readyOverride=null;const isReady=()=>null!==readyOverride?readyOverride:config?.isReady?.()??!0,isAuthenticated=()=>config?.isAuthenticated?.()??!0,dispatch=e=>{const t=config;if(!t)return;const n=matchRoute(t.routes,e);if(n)return n.route.requiresAuth&&!isAuthenticated()?(pending=e,void t.onUnauthenticated?.(e)):void n.route.handler(e,n.params);t.onUnmatched?.(e)},flushPending=()=>{const e=pending;e&&(pending=null,dispatch(e))},configure=e=>{if(!e||!Array.isArray(e.routes))throw new Error(`${PREFIX} DeepLink.configure() needs a config object with a "routes" array. Pass { routes: [{ match: "order/:id", handler }] }.`);config=e},handleUrl=e=>{if(!config)return void Logger.error(`${PREFIX} DeepLink received a URL before configure() was called; the link was dropped. Call DeepLink.configure({ routes }) (or useDeepLink) during app start.`);const t=parseDeepLink(e);if(!t)return void config.onUnmatched?.({url:"string"==typeof e?e:"",scheme:"",host:"",path:"",segments:[],query:{}});const n=t;isReady()?dispatch(n):pending=n},start=async()=>{if(!config)throw new Error(`${PREFIX} DeepLink.start() was called before configure(). Call DeepLink.configure({ routes }) first, or use the useDeepLink() hook.`);if(!started){started=!0,subscription=Linking.addEventListener("url",e=>{handleUrl(e.url)});try{const e=await Linking.getInitialURL();e&&handleUrl(e)}catch(e){Logger.error(`${PREFIX} DeepLink could not read the cold-start URL`,e)}}},stop=()=>{subscription?.remove?.(),subscription=null,started=!1,pending=null,readyOverride=null},setReady=e=>{readyOverride=e,e&&flushPending()};export const DeepLink={configure:configure,start:start,stop:stop,handleUrl:handleUrl,setReady:setReady,replayPending:flushPending,getPending:()=>pending};export const useDeepLink=e=>{const t=useRef(e);t.current=e,useEffect(()=>(DeepLink.configure({get routes(){return t.current.routes},isReady:()=>t.current.isReady?.()??!0,isAuthenticated:()=>t.current.isAuthenticated?.()??!0,onUnauthenticated:e=>t.current.onUnauthenticated?.(e),onUnmatched:e=>t.current.onUnmatched?.(e)}),DeepLink.start(),()=>{DeepLink.stop()}),[])};
@@ -1 +1 @@
1
- const asDirectoryPath=e=>e.replace(/\/+$/,"");export const adaptExpoFileSystem=e=>{const t=e?.default??e;if("function"!=typeof t?.File||"function"!=typeof t.File.prototype?.write)return null;const{File:r,Directory:i,Paths:o}=t,s=asDirectoryPath(o.document.uri);return{dirs:{documents:s,cache:asDirectoryPath(o.cache.uri),downloads:s},write:(e,t)=>{const i=new r(e);return i.create({intermediates:!0,overwrite:!0}),i.write(t),Promise.resolve()},exists:e=>Promise.resolve(new r(e).exists),stat:e=>Promise.resolve({size:new r(e).size}),unlink:e=>(new r(e).delete(),Promise.resolve()),mkdir:e=>(new i(e).create({intermediates:!0,idempotent:!0}),Promise.resolve())}};
1
+ "use strict";const asDirectoryPath=e=>e.replace(/\/+$/,"");export const adaptExpoFileSystem=e=>{const t=e?.default??e;if("function"!=typeof t?.File||"function"!=typeof t.File.prototype?.write)return null;const{File:r,Directory:i,Paths:s}=t,o=asDirectoryPath(s.document.uri);return{dirs:{documents:o,cache:asDirectoryPath(s.cache.uri),downloads:o},write:(e,t)=>{const i=new r(e);return i.create({intermediates:!0,overwrite:!0}),i.write(t),Promise.resolve()},exists:e=>Promise.resolve(new r(e).exists),stat:e=>Promise.resolve({size:new r(e).size}),unlink:e=>(new r(e).delete(),Promise.resolve()),mkdir:e=>(new i(e).create({intermediates:!0,idempotent:!0}),Promise.resolve())}};
@@ -1 +1 @@
1
- export const asNumber=e=>{const r="number"==typeof e?e:Number(e);return Number.isFinite(r)?r:0};
1
+ "use strict";export const asNumber=e=>{const r="number"==typeof e?e:Number(e);return Number.isFinite(r)?r:0};
@@ -1 +1 @@
1
- import*as e from"expo-file-system";import{Platform as o}from"react-native";import{Logger as t}from"../logger/index.js";import{Permissions as r}from"../permissions/index.js";import{adaptExpoFileSystem as n}from"./adapters/expoFs.js";import{asNumber as a}from"./adapters/shared.js";const i="[@webority/mobile-core]";export class DownloadError extends Error{constructor(e,o,t){super(`${i} ${o}`),this.name="DownloadError",this.code=e,this.status=t,Object.setPrototypeOf(this,DownloadError.prototype)}}const describe=e=>e instanceof Error?e.message:String(e);let s,d=null;export const setFileSystemImplementation=e=>{d=e};const requireBackend=()=>{const o=d||(void 0===s&&(s=n(e)),s);if(!o)throw new DownloadError("unsupported","No filesystem module is available, so files cannot be downloaded. expo-file-system did not load, which on a real build means the native module was not linked.");return o},lastSegment=e=>{const o=e.split(/[/\\]/);return(t=o[o.length-1]??"",Array.from(t).filter(e=>(e.codePointAt(0)??0)>31).join("")).trim();var t},ensureStoragePermission=async e=>{if("android"!==o.OS||"downloads"!==e)return;if(("number"==typeof o.Version?o.Version:Number.parseInt(String(o.Version),10))>=29)return;const t=await r.ensure("storage");if("granted"!==t&&"limited"!==t)throw new DownloadError("permission-denied",`Storage permission is "${t}", so nothing can be written to the Downloads folder on this Android version. Ask the user to grant it (Permissions.openSettings()), or download to the "documents" destination instead.`)},emptyFile=e=>new DownloadError("empty-file",`The download of ${e} produced an empty file, so nothing was saved. Check that the URL is correct and that the request carried the credentials the server expects.`),discardPartial=async(e,o)=>{try{await e.exists(o)&&await e.unlink(o)}catch(e){t.warn(`${i} Failed to remove the partial download at ${o}`,e)}};export const downloadFile=async e=>{const o=requireBackend(),t=e.destination??"documents",r=e.fileName?(e=>{const o=lastSegment(e);if(""===o||"."===o||".."===o)throw new DownloadError("write-failed",`"${e}" does not contain a usable file name. Pass an explicit fileName.`);return o})(e.fileName):(e=>{const o=(e.split("#")[0]?.split("?")[0]??"").split("/").pop()??"";let t=o;try{t=decodeURIComponent(o)}catch{}const r=lastSegment(t);return""===r||"."===r||".."===r?"download":r})(e.url);await ensureStoragePermission(t);const n=o.dirs[t],i=`${n}/${r}`;if(e.signal?.aborted)throw new DownloadError("aborted",`The download of ${r} was aborted before it started.`);let s=!1;try{await o.mkdir(n);const t=await o.exists(i);t&&!1===e.overwrite?s=!0:t&&await o.unlink(i)}catch(e){throw new DownloadError("write-failed",`Could not prepare ${i} for writing: ${describe(e)}`)}if(s){const t=await o.stat(i);return{path:i,bytes:a(t?.size),mimeType:e.mimeType,fromCache:!0}}const{onProgress:d}=e;let l;try{({data:l}=await e.client.get(e.url,{headers:{Accept:"*/*",...e.headers},responseType:"arraybuffer",timeout:3e5,signal:e.signal,onDownloadProgress:d?({loaded:e,total:o=0})=>d(e,o,o>0?e/o:0):void 0}))}catch(o){throw((e,o,t)=>{if(o.signal?.aborted)return new DownloadError("aborted",`The download of ${t} was aborted.`);const r=e??{};if("RequestOfflineError"===r.name)return new DownloadError("network",`The device is offline, so ${o.url} was not downloaded.`);const n=r.response?.status;return"number"==typeof n?new DownloadError("http-error",`The server answered ${n} for ${o.url}, so no file was saved.`,n):new DownloadError("network",`The download of ${o.url} failed: ${describe(e)}`)})(o,e,r)}if(e.signal?.aborted)throw new DownloadError("aborted",`The download of ${r} was aborted.`);const w=new Uint8Array(l??new ArrayBuffer(0));if(0===w.byteLength)throw emptyFile(e.url);try{await o.write(i,w)}catch(e){throw await discardPartial(o,i),new DownloadError("write-failed",`Could not write ${i}: ${describe(e)}`)}let c=0;try{c=await o.exists(i)?a((await o.stat(i)).size):0}catch(e){throw await discardPartial(o,i),new DownloadError("write-failed",`The download of ${r} finished but ${i} could not be read back: ${describe(e)}`)}if(c<=0)throw await discardPartial(o,i),emptyFile(e.url);return{path:i,bytes:c,mimeType:e.mimeType,fromCache:!1}};
1
+ "use strict";import*as ExpoFileSystem from"expo-file-system";import{Platform}from"react-native";import{Logger}from"../logger/index.js";import{Permissions}from"../permissions/index.js";import{adaptExpoFileSystem}from"./adapters/expoFs.js";import{asNumber}from"./adapters/shared.js";const PREFIX="[@webority/mobile-core]",SCOPED_STORAGE_API_LEVEL=29,DOWNLOAD_TIMEOUT_MS=3e5;export class DownloadError extends Error{constructor(e,r,o){super(`${PREFIX} ${r}`),this.name="DownloadError",this.code=e,this.status=o,Object.setPrototypeOf(this,DownloadError.prototype)}}const describe=e=>e instanceof Error?e.message:String(e);let expoBackend,backend=null;const resolveBackend=()=>backend||(void 0===expoBackend&&(expoBackend=adaptExpoFileSystem(ExpoFileSystem)),expoBackend);export const setFileSystemImplementation=e=>{backend=e};const requireBackend=()=>{const e=resolveBackend();if(!e)throw new DownloadError("unsupported","No filesystem module is available, so files cannot be downloaded. expo-file-system did not load, which on a real build means the native module was not linked.");return e},stripControlChars=e=>Array.from(e).filter(e=>(e.codePointAt(0)??0)>31).join(""),lastSegment=e=>{const r=e.split(/[/\\]/);return stripControlChars(r[r.length-1]??"").trim()},sanitiseFileName=e=>{const r=lastSegment(e);if(""===r||"."===r||".."===r)throw new DownloadError("write-failed",`"${e}" does not contain a usable file name. Pass an explicit fileName.`);return r},fileNameFromUrl=e=>{const r=(e.split("#")[0]?.split("?")[0]??"").split("/").pop()??"";let o=r;try{o=decodeURIComponent(r)}catch{}const t=lastSegment(o);return""===t||"."===t||".."===t?"download":t},androidApiLevel=()=>"number"==typeof Platform.Version?Platform.Version:Number.parseInt(String(Platform.Version),10),ensureStoragePermission=async e=>{if("android"!==Platform.OS||"downloads"!==e)return;if(androidApiLevel()>=29)return;const r=await Permissions.ensure("storage");if("granted"!==r&&"limited"!==r)throw new DownloadError("permission-denied",`Storage permission is "${r}", so nothing can be written to the Downloads folder on this Android version. Ask the user to grant it (Permissions.openSettings()), or download to the "documents" destination instead.`)},emptyFile=e=>new DownloadError("empty-file",`The download of ${e} produced an empty file, so nothing was saved. Check that the URL is correct and that the request carried the credentials the server expects.`),requestFailed=(e,r,o)=>{if(r.signal?.aborted)return new DownloadError("aborted",`The download of ${o} was aborted.`);const t=e??{};if("RequestOfflineError"===t.name)return new DownloadError("network",`The device is offline, so ${r.url} was not downloaded.`);const a=t.response?.status;return"number"==typeof a?new DownloadError("http-error",`The server answered ${a} for ${r.url}, so no file was saved.`,a):new DownloadError("network",`The download of ${r.url} failed: ${describe(e)}`)},discardPartial=async(e,r)=>{try{await e.exists(r)&&await e.unlink(r)}catch(e){Logger.warn(`${PREFIX} Failed to remove the partial download at ${r}`,e)}};export const downloadFile=async e=>{const r=requireBackend(),o=e.destination??"documents",t=e.fileName?sanitiseFileName(e.fileName):fileNameFromUrl(e.url);await ensureStoragePermission(o);const a=r.dirs[o],n=`${a}/${t}`;if(e.signal?.aborted)throw new DownloadError("aborted",`The download of ${t} was aborted before it started.`);let i=!1;try{await r.mkdir(a);const o=await r.exists(n);o&&!1===e.overwrite?i=!0:o&&await r.unlink(n)}catch(e){throw new DownloadError("write-failed",`Could not prepare ${n} for writing: ${describe(e)}`)}if(i){const o=await r.stat(n);return{path:n,bytes:asNumber(o?.size),mimeType:e.mimeType,fromCache:!0}}const{onProgress:s}=e;let d;try{({data:d}=await e.client.get(e.url,{headers:{Accept:"*/*",...e.headers},responseType:"arraybuffer",timeout:3e5,signal:e.signal,onDownloadProgress:s?({loaded:e,total:r=0})=>s(e,r,r>0?e/r:0):void 0}))}catch(r){throw requestFailed(r,e,t)}if(e.signal?.aborted)throw new DownloadError("aborted",`The download of ${t} was aborted.`);const l=new Uint8Array(d??new ArrayBuffer(0));if(0===l.byteLength)throw emptyFile(e.url);try{await r.write(n,l)}catch(e){throw await discardPartial(r,n),new DownloadError("write-failed",`Could not write ${n}: ${describe(e)}`)}let w=0;try{w=await r.exists(n)?asNumber((await r.stat(n)).size):0}catch(e){throw await discardPartial(r,n),new DownloadError("write-failed",`The download of ${t} finished but ${n} could not be read back: ${describe(e)}`)}if(w<=0)throw await discardPartial(r,n),emptyFile(e.url);return{path:n,bytes:w,mimeType:e.mimeType,fromCache:!1}};
@@ -0,0 +1 @@
1
+ "use strict";export const SERVER_FAILURE_MESSAGE="Something went wrong on our side. Please try again in a moment.";export const OFFLINE_MESSAGE="You appear to be offline. Check your connection and try again.";export const TIMEOUT_MESSAGE="That took too long to respond. Check your connection and try again.";export const UNEXPECTED_MESSAGE="Something went wrong. Please try again.";export const REQUEST_CANCELED_CODE="request_canceled";export const CONTRACT_ERROR_CODE="contract_error";export const TIMEOUT_CODE="timeout";export const NETWORK_CODE="network";const MAX_MESSAGE_LENGTH=300,requestFailedMessage=e=>`Request failed (${e})`,isDict=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),nonEmptyString=e=>"string"==typeof e&&e.trim().length>0?e:null,looksLikeDiagnostics=e=>e.length>300||/^\s*</.test(e)||e.includes("\n at ")||/\b(Exception|StackTrace):/.test(e)||/\b(System|Microsoft)\.[A-Za-z]+\.[A-Za-z]/.test(e),userSafe=e=>{const t=nonEmptyString(e);return null===t||looksLikeDiagnostics(t)?null:t};export const toFieldPath=e=>e.replace(/^\$\.?/,"").split(".").map(e=>e.charAt(0).toLowerCase()+e.slice(1)).join(".");const firstMessage=e=>{if(Array.isArray(e)){for(const t of e){const e=nonEmptyString(t);if(null!==e)return e}return null}return nonEmptyString(e)},addError=(e,t,r)=>{const n=toFieldPath(t);""===n?e.form??=r:n in e.fields||(e.fields[n]=r)},readErrors=e=>{const t={fields:{},form:null};if(Array.isArray(e)){for(const r of e){if(!isDict(r))continue;const e=nonEmptyString(r.message);null!==e&&addError(t,"string"==typeof r.field?r.field:"",e)}return t}if(!isDict(e))return t;for(const[r,n]of Object.entries(e)){const e=firstMessage(n);null!==e&&addError(t,r,e)}return t},readLegacyError=e=>{const t=e.error;return isDict(t)?nonEmptyString(t.message):nonEmptyString(t)};export const isApiError=e=>isDict(e)&&"string"==typeof e.message&&"number"==typeof e.status&&"boolean"==typeof e.offline&&isDict(e.fieldErrors);const build=e=>({code:null,fieldErrors:{},status:0,offline:!1,traceId:null,detail:null,...e}),fromNoResponse=e=>{const t=nonEmptyString(e.code),r=nonEmptyString(e.name),n=nonEmptyString(e.message);return build("CanceledError"===r||"ERR_CANCELED"===t?{code:"request_canceled",message:UNEXPECTED_MESSAGE,detail:n}:"ECONNABORTED"===t||"ETIMEDOUT"===t?{code:"timeout",message:TIMEOUT_MESSAGE,offline:!0,detail:n}:"RequestOfflineError"===r||"ERR_NETWORK"===t||"Network Error"===n?{code:"network",message:OFFLINE_MESSAGE,offline:!0,detail:n}:{message:UNEXPECTED_MESSAGE,detail:n})};export function extractApiError(e){if(isApiError(e))return e;if("string"==typeof e)return build({message:userSafe(e)??UNEXPECTED_MESSAGE,detail:e||null});if(!isDict(e))return build({message:UNEXPECTED_MESSAGE,detail:null==e?null:String(e)});if(!0===e.isContractError)return build({code:"contract_error",message:userSafe(e.message)??UNEXPECTED_MESSAGE,detail:nonEmptyString(e.message)});const t=isDict(e.response)?e.response:null,r="number"==typeof t?.status?t.status:"number"==typeof e.status?e.status:0,n=t?t.data:e.body;if(0===r&&null==n)return fromNoResponse(e);const s=isDict(n)?n:null,{fields:o,form:i}=readErrors(s?.errors),a=nonEmptyString(s?.code),E=nonEmptyString(s?.traceId),l=nonEmptyString(s?.message)??nonEmptyString(s?.detail)??(s?readLegacyError(s):null)??nonEmptyString(s?.title)??nonEmptyString(n)??nonEmptyString(e.message);let c;return c=r>=500?SERVER_FAILURE_MESSAGE:userSafe(Object.values(o)[0])??userSafe(i)??userSafe(s?.message)??userSafe(s?.detail)??(s?userSafe(readLegacyError(s)):null)??userSafe(s?.title)??userSafe(n)??(r?requestFailedMessage(r):UNEXPECTED_MESSAGE),build({code:a,message:c,fieldErrors:o,status:r,traceId:E,detail:l})}export const isNoResponse=e=>extractApiError(e).offline;export function apiErrorMessage(e,t){const r=extractApiError(e);if(r.offline||null!==t&&!t)return r.message;return r.status>=500||"request_canceled"===r.code||r.message===UNEXPECTED_MESSAGE||r.message===requestFailedMessage(r.status)?t??null:r.message}
@@ -0,0 +1 @@
1
+ "use strict";export{apiErrorMessage,CONTRACT_ERROR_CODE,extractApiError,isApiError,isNoResponse,NETWORK_CODE,OFFLINE_MESSAGE,REQUEST_CANCELED_CODE,SERVER_FAILURE_MESSAGE,TIMEOUT_CODE,TIMEOUT_MESSAGE,toFieldPath,UNEXPECTED_MESSAGE}from"./extractApiError.js";
@@ -1 +1 @@
1
- import{numberFormat as t}from"./intlCache.js";export const formatCurrency=(r,i={})=>{if(null==r||Number.isNaN(r))return"";const{currency:e="INR",locale:n="en-IN",minimumFractionDigits:c,maximumFractionDigits:m=2,stripSymbol:o=!1}=i,s=c??(Number.isInteger(r)?0:2);if("undefined"!=typeof Intl&&"function"==typeof Intl.NumberFormat)try{const i=t(n,{style:"currency",currency:e,minimumFractionDigits:s,maximumFractionDigits:m}).format(r);return o?i.replace(/[^\d,.\s\-+]/g,"").trim():i}catch{}const u=((t,r)=>{const i=t<0?"-":"",e=Math.abs(t).toFixed(r),[n,c]=e.split("."),m=n.length>3?n.slice(-3):n,o=n.length>3?n.slice(0,-3):"";return i+(o?o.replace(/\B(?=(\d{2})+(?!\d))/g,",")+","+m:m)+(c?`.${c}`:"")})(r,s);return o?u:"INR"===e?`₹${u}`:`${e} ${u}`};
1
+ "use strict";import{configuredLocale,getFormatterConfig,isFormatterConfigured}from"./formatConfig.js";import{numberFormat}from"./intlCache.js";const hasIntlNumber=()=>"undefined"!=typeof Intl&&"function"==typeof Intl.NumberFormat,indianGroupingFallback=(r,t)=>{const e=r<0?"-":"",n=Math.abs(r).toFixed(t),[i,o]=n.split("."),m=i.length>3?i.slice(-3):i,u=i.length>3?i.slice(0,-3):"";return e+(u?u.replace(/\B(?=(\d{2})+(?!\d))/g,",")+","+m:m)+(o?`.${o}`:"")},toAmount=r=>{if(null==r||"string"==typeof r&&""===r.trim())return null;const t="number"==typeof r?r:Number(r);return Number.isFinite(t)?t:null},currencyDigits=(r,t)=>numberFormat(r,{style:"currency",currency:t}).resolvedOptions().maximumFractionDigits??2;export const formatCurrency=(r,t={})=>{const{currency:e="INR",locale:n=configuredLocale()??"en-IN",minimumFractionDigits:i,maximumFractionDigits:o,stripSymbol:m=!1,empty:u=(isFormatterConfigured("locale")||isFormatterConfigured("empty")?getFormatterConfig().empty:""),...c}=t,a=toAmount(r);if(null===a)return u;if(hasIntlNumber())try{const r=o??currencyDigits(n,e),t=i??(Number.isInteger(a)?0:r),u=numberFormat(n,{...c,style:"currency",currency:e,minimumFractionDigits:t,maximumFractionDigits:Math.max(t,r)}).format(a);return m?u.replace(/[^\d,.\s\-+]/g,"").trim():u}catch{}const s=indianGroupingFallback(a,i??(Number.isInteger(a)?0:2));return m?s:"INR"===e?`₹${s}`:`${e} ${s}`};
@@ -1 +1 @@
1
- import{dateTimeFormat as t,relativeTimeFormat as e}from"./intlCache.js";const toDate=t=>{if(t instanceof Date)return Number.isNaN(t.getTime())?null:t;const e=new Date(t);return Number.isNaN(e.getTime())?null:e},hasIntl=()=>"undefined"!=typeof Intl&&"function"==typeof Intl.DateTimeFormat,PAD=t=>t<10?`0${t}`:`${t}`,fallbackDate=(t,e)=>{const r=PAD(t.getDate()),n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][t.getMonth()],a=["January","February","March","April","May","June","July","August","September","October","November","December"][t.getMonth()],o=t.getFullYear(),u=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][t.getDay()];switch(e){case"short":return`${r}/${PAD(t.getMonth()+1)}/${o}`;case"long":return`${r} ${a} ${o}`;case"full":return`${u}, ${r} ${a} ${o}`;default:return`${r} ${n} ${o}`}},fallbackTime=(t,e)=>{const r=PAD(t.getHours()),n=PAD(t.getMinutes());if("short"===e)return`${r}:${n}`;return`${r}:${n}:${PAD(t.getSeconds())}`};export const formatDate=(e,r="medium",n="en-IN")=>{const a=toDate(e);if(!a)return"";if(hasIntl())try{return t(n,{dateStyle:r}).format(a)}catch{}return fallbackDate(a,r)};export const formatTime=(e,r="short",n="en-IN")=>{const a=toDate(e);if(!a)return"";if(hasIntl())try{return t(n,{timeStyle:r}).format(a)}catch{}return fallbackTime(a,r)};export const formatDateTime=(e,r="medium",n="short",a="en-IN")=>{const o=toDate(e);if(!o)return"";if(hasIntl())try{return t(a,{dateStyle:r,timeStyle:n}).format(o)}catch{}return`${fallbackDate(o,r)}, ${fallbackTime(o,n)}`};const r=6e4,n=36e5,a=24*n,o=7*a,u=30*a,i=365*a;export const formatRelativeTime=(t,c=new Date,s="en-IN")=>{const m=toDate(t),f=toDate(c);if(!m||!f)return"";const $=m.getTime()-f.getTime(),d=Math.abs($);let h,y;d<r?(h="second",y=Math.round($/1e3)):d<n?(h="minute",y=Math.round($/r)):d<a?(h="hour",y=Math.round($/n)):d<o?(h="day",y=Math.round($/a)):d<u?(h="week",y=Math.round($/o)):d<i?(h="month",y=Math.round($/u)):(h="year",y=Math.round($/i));const l=hasIntl()?Intl.RelativeTimeFormat:void 0;if("function"==typeof l)try{return e(l,s).format(y,h)}catch{}const M=y<0,g=Math.abs(y),p=1===g?h:`${h}s`;return M?`${g} ${p} ago`:`in ${g} ${p}`};
1
+ "use strict";import{formatDate as houseDate,formatDateTime as houseDateTime,formatTime as houseTime}from"./house.js";import{dateTimeFormat,relativeTimeFormat}from"./intlCache.js";const toDate=t=>{if(t instanceof Date)return Number.isNaN(t.getTime())?null:t;const e=new Date(t);return Number.isNaN(e.getTime())?null:e},hasIntl=()=>"undefined"!=typeof Intl&&"function"==typeof Intl.DateTimeFormat,PAD=t=>t<10?`0${t}`:`${t}`,fallbackDate=(t,e)=>{const a=PAD(t.getDate()),r=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][t.getMonth()],n=["January","February","March","April","May","June","July","August","September","October","November","December"][t.getMonth()],o=t.getFullYear(),i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][t.getDay()];switch(e){case"short":return`${a}/${PAD(t.getMonth()+1)}/${o}`;case"long":return`${a} ${n} ${o}`;case"full":return`${i}, ${a} ${n} ${o}`;default:return`${a} ${r} ${o}`}},fallbackTime=(t,e)=>{const a=PAD(t.getHours()),r=PAD(t.getMinutes());if("short"===e)return`${a}:${r}`;return`${a}:${r}:${PAD(t.getSeconds())}`},isStyle=t=>"string"==typeof t;export function formatDate(t,e,a="en-IN"){if(!isStyle(e))return houseDate(t,e);const r=e,n=toDate(t);if(!n)return"";if(hasIntl())try{return dateTimeFormat(a,{dateStyle:r}).format(n)}catch{}return fallbackDate(n,r)}export function formatTime(t,e,a="en-IN"){if(!isStyle(e))return houseTime(t,e);const r=e,n=toDate(t);if(!n)return"";if(hasIntl())try{return dateTimeFormat(a,{timeStyle:r}).format(n)}catch{}return fallbackTime(n,r)}export function formatDateTime(t,e,a="short",r="en-IN"){if(!isStyle(e))return houseDateTime(t,e);const n=e,o=toDate(t);if(!o)return"";if(hasIntl())try{return dateTimeFormat(r,{dateStyle:n,timeStyle:a}).format(o)}catch{}return`${fallbackDate(o,n)}, ${fallbackTime(o,a)}`}const SECOND=1e3,MINUTE=6e4,HOUR=36e5,DAY=24*HOUR,WEEK=7*DAY,MONTH=30*DAY,YEAR=365*DAY;export const formatRelativeTime=(t,e=new Date,a="en-IN")=>{const r=toDate(t),n=toDate(e);if(!r||!n)return"";const o=r.getTime()-n.getTime(),i=Math.abs(o);let u,s;i<6e4?(u="second",s=Math.round(o/1e3)):i<HOUR?(u="minute",s=Math.round(o/6e4)):i<DAY?(u="hour",s=Math.round(o/HOUR)):i<WEEK?(u="day",s=Math.round(o/DAY)):i<MONTH?(u="week",s=Math.round(o/WEEK)):i<YEAR?(u="month",s=Math.round(o/MONTH)):(u="year",s=Math.round(o/YEAR));const m=hasIntl()?Intl.RelativeTimeFormat:void 0;if("function"==typeof m)try{return relativeTimeFormat(m,a).format(s,u)}catch{}const l=s<0,c=Math.abs(s),f=1===c?u:`${u}s`;return l?`${c} ${f} ago`:`in ${c} ${f}`};
@@ -1 +1 @@
1
- import{dateTimeFormat as e}from"./intlCache.js";import{WINDOWS_TO_IANA as t}from"./windowsToIanaTable.js";const toDate=e=>{if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;const t=new Date(e);return Number.isNaN(t.getTime())?null:t},PAD=e=>e<10?`0${e}`:`${e}`;export const isSameDay=(e,t)=>{const r=toDate(e),n=toDate(t);return!(!r||!n)&&(r.getFullYear()===n.getFullYear()&&r.getMonth()===n.getMonth()&&r.getDate()===n.getDate())};export const isDateBefore=(e,t)=>{const r=toDate(e),n=toDate(t);return null!==r&&null!==n&&r.getTime()<n.getTime()};export const isDateAfter=(e,t)=>{const r=toDate(e),n=toDate(t);return null!==r&&null!==n&&r.getTime()>n.getTime()};export const diffMs=(e,t)=>{const r=toDate(e),n=toDate(t);return r&&n?r.getTime()-n.getTime():Number.NaN};export const startOfDay=e=>{const t=toDate(e);if(!t)return null;const r=new Date(t);return r.setHours(0,0,0,0),r};export const addDays=(e,t)=>{const r=toDate(e);if(!r)return null;const n=new Date(r);return n.setDate(n.getDate()+t),n};const r=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],n=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],o=["January","February","March","April","May","June","July","August","September","October","November","December"],u=["YYYY","YY","MMMM","MMM","MM","M","DD","D","dddd","ddd","HH","H","hh","h","mm","m","ss","s","A","a"];export const formatDatePattern=(e,t,s)=>{const c=toDate(e);if(!c)return"";const i=s?.utc??!1,g=i?c.getUTCFullYear():c.getFullYear(),m=i?c.getUTCMonth():c.getMonth(),l=i?c.getUTCDate():c.getDate(),M=i?c.getUTCDay():c.getDay(),d=i?c.getUTCHours():c.getHours(),f=i?c.getUTCMinutes():c.getMinutes(),D=i?c.getUTCSeconds():c.getSeconds(),{hour12:h,period:T}=to12Hour(d);return(e=>{const t=[];let r=0;e:for(;r<e.length;){for(const n of u)if(e.startsWith(n,r)){t.push(n),r+=n.length;continue e}t.push(e[r]),r+=1}return t})(t).map(e=>{switch(e){case"YYYY":return String(g);case"YY":return String(g).slice(-2);case"MMMM":return o[m];case"MMM":return a[m];case"MM":return PAD(m+1);case"M":return String(m+1);case"DD":return PAD(l);case"D":return String(l);case"dddd":return n[M];case"ddd":return r[M];case"HH":return PAD(d);case"H":return String(d);case"hh":return PAD(h);case"h":return String(h);case"mm":return PAD(f);case"m":return String(f);case"ss":return PAD(D);case"s":return String(D);case"A":return T;case"a":return T.toLowerCase();default:return e}}).join("")};const a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];export const formatDateDDMMMYYYY=(e,t)=>{const r=toDate(e);return r?t?.utc?`${PAD(r.getUTCDate())} ${a[r.getUTCMonth()]}, ${r.getUTCFullYear()}`:`${PAD(r.getDate())} ${a[r.getMonth()]}, ${r.getFullYear()}`:""};export const formatDateISO=e=>{const t=toDate(e);return t?`${t.getFullYear()}-${PAD(t.getMonth()+1)}-${PAD(t.getDate())}`:""};const to12Hour=e=>({hour12:e%12||12,period:e>=12?"PM":"AM"});export const formatTime12h=e=>{const t=toDate(e);if(!t)return"";const{hour12:r,period:n}=to12Hour(t.getHours());return`${PAD(r)}:${PAD(t.getMinutes())} ${n}`};export const formatTimeInZone=(t,r)=>{const n=toDate(t);if(!n)return"";if("undefined"==typeof Intl||"function"!=typeof Intl.DateTimeFormat)return formatTime12h(n);const o=e("en-US",{timeZone:r,hour:"numeric",minute:"2-digit",hour12:!0}).formatToParts(n),get=e=>o.find(t=>t.type===e)?.value??"",u=Number.parseInt(get("hour"),10),a=get("minute"),s=get("dayPeriod").toLowerCase();return`${PAD(u)}:${a} ${s}`};export const formatTimeInWindowsZone=(e,r)=>{const n=t[r];if(!n)throw new Error(`Mapping for Windows time zone '${r}' not found.`);return formatTimeInZone(e,n)};
1
+ "use strict";import{dateTimeFormat}from"./intlCache.js";import{WINDOWS_TO_IANA}from"./windowsToIanaTable.js";const toDate=t=>{if(t instanceof Date)return Number.isNaN(t.getTime())?null:t;const e=new Date(t);return Number.isNaN(e.getTime())?null:e},PAD=t=>t<10?`0${t}`:`${t}`;export const isSameDay=(t,e)=>{const r=toDate(t),n=toDate(e);return!(!r||!n)&&(r.getFullYear()===n.getFullYear()&&r.getMonth()===n.getMonth()&&r.getDate()===n.getDate())};export const isDateBefore=(t,e)=>{const r=toDate(t),n=toDate(e);return null!==r&&null!==n&&r.getTime()<n.getTime()};export const isDateAfter=(t,e)=>{const r=toDate(t),n=toDate(e);return null!==r&&null!==n&&r.getTime()>n.getTime()};export const diffMs=(t,e)=>{const r=toDate(t),n=toDate(e);return r&&n?r.getTime()-n.getTime():Number.NaN};export const startOfDay=t=>{const e=toDate(t);if(!e)return null;const r=new Date(e);return r.setHours(0,0,0,0),r};export const addDays=(t,e)=>{if(null==t||""===t||!Number.isFinite(e))return null;const r=toDate(t);if(!r)return null;const n=new Date(r);return n.setDate(n.getDate()+e),n};const WEEKDAY_SHORT=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],WEEKDAY_LONG=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],MONTH_LONG=["January","February","March","April","May","June","July","August","September","October","November","December"],TOKENS=["YYYY","YY","MMMM","MMM","MM","M","DD","D","dddd","ddd","HH","H","hh","h","mm","m","ss","s","A","a"],tokenizePattern=t=>{const e=[];let r=0;t:for(;r<t.length;){for(const n of TOKENS)if(t.startsWith(n,r)){e.push(n),r+=n.length;continue t}e.push(t[r]),r+=1}return e};export const formatDatePattern=(t,e,r)=>{const n=toDate(t);if(!n)return"";const o=r?.utc??!1,a=o?n.getUTCFullYear():n.getFullYear(),u=o?n.getUTCMonth():n.getMonth(),s=o?n.getUTCDate():n.getDate(),i=o?n.getUTCDay():n.getDay(),c=o?n.getUTCHours():n.getHours(),D=o?n.getUTCMinutes():n.getMinutes(),g=o?n.getUTCSeconds():n.getSeconds(),{hour12:m,period:l}=to12Hour(c);return tokenizePattern(e).map(t=>{switch(t){case"YYYY":return String(a);case"YY":return String(a).slice(-2);case"MMMM":return MONTH_LONG[u];case"MMM":return MONTH_SHORT[u];case"MM":return PAD(u+1);case"M":return String(u+1);case"DD":return PAD(s);case"D":return String(s);case"dddd":return WEEKDAY_LONG[i];case"ddd":return WEEKDAY_SHORT[i];case"HH":return PAD(c);case"H":return String(c);case"hh":return PAD(m);case"h":return String(m);case"mm":return PAD(D);case"m":return String(D);case"ss":return PAD(g);case"s":return String(g);case"A":return l;case"a":return l.toLowerCase();default:return t}}).join("")};const MONTH_SHORT=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];export const formatDateDDMMMYYYY=(t,e)=>{const r=toDate(t);return r?e?.utc?`${PAD(r.getUTCDate())} ${MONTH_SHORT[r.getUTCMonth()]}, ${r.getUTCFullYear()}`:`${PAD(r.getDate())} ${MONTH_SHORT[r.getMonth()]}, ${r.getFullYear()}`:""};export const formatDateISO=t=>{const e=toDate(t);return e?`${e.getFullYear()}-${PAD(e.getMonth()+1)}-${PAD(e.getDate())}`:""};const to12Hour=t=>({hour12:t%12||12,period:t>=12?"PM":"AM"});export const formatTime12h=t=>{const e=toDate(t);if(!e)return"";const{hour12:r,period:n}=to12Hour(e.getHours());return`${PAD(r)}:${PAD(e.getMinutes())} ${n}`};const hasIntl=()=>"undefined"!=typeof Intl&&"function"==typeof Intl.DateTimeFormat;export const formatTimeInZone=(t,e)=>{const r=toDate(t);if(!r)return"";if(!hasIntl())return formatTime12h(r);const n=dateTimeFormat("en-US",{timeZone:e,hour:"numeric",minute:"2-digit",hour12:!0}).formatToParts(r),get=t=>n.find(e=>e.type===t)?.value??"",o=Number.parseInt(get("hour"),10),a=get("minute"),u=get("dayPeriod").toLowerCase();return`${PAD(o)}:${a} ${u}`};export const formatTimeInWindowsZone=(t,e)=>{const r=WINDOWS_TO_IANA[e];if(!r)throw new Error(`Mapping for Windows time zone '${e}' not found.`);return formatTimeInZone(t,r)};
@@ -0,0 +1 @@
1
+ "use strict";const DEFAULTS={zone:"IST",locale:"en-IN",empty:"-"};let current={...DEFAULTS},configured=new Set;export const configureFormatters=e=>{if(void 0===e)return current={...DEFAULTS},void(configured=new Set);for(const o of Object.keys(e)){const r=e[o];void 0!==r&&(current={...current,[o]:r},configured.add(o))}};export const getFormatterConfig=()=>({...current});export const isFormatterConfigured=e=>configured.has(e);export const configuredLocale=()=>configured.has("locale")?current.locale:null;export const groupingForLocale=e=>/-IN(?:-|$)/i.test(e)?"indian":"international";
@@ -0,0 +1 @@
1
+ "use strict";import{configuredLocale,getFormatterConfig,groupingForLocale}from"./formatConfig.js";import{dateTimeFormat,numberFormat,relativeTimeFormat}from"./intlCache.js";const MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],IST_OFFSET_MINUTES=330,IST_NAMES=["IST","Asia/Kolkata","Asia/Calcutta"],DATE_ONLY=/^\d{4}-\d{2}-\d{2}$/,pad2=t=>t<10?`0${t}`:`${t}`,emptyOf=t=>t??getFormatterConfig().empty,toInstant=t=>{if(null==t||""===t)return null;const e=t instanceof Date?t:new Date("string"==typeof t?t.trim():t);return Number.isNaN(e.getTime())?null:e},isDateOnly=t=>"string"==typeof t&&DATE_ONLY.test(t.trim()),gmtLabel=t=>{if(0===t)return"GMT";const e=t>0?"+":"-",n=Math.abs(t),o=n%60;return`GMT${e}${Math.floor(n/60)}${0===o?"":`:${pad2(o)}`}`},shifted=(t,e,n)=>{const o=new Date(t.getTime()+6e4*e);return{year:o.getUTCFullYear(),month:o.getUTCMonth(),day:o.getUTCDate(),hour:o.getUTCHours(),minute:o.getUTCMinutes(),label:n}},inIanaZone=(t,e)=>{const n=dateTimeFormat("en-US",{timeZone:e,year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",hour12:!1}).formatToParts(t),read=t=>Number.parseInt(n.find(e=>e.type===t)?.value??"",10),o=read("year"),r=read("month")-1,i=read("day"),a=read("hour")%24,l=read("minute"),m=Date.UTC(o,r,i,a,l),u=Math.round((m-6e4*Math.floor(t.getTime()/6e4))/6e4);return{year:o,month:r,day:i,hour:a,minute:l,label:gmtLabel(u)}},wallClock=(t,e)=>IST_NAMES.includes(e)?shifted(t,330,"IST"):"UTC"===e?shifted(t,0,"UTC"):"viewer"===e?{year:t.getFullYear(),month:t.getMonth(),day:t.getDate(),hour:t.getHours(),minute:t.getMinutes(),label:gmtLabel(-t.getTimezoneOffset())}:inIanaZone(t,e),hourCycleOf=t=>t.hourCycle??12,dayMonthYear=t=>`${pad2(t.day)}-${MONTHS[t.month]}-${t.year}`,clockTime=(t,e)=>24===e?`${pad2(t.hour)}:${pad2(t.minute)}`:`${t.hour%12||12}:${pad2(t.minute)} ${t.hour<12?"AM":"PM"}`,labelled=(t,e)=>e??!IST_NAMES.includes(t),withLabel=(t,e,n,o)=>labelled(n,o)?`${t} ${e.label}`:t,intlZone=t=>{if("viewer"!==t)return IST_NAMES.includes(t)?"Asia/Kolkata":t},localeDayMonthYear=(t,e,n)=>{const o=dateTimeFormat(e,{day:"2-digit",month:"short",year:"numeric",timeZone:n}).formatToParts(t),part=t=>o.find(e=>e.type===t)?.value??"";return`${part("day")}-${part("month").replace(".","")}-${part("year")}`},localeClock=(t,e,n,o)=>dateTimeFormat(e,{hour:"2-digit",minute:"2-digit",timeZone:intlZone(n),timeZoneName:labelled(n,o.zoneLabel)?"short":void 0,hourCycle:void 0===o.hourCycle?void 0:24===o.hourCycle?"h23":"h12"}).format(t);export const formatDate=(t,e={})=>{const n=toInstant(t);if(!n)return emptyOf(e.empty);const o=isDateOnly(t)?"UTC":e.zone??getFormatterConfig().zone,r=configuredLocale();return r?localeDayMonthYear(n,r,intlZone(o)):dayMonthYear(wallClock(n,o))};export const formatTime=(t,e={})=>{const n=toInstant(t);if(!n)return emptyOf(e.empty);const o=e.zone??getFormatterConfig().zone,r=configuredLocale();if(r)return localeClock(n,r,o,e);const i=wallClock(n,o);return withLabel(clockTime(i,hourCycleOf(e)),i,o,e.zoneLabel)};export const formatDateTime=(t,e={})=>{const n=toInstant(t);if(!n)return emptyOf(e.empty);const o=e.zone??getFormatterConfig().zone,r=configuredLocale();if(r)return`${localeDayMonthYear(n,r,intlZone(o))}, ${localeClock(n,r,o,e)}`;const i=wallClock(n,o);return withLabel(`${dayMonthYear(i)}, ${clockTime(i,hourCycleOf(e))}`,i,o,e.zoneLabel)};const SECOND=1e3,MINUTE=6e4,HOUR=36e5,DAY=24*HOUR,WEEK=7*DAY,MONTH=30*DAY,YEAR=365*DAY,INTL_UNITS=[["year",YEAR],["month",MONTH],["day",DAY],["hour",HOUR],["minute",6e4]];export const formatRelative=(t,e={})=>{const n=toInstant(t),o=toInstant(e.now??Date.now());if(!n||!o)return emptyOf(e.empty);const r=n.getTime()-o.getTime(),i=Math.abs(r),a=Intl.RelativeTimeFormat,l=configuredLocale();if((null!==l||!0===e.intl)&&"function"==typeof a){const t=relativeTimeFormat(a,l??getFormatterConfig().locale),[e,n]=INTL_UNITS.find(([,t])=>i>=t)??["second",1e3];return t.format(Math.round(r/n),e)}if(i<6e4)return"just now";const[m,u]=i<HOUR?["minute",6e4]:i<DAY?["hour",HOUR]:i<WEEK?["day",DAY]:i<MONTH?["week",WEEK]:i<YEAR?["month",MONTH]:["year",YEAR],c=Math.floor(i/u),s=`${c} ${m}${1===c?"":"s"}`;return r<0?`${s} ago`:`in ${s}`};const toNumber=t=>{if(null==t)return null;if("string"==typeof t&&""===t.trim())return null;const e="number"==typeof t?t:Number(t);return Number.isFinite(e)?e:null},clampDigits=t=>Math.min(20,Math.max(0,Math.trunc(t))),shiftDecimal=(t,e)=>/e/i.test(String(t))?t*10**e:Number(`${t}e${e}`),groupInteger=(t,e)=>{if("none"===e||t.length<=3)return t;if("international"===e)return t.replace(/\B(?=(\d{3})+(?!\d))/g,",");return`${t.slice(0,-3).replace(/\B(?=(\d{2})+(?!\d))/g,",")},${t.slice(-3)}`},hasIntlNumber=()=>"undefined"!=typeof Intl&&"function"==typeof Intl.NumberFormat,plainDigits=(t,e)=>{if(hasIntlNumber())return numberFormat("en-US",{useGrouping:!1,minimumFractionDigits:0,maximumFractionDigits:e}).format(t);const n=Math.min(e,15);return shiftDecimal(Math.round(shiftDecimal(t,n)),-n).toFixed(n)},decimalText=(t,e,n,o)=>{const r=Math.max(clampDigits(n),clampDigits(e)),i=clampDigits(e),a=plainDigits(Math.abs(t),r),[l="0",m=""]=a.split(".");let u=m.padEnd(i,"0");for(;u.length>i&&u.endsWith("0");)u=u.slice(0,-1);const c=groupInteger(l,o)+(u?`.${u}`:"");return t<0&&/[1-9]/.test(a)?`-${c}`:c},HOUSE_NUMBER_KEYS=new Set(["grouping","minimumFractionDigits","maximumFractionDigits","locale","empty","scale"]),intlNumberOptions=t=>{if(!Object.entries(t).some(([t,e])=>void 0!==e&&!HOUSE_NUMBER_KEYS.has(t)))return null;const{grouping:e,locale:n,empty:o,scale:r,...i}=t;return"none"===e&&void 0===i.useGrouping?{...i,useGrouping:!1}:i},localeOf=t=>t.locale??getFormatterConfig().locale,intlTextLocale=t=>{const e=configuredLocale();return null===e||"indian"===t.grouping||"international"===t.grouping?null:t.locale??e},fractionDigits=(t,e)=>{const n=clampDigits(t);return{minimumFractionDigits:n,maximumFractionDigits:Math.max(n,clampDigits(e))}},groupingOption=t=>"none"===t?{useGrouping:!1}:{};export const formatNumber=(t,e={})=>{const n=toNumber(t);if(null===n)return emptyOf(e.empty);const o=intlNumberOptions(e);if(o)return numberFormat(localeOf(e),o).format(n);const r=intlTextLocale(e);return r?numberFormat(r,{...fractionDigits(e.minimumFractionDigits??0,e.maximumFractionDigits??3),...groupingOption(e.grouping)}).format(n):decimalText(n,e.minimumFractionDigits??0,e.maximumFractionDigits??3,e.grouping??groupingForLocale(localeOf(e)))};export const formatPercent=(t,e={})=>{const n=toNumber(t);if(null===n)return emptyOf(e.empty);const o=intlNumberOptions(e);if(o){const t="percent"===e.scale?shiftDecimal(n,-2):n;return numberFormat(localeOf(e),{style:"percent",...o}).format(t)}const r=intlTextLocale(e);if(r){const t="percent"===e.scale?shiftDecimal(n,-2):n;return numberFormat(r,{style:"percent",...fractionDigits(e.minimumFractionDigits??0,e.maximumFractionDigits??e.minimumFractionDigits??0),...groupingOption(e.grouping)}).format(t)}const i="percent"===e.scale?n:shiftDecimal(n,2);return`${decimalText(i,e.minimumFractionDigits??0,e.maximumFractionDigits??e.minimumFractionDigits??0,e.grouping??groupingForLocale(localeOf(e)))}%`};const SYMBOLS={INR:"₹",USD:"$",EUR:"€",GBP:"£"},MINOR_DIGITS={JPY:0,KRW:0,VND:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};export const formatMinor=(t,e={})=>{const n=toNumber(t);if(null===n)return emptyOf(e.empty);const o=(e.currency??"INR").toUpperCase(),r=MINOR_DIGITS[o]??2,i=Math.round(Math.abs(n)),a=String(i).padStart(r+1,"0"),l=a.slice(0,a.length-r);let m=a.slice(a.length-r);e.dropZeroDecimals&&/^0*$/.test(m)&&(m="");const u=intlTextLocale({grouping:e.grouping});if(u)try{const t=Number(`${n<0&&0!==i?"-":""}${l}.${a.slice(a.length-r)||"0"}`);return numberFormat(u,{...!1===e.symbol?{}:{style:"currency",currency:o},...fractionDigits(m?r:0,r),...groupingOption(e.grouping)}).format(t)}catch{}const c=e.grouping??("INR"===o?"indian":"international"),s=groupInteger(l,c)+(m?`.${m}`:""),g=n<0&&0!==i?"-":"";if(!1===e.symbol)return`${g}${s}`;const f=SYMBOLS[o];return f?`${g}${f}${s}`:`${g}${o} ${s}`};
@@ -1 +1 @@
1
- export{formatCurrency}from"./currency.js";export{formatDate,formatDateTime,formatRelativeTime,formatTime}from"./date.js";export{addDays,diffMs,formatDateDDMMMYYYY,formatDateISO,formatDatePattern,formatTime12h,formatTimeInWindowsZone,formatTimeInZone,isDateAfter,isDateBefore,isSameDay,startOfDay}from"./dateMath.js";export{getInitials}from"./initials.js";export{formatCompactNumber,formatNumber,formatPercent}from"./number.js";export{AsYouType,clampNationalNumber,countryFlagEmoji,detectPhoneCountry,formatPhone,formatPhoneAsTyped,getCountries,getCountryCallingCode,getPhoneCountries,isSupportedCountry,isValidNationalNumber,isValidPhoneNumber,maxNationalNumberLength,normalizePhone,parsePhoneNumber,parsePhoneNumberFromString,splitPhoneNumber,validatePhoneNumberLength}from"./phone.js";
1
+ "use strict";export{formatCurrency}from"./currency.js";export{formatDate,formatDateTime,formatRelativeTime,formatTime}from"./date.js";export{addDays,diffMs,formatDateDDMMMYYYY,formatDateISO,formatDatePattern,formatTime12h,formatTimeInWindowsZone,formatTimeInZone,isDateAfter,isDateBefore,isSameDay,startOfDay}from"./dateMath.js";export{configureFormatters,getFormatterConfig}from"./formatConfig.js";export{formatMinor,formatRelative}from"./house.js";export{getInitials}from"./initials.js";export{formatCompactNumber,formatNumber,formatPercent}from"./number.js";export{AsYouType,clampNationalNumber,countryFlagEmoji,detectPhoneCountry,formatPhone,formatPhoneAsTyped,getCountries,getCountryCallingCode,getPhoneCountries,isSupportedCountry,isValidNationalNumber,isValidPhoneNumber,maxNationalNumberLength,normalizePhone,parsePhoneNumber,parsePhoneNumberFromString,splitPhoneNumber,validatePhoneNumberLength}from"./phone.js";
@@ -1 +1 @@
1
- export const getInitials=(t,e=2)=>{if(!t)return"";const r=t.trim();if(!r)return"";const i=r.split(/\s+/);if(1===i.length){return(i[0]??"").slice(0,e).toUpperCase()}return i.slice(0,e).map(t=>(t[0]??"").toUpperCase()).join("")};
1
+ "use strict";export const getInitials=(t,e=2)=>{if(!t)return"";const r=t.trim();if(!r)return"";const s=r.split(/\s+/);if(1===s.length){return(s[0]??"").slice(0,e).toUpperCase()}return s.slice(0,e).map(t=>(t[0]??"").toUpperCase()).join("")};
@@ -1 +1 @@
1
- const cached=(e,t,n)=>{let r=e.get(t);return void 0===r&&(r=n(),e.size>=100&&e.clear(),e.set(t,r)),r},e=new Map,t=new Map,n=new Map;export const numberFormat=(t,n={})=>cached(e,`${t}|${JSON.stringify(n)}`,()=>new Intl.NumberFormat(t,n));export const dateTimeFormat=(e,n)=>cached(t,`${e}|${JSON.stringify(n)}`,()=>new Intl.DateTimeFormat(e,n));export const relativeTimeFormat=(e,t)=>cached(n,t,()=>new e(t,{numeric:"auto"}));
1
+ "use strict";const LIMIT=100,cached=(e,t,r)=>{let a=e.get(t);return void 0===a&&(a=r(),e.size>=100&&e.clear(),e.set(t,a)),a},numberFormats=new Map,dateTimeFormats=new Map,relativeTimeFormats=new Map;export const numberFormat=(e,t={})=>cached(numberFormats,`${e}|${JSON.stringify(t)}`,()=>new Intl.NumberFormat(e,t));export const dateTimeFormat=(e,t)=>cached(dateTimeFormats,`${e}|${JSON.stringify(t)}`,()=>new Intl.DateTimeFormat(e,t));export const relativeTimeFormat=(e,t)=>cached(relativeTimeFormats,t,()=>new e(t,{numeric:"auto"}));
@@ -1 +1 @@
1
- import{numberFormat as t}from"./intlCache.js";const hasIntlNumber=()=>"undefined"!=typeof Intl&&"function"==typeof Intl.NumberFormat;export const formatNumber=(r,n,e="en-IN")=>{if(null==r||Number.isNaN(r))return"";if(hasIntlNumber())try{const i={};return null!=n&&(i.minimumFractionDigits=n,i.maximumFractionDigits=n),t(e,i).format(r)}catch{}return null!=n?r.toFixed(n):String(r)};export const formatPercent=(r,n=0,e=!0,i="en-IN")=>{if(null==r||Number.isNaN(r))return"";const o=e?r:r/100;if(hasIntlNumber())try{return t(i,{style:"percent",minimumFractionDigits:n,maximumFractionDigits:n}).format(o)}catch{}return`${(100*o).toFixed(n)}%`};export const formatCompactNumber=(r,n="en-IN")=>{if(null==r||Number.isNaN(r))return"";if(hasIntlNumber())try{return t(n,{notation:"compact",maximumFractionDigits:1}).format(r)}catch{}const e=Math.abs(r),i=r<0?"-":"";return e>=1e7?`${i}${(e/1e7).toFixed(1)}Cr`:e>=1e5?`${i}${(e/1e5).toFixed(1)}L`:e>=1e3?`${i}${(e/1e3).toFixed(1)}K`:`${r}`};
1
+ "use strict";import{formatNumber as houseNumber,formatPercent as housePercent}from"./house.js";import{numberFormat}from"./intlCache.js";const hasIntlNumber=()=>"undefined"!=typeof Intl&&"function"==typeof Intl.NumberFormat;export function formatNumber(t,r,e){if("number"!=typeof r&&void 0===e)return houseNumber(t,r);const n="number"==typeof r?r:void 0,o=t;if(null==o||Number.isNaN(o))return"";if(hasIntlNumber())try{const t={};return null!=n&&(t.minimumFractionDigits=n,t.maximumFractionDigits=n),numberFormat(e??"en-IN",t).format(o)}catch{}return null!=n?o.toFixed(n):String(o)}export function formatPercent(t,r,e,n){if("number"!=typeof r&&void 0===e&&void 0===n)return housePercent(t,r);const o="number"==typeof r?r:0,m=t;if(null==m||Number.isNaN(m))return"";const i=e??1?m:m/100;if(hasIntlNumber())try{return numberFormat(n??"en-IN",{style:"percent",minimumFractionDigits:o,maximumFractionDigits:o}).format(i)}catch{}return`${(100*i).toFixed(o)}%`}export const formatCompactNumber=(t,r="en-IN")=>{if(null==t||Number.isNaN(t))return"";if(hasIntlNumber())try{return numberFormat(r,{notation:"compact",maximumFractionDigits:1}).format(t)}catch{}const e=Math.abs(t),n=t<0?"-":"";return e>=1e7?`${n}${(e/1e7).toFixed(1)}Cr`:e>=1e5?`${n}${(e/1e5).toFixed(1)}L`:e>=1e3?`${n}${(e/1e3).toFixed(1)}K`:`${t}`};
@@ -1 +1 @@
1
- import{Metadata as t}from"libphonenumber-js/core";import{AsYouType as n,getCountries as e,getCountryCallingCode as r,parsePhoneNumberFromString as o,validatePhoneNumberLength as i}from"libphonenumber-js/max";import s from"libphonenumber-js/metadata.max.json";export{AsYouType,getCountries,getCountryCallingCode,isSupportedCountry,isValidPhoneNumber,parsePhoneNumber,parsePhoneNumberFromString,validatePhoneNumberLength}from"libphonenumber-js/max";export const normalizePhone=t=>{if(!t)return"";const n=t.trim(),e=n.startsWith("+"),r=n.replace(/\D/g,"");return e?`+${r}`:r};export const detectPhoneCountry=(t,n="+91")=>{const e=normalizePhone(t);if(!e)return null;if(e.startsWith("+"))return o(e)?.country??null;const r=normalizePhone(n);return r.startsWith("+")?o(r+e)?.country??null:null};export function formatPhone(t,n){if(!t)return"";const e=normalizePhone(t);if(!e)return"";const r="string"==typeof n?{}:n??{},i="string"==typeof n?n:r.defaultCountryCode??"+91",s=e.startsWith("+");let l,a=e;if(r.country)l=o(e,r.country);else if(s)l=o(e);else{const t=normalizePhone(i);if(t.startsWith("+")){const n=t+e;l=o(n),a=n}else l=void 0}const u=s||!r.country;if(l?.isValid()){return r.includeCountryCode??u?l.formatInternational():l.formatNational()}return a.startsWith("+")?(t=>{const n=t.length>11?3:t.length>10?2:1;return`+${t.slice(0,n)} ${t.slice(n).replace(/(.{4})(?=.)/g,"$1 ").trim()}`.trim()})(a.slice(1)):a.replace(/(.{4})(?=.)/g,"$1 ").trim()}const onlyDigits=t=>t.replace(/\D/g,"");export const splitPhoneNumber=(t,n)=>{const e=normalizePhone(t);if(!e||0===onlyDigits(e).length)return null;const r=e.startsWith("+")?o(e):n?o(e,n):void 0;return r?{country:r.country??null,callingCode:r.countryCallingCode,nationalNumber:r.nationalNumber}:null};export const clampNationalNumber=(t,n)=>{let e=onlyDigits(t);for(;e.length>0&&"TOO_LONG"===i(e,n);)e=e.slice(0,-1);return e};const l={any:["MOBILE","FIXED_LINE"],mobile:["MOBILE"]};export const maxNationalNumberLength=(n,e="any")=>{const r=new t(s);r.selectNumberingPlan(n);const o=r.numberingPlan;if(!o)return a;const i=l[e].flatMap(t=>o.type(t)?.possibleLengths()??[]);return Math.max(...i.length>0?i:o.possibleLengths())};const a=15;export const formatPhoneAsTyped=(t,e)=>{const o=clampNationalNumber(t,e);if(!o)return"";const i=new n(e).input(o);if(i!==o)return i;const s=`+${r(e)}`,l=(new n).input(`${s}${o}`);return l.startsWith(s)&&l.slice(s.length).trimStart()||o};export const isValidNationalNumber=(t,n,e="any")=>{const r=onlyDigits(t);if(!r)return!1;const i=o(r,n);if(!i?.isValid())return!1;if("any"===e)return!0;const s=i.getType();return void 0===s||"MOBILE"===s||"FIXED_LINE_OR_MOBILE"===s};export const countryFlagEmoji=t=>{const n=t.trim().toUpperCase();return/^[A-Z]{2}$/.test(n)?String.fromCodePoint(127462+n.charCodeAt(0)-65,127462+n.charCodeAt(1)-65):""};export const getPhoneCountries=()=>e().map(t=>({iso:t,callingCode:r(t)}));
1
+ "use strict";import{Metadata}from"libphonenumber-js/core";import{AsYouType,getCountries,getCountryCallingCode,parsePhoneNumberFromString,validatePhoneNumberLength}from"libphonenumber-js/max";import phoneMetadata from"libphonenumber-js/metadata.max.json";export{AsYouType,getCountries,getCountryCallingCode,isSupportedCountry,isValidPhoneNumber,parsePhoneNumber,parsePhoneNumberFromString,validatePhoneNumberLength}from"libphonenumber-js/max";export const normalizePhone=t=>{if(!t)return"";const e=t.trim(),n=e.startsWith("+"),r=e.replace(/\D/g,"");return n?`+${r}`:r};export const detectPhoneCountry=(t,e="+91")=>{const n=normalizePhone(t);if(!n)return null;if(n.startsWith("+"))return parsePhoneNumberFromString(n)?.country??null;const r=normalizePhone(e);return r.startsWith("+")?parsePhoneNumberFromString(r+n)?.country??null:null};const bestEffortGroup=t=>{const e=t.length>11?3:t.length>10?2:1;return`+${t.slice(0,e)} ${t.slice(e).replace(/(.{4})(?=.)/g,"$1 ").trim()}`.trim()};export function formatPhone(t,e){if(!t)return"";const n=normalizePhone(t);if(!n)return"";const r="string"==typeof e?{}:e??{},o="string"==typeof e?e:r.defaultCountryCode??"+91",i=n.startsWith("+");let s,a=n;if(r.country)s=parsePhoneNumberFromString(n,r.country);else if(i)s=parsePhoneNumberFromString(n);else{const t=normalizePhone(o);if(t.startsWith("+")){const e=t+n;s=parsePhoneNumberFromString(e),a=e}else s=void 0}const u=i||!r.country;if(s?.isValid()){return r.includeCountryCode??u?s.formatInternational():s.formatNational()}return a.startsWith("+")?bestEffortGroup(a.slice(1)):a.replace(/(.{4})(?=.)/g,"$1 ").trim()}const onlyDigits=t=>t.replace(/\D/g,"");export const splitPhoneNumber=(t,e)=>{const n=normalizePhone(t);if(!n||0===onlyDigits(n).length)return null;const r=n.startsWith("+")?parsePhoneNumberFromString(n):e?parsePhoneNumberFromString(n,e):void 0;return r?{country:r.country??null,callingCode:r.countryCallingCode,nationalNumber:r.nationalNumber}:null};export const clampNationalNumber=(t,e)=>{let n=onlyDigits(t);for(;n.length>0&&"TOO_LONG"===validatePhoneNumberLength(n,e);)n=n.slice(0,-1);return n};const SUBSCRIBER_TYPES={any:["MOBILE","FIXED_LINE"],mobile:["MOBILE"]};export const maxNationalNumberLength=(t,e="any")=>{const n=new Metadata(phoneMetadata);n.selectNumberingPlan(t);const r=n.numberingPlan;if(!r)return E164_MAX_NATIONAL_DIGITS;const o=SUBSCRIBER_TYPES[e].flatMap(t=>r.type(t)?.possibleLengths()??[]);return Math.max(...o.length>0?o:r.possibleLengths())};const E164_MAX_NATIONAL_DIGITS=15;export const formatPhoneAsTyped=(t,e)=>{const n=clampNationalNumber(t,e);if(!n)return"";const r=new AsYouType(e).input(n);if(r!==n)return r;const o=`+${getCountryCallingCode(e)}`,i=(new AsYouType).input(`${o}${n}`);return i.startsWith(o)&&i.slice(o.length).trimStart()||n};export const isValidNationalNumber=(t,e,n="any")=>{const r=onlyDigits(t);if(!r)return!1;const o=parsePhoneNumberFromString(r,e);if(!o?.isValid())return!1;if("any"===n)return!0;const i=o.getType();return void 0===i||"MOBILE"===i||"FIXED_LINE_OR_MOBILE"===i};export const countryFlagEmoji=t=>{const e=t.trim().toUpperCase();return/^[A-Z]{2}$/.test(e)?String.fromCodePoint(127462+e.charCodeAt(0)-65,127462+e.charCodeAt(1)-65):""};export const getPhoneCountries=()=>getCountries().map(t=>({iso:t,callingCode:getCountryCallingCode(t)}));
@@ -1 +1 @@
1
- export const WINDOWS_TO_IANA={"AUS Central Standard Time":"Australia/Darwin","AUS Eastern Standard Time":"Australia/Sydney","Afghanistan Standard Time":"Asia/Kabul","Alaskan Standard Time":"America/Anchorage","Aleutian Standard Time":"America/Adak","Altai Standard Time":"Asia/Barnaul","Arab Standard Time":"Asia/Riyadh","Arabian Standard Time":"Asia/Dubai","Arabic Standard Time":"Asia/Baghdad","Argentina Standard Time":"America/Buenos_Aires","Astrakhan Standard Time":"Europe/Astrakhan","Atlantic Standard Time":"America/Halifax","Aus Central W. Standard Time":"Australia/Eucla","Azerbaijan Standard Time":"Asia/Baku","Azores Standard Time":"Atlantic/Azores","Bahia Standard Time":"America/Bahia","Bangladesh Standard Time":"Asia/Dhaka","Belarus Standard Time":"Europe/Minsk","Bougainville Standard Time":"Pacific/Bougainville","Canada Central Standard Time":"America/Regina","Cape Verde Standard Time":"Atlantic/Cape_Verde","Caucasus Standard Time":"Asia/Yerevan","Cen. Australia Standard Time":"Australia/Adelaide","Central America Standard Time":"America/Guatemala","Central Asia Standard Time":"Asia/Almaty","Central Brazilian Standard Time":"America/Cuiaba","Central Europe Standard Time":"Europe/Budapest","Central European Standard Time":"Europe/Warsaw","Central Pacific Standard Time":"Pacific/Guadalcanal","Central Standard Time":"America/Chicago","Central Standard Time (Mexico)":"America/Mexico_City","Chatham Islands Standard Time":"Pacific/Chatham","China Standard Time":"Asia/Shanghai","Cuba Standard Time":"America/Havana","Dateline Standard Time":"Etc/GMT+12","E. Africa Standard Time":"Africa/Nairobi","E. Australia Standard Time":"Australia/Brisbane","E. Europe Standard Time":"Europe/Chisinau","E. South America Standard Time":"America/Sao_Paulo","Easter Island Standard Time":"Pacific/Easter","Eastern Standard Time":"America/New_York","Eastern Standard Time (Mexico)":"America/Cancun","Egypt Standard Time":"Africa/Cairo","Ekaterinburg Standard Time":"Asia/Yekaterinburg","FLE Standard Time":"Europe/Kiev","Fiji Standard Time":"Pacific/Fiji","GMT Standard Time":"Europe/London","GTB Standard Time":"Europe/Bucharest","Georgian Standard Time":"Asia/Tbilisi","Greenland Standard Time":"America/Godthab","Greenwich Standard Time":"Atlantic/Reykjavik","Haiti Standard Time":"America/Port-au-Prince","Hawaiian Standard Time":"Pacific/Honolulu","India Standard Time":"Asia/Calcutta","Iran Standard Time":"Asia/Tehran","Israel Standard Time":"Asia/Jerusalem","Jordan Standard Time":"Asia/Amman","Kaliningrad Standard Time":"Europe/Kaliningrad","Korea Standard Time":"Asia/Seoul","Libya Standard Time":"Africa/Tripoli","Line Islands Standard Time":"Pacific/Kiritimati","Lord Howe Standard Time":"Australia/Lord_Howe","Magadan Standard Time":"Asia/Magadan","Magallanes Standard Time":"America/Punta_Arenas","Marquesas Standard Time":"Pacific/Marquesas","Mauritius Standard Time":"Indian/Mauritius","Middle East Standard Time":"Asia/Beirut","Montevideo Standard Time":"America/Montevideo","Morocco Standard Time":"Africa/Casablanca","Mountain Standard Time":"America/Denver","Mountain Standard Time (Mexico)":"America/Chihuahua","Myanmar Standard Time":"Asia/Rangoon","N. Central Asia Standard Time":"Asia/Novosibirsk","Namibia Standard Time":"Africa/Windhoek","Nepal Standard Time":"Asia/Katmandu","New Zealand Standard Time":"Pacific/Auckland","Newfoundland Standard Time":"America/St_Johns","Norfolk Standard Time":"Pacific/Norfolk","North Asia East Standard Time":"Asia/Irkutsk","North Asia Standard Time":"Asia/Krasnoyarsk","North Korea Standard Time":"Asia/Pyongyang","Omsk Standard Time":"Asia/Omsk","Pacific SA Standard Time":"America/Santiago","Pacific Standard Time":"America/Los_Angeles","Pacific Standard Time (Mexico)":"America/Tijuana","Pakistan Standard Time":"Asia/Karachi","Paraguay Standard Time":"America/Asuncion","Qyzylorda Standard Time":"Asia/Qyzylorda","Romance Standard Time":"Europe/Paris","Russia Time Zone 10":"Asia/Srednekolymsk","Russia Time Zone 11":"Asia/Kamchatka","Russia Time Zone 3":"Europe/Samara","Russian Standard Time":"Europe/Moscow","SA Eastern Standard Time":"America/Cayenne","SA Pacific Standard Time":"America/Bogota","SA Western Standard Time":"America/La_Paz","SE Asia Standard Time":"Asia/Bangkok","Saint Pierre Standard Time":"America/Miquelon","Sakhalin Standard Time":"Asia/Sakhalin","Samoa Standard Time":"Pacific/Apia","Sao Tome Standard Time":"Africa/Sao_Tome","Saratov Standard Time":"Europe/Saratov","Singapore Standard Time":"Asia/Singapore","South Africa Standard Time":"Africa/Johannesburg","South Sudan Standard Time":"Africa/Juba","Sri Lanka Standard Time":"Asia/Colombo","Sudan Standard Time":"Africa/Khartoum","Syria Standard Time":"Asia/Damascus","Taipei Standard Time":"Asia/Taipei","Tasmania Standard Time":"Australia/Hobart","Tocantins Standard Time":"America/Araguaina","Tokyo Standard Time":"Asia/Tokyo","Tomsk Standard Time":"Asia/Tomsk","Tonga Standard Time":"Pacific/Tongatapu","Transbaikal Standard Time":"Asia/Chita","Turkey Standard Time":"Europe/Istanbul","Turks And Caicos Standard Time":"America/Grand_Turk","US Eastern Standard Time":"America/Indianapolis","US Mountain Standard Time":"America/Phoenix",UTC:"Etc/UTC","UTC+12":"Etc/GMT-12","UTC+13":"Etc/GMT-13","UTC-02":"Etc/GMT+2","UTC-08":"Etc/GMT+8","UTC-09":"Etc/GMT+9","UTC-11":"Etc/GMT+11","Ulaanbaatar Standard Time":"Asia/Ulaanbaatar","Venezuela Standard Time":"America/Caracas","Vladivostok Standard Time":"Asia/Vladivostok","Volgograd Standard Time":"Europe/Volgograd","W. Australia Standard Time":"Australia/Perth","W. Central Africa Standard Time":"Africa/Lagos","W. Europe Standard Time":"Europe/Berlin","W. Mongolia Standard Time":"Asia/Hovd","West Asia Standard Time":"Asia/Tashkent","West Bank Standard Time":"Asia/Hebron","West Pacific Standard Time":"Pacific/Port_Moresby","Yakutsk Standard Time":"Asia/Yakutsk","Yukon Standard Time":"America/Whitehorse"};
1
+ "use strict";export const WINDOWS_TO_IANA={"AUS Central Standard Time":"Australia/Darwin","AUS Eastern Standard Time":"Australia/Sydney","Afghanistan Standard Time":"Asia/Kabul","Alaskan Standard Time":"America/Anchorage","Aleutian Standard Time":"America/Adak","Altai Standard Time":"Asia/Barnaul","Arab Standard Time":"Asia/Riyadh","Arabian Standard Time":"Asia/Dubai","Arabic Standard Time":"Asia/Baghdad","Argentina Standard Time":"America/Buenos_Aires","Astrakhan Standard Time":"Europe/Astrakhan","Atlantic Standard Time":"America/Halifax","Aus Central W. Standard Time":"Australia/Eucla","Azerbaijan Standard Time":"Asia/Baku","Azores Standard Time":"Atlantic/Azores","Bahia Standard Time":"America/Bahia","Bangladesh Standard Time":"Asia/Dhaka","Belarus Standard Time":"Europe/Minsk","Bougainville Standard Time":"Pacific/Bougainville","Canada Central Standard Time":"America/Regina","Cape Verde Standard Time":"Atlantic/Cape_Verde","Caucasus Standard Time":"Asia/Yerevan","Cen. Australia Standard Time":"Australia/Adelaide","Central America Standard Time":"America/Guatemala","Central Asia Standard Time":"Asia/Almaty","Central Brazilian Standard Time":"America/Cuiaba","Central Europe Standard Time":"Europe/Budapest","Central European Standard Time":"Europe/Warsaw","Central Pacific Standard Time":"Pacific/Guadalcanal","Central Standard Time":"America/Chicago","Central Standard Time (Mexico)":"America/Mexico_City","Chatham Islands Standard Time":"Pacific/Chatham","China Standard Time":"Asia/Shanghai","Cuba Standard Time":"America/Havana","Dateline Standard Time":"Etc/GMT+12","E. Africa Standard Time":"Africa/Nairobi","E. Australia Standard Time":"Australia/Brisbane","E. Europe Standard Time":"Europe/Chisinau","E. South America Standard Time":"America/Sao_Paulo","Easter Island Standard Time":"Pacific/Easter","Eastern Standard Time":"America/New_York","Eastern Standard Time (Mexico)":"America/Cancun","Egypt Standard Time":"Africa/Cairo","Ekaterinburg Standard Time":"Asia/Yekaterinburg","FLE Standard Time":"Europe/Kiev","Fiji Standard Time":"Pacific/Fiji","GMT Standard Time":"Europe/London","GTB Standard Time":"Europe/Bucharest","Georgian Standard Time":"Asia/Tbilisi","Greenland Standard Time":"America/Godthab","Greenwich Standard Time":"Atlantic/Reykjavik","Haiti Standard Time":"America/Port-au-Prince","Hawaiian Standard Time":"Pacific/Honolulu","India Standard Time":"Asia/Calcutta","Iran Standard Time":"Asia/Tehran","Israel Standard Time":"Asia/Jerusalem","Jordan Standard Time":"Asia/Amman","Kaliningrad Standard Time":"Europe/Kaliningrad","Korea Standard Time":"Asia/Seoul","Libya Standard Time":"Africa/Tripoli","Line Islands Standard Time":"Pacific/Kiritimati","Lord Howe Standard Time":"Australia/Lord_Howe","Magadan Standard Time":"Asia/Magadan","Magallanes Standard Time":"America/Punta_Arenas","Marquesas Standard Time":"Pacific/Marquesas","Mauritius Standard Time":"Indian/Mauritius","Middle East Standard Time":"Asia/Beirut","Montevideo Standard Time":"America/Montevideo","Morocco Standard Time":"Africa/Casablanca","Mountain Standard Time":"America/Denver","Mountain Standard Time (Mexico)":"America/Chihuahua","Myanmar Standard Time":"Asia/Rangoon","N. Central Asia Standard Time":"Asia/Novosibirsk","Namibia Standard Time":"Africa/Windhoek","Nepal Standard Time":"Asia/Katmandu","New Zealand Standard Time":"Pacific/Auckland","Newfoundland Standard Time":"America/St_Johns","Norfolk Standard Time":"Pacific/Norfolk","North Asia East Standard Time":"Asia/Irkutsk","North Asia Standard Time":"Asia/Krasnoyarsk","North Korea Standard Time":"Asia/Pyongyang","Omsk Standard Time":"Asia/Omsk","Pacific SA Standard Time":"America/Santiago","Pacific Standard Time":"America/Los_Angeles","Pacific Standard Time (Mexico)":"America/Tijuana","Pakistan Standard Time":"Asia/Karachi","Paraguay Standard Time":"America/Asuncion","Qyzylorda Standard Time":"Asia/Qyzylorda","Romance Standard Time":"Europe/Paris","Russia Time Zone 10":"Asia/Srednekolymsk","Russia Time Zone 11":"Asia/Kamchatka","Russia Time Zone 3":"Europe/Samara","Russian Standard Time":"Europe/Moscow","SA Eastern Standard Time":"America/Cayenne","SA Pacific Standard Time":"America/Bogota","SA Western Standard Time":"America/La_Paz","SE Asia Standard Time":"Asia/Bangkok","Saint Pierre Standard Time":"America/Miquelon","Sakhalin Standard Time":"Asia/Sakhalin","Samoa Standard Time":"Pacific/Apia","Sao Tome Standard Time":"Africa/Sao_Tome","Saratov Standard Time":"Europe/Saratov","Singapore Standard Time":"Asia/Singapore","South Africa Standard Time":"Africa/Johannesburg","South Sudan Standard Time":"Africa/Juba","Sri Lanka Standard Time":"Asia/Colombo","Sudan Standard Time":"Africa/Khartoum","Syria Standard Time":"Asia/Damascus","Taipei Standard Time":"Asia/Taipei","Tasmania Standard Time":"Australia/Hobart","Tocantins Standard Time":"America/Araguaina","Tokyo Standard Time":"Asia/Tokyo","Tomsk Standard Time":"Asia/Tomsk","Tonga Standard Time":"Pacific/Tongatapu","Transbaikal Standard Time":"Asia/Chita","Turkey Standard Time":"Europe/Istanbul","Turks And Caicos Standard Time":"America/Grand_Turk","US Eastern Standard Time":"America/Indianapolis","US Mountain Standard Time":"America/Phoenix",UTC:"Etc/UTC","UTC+12":"Etc/GMT-12","UTC+13":"Etc/GMT-13","UTC-02":"Etc/GMT+2","UTC-08":"Etc/GMT+8","UTC-09":"Etc/GMT+9","UTC-11":"Etc/GMT+11","Ulaanbaatar Standard Time":"Asia/Ulaanbaatar","Venezuela Standard Time":"America/Caracas","Vladivostok Standard Time":"Asia/Vladivostok","Volgograd Standard Time":"Europe/Volgograd","W. Australia Standard Time":"Australia/Perth","W. Central Africa Standard Time":"Africa/Lagos","W. Europe Standard Time":"Europe/Berlin","W. Mongolia Standard Time":"Asia/Hovd","West Asia Standard Time":"Asia/Tashkent","West Bank Standard Time":"Asia/Hebron","West Pacific Standard Time":"Pacific/Port_Moresby","Yakutsk Standard Time":"Asia/Yakutsk","Yukon Standard Time":"America/Whitehorse"};
@@ -1 +1 @@
1
- const toExpoOptions=e=>{const t={accuracy:e?.enableHighAccuracy?5:3};return"number"==typeof e?.distanceFilter&&(t.distanceInterval=e.distanceFilter),t},e=/permission|denied|not (been )?granted|authoriz/i,t=/location services|provider|disabled|switched off|turned off/i,o=/time ?d? ?out|timeout/i,toNativeError=n=>{const s=n instanceof Error?n.message:String(n);return e.test(s)?{code:1,message:s}:o.test(s)?{code:3,message:s}:(t.test(s),{code:2,message:s})},toNativePosition=e=>({coords:{latitude:e.coords?.latitude??null,longitude:e.coords?.longitude??null,accuracy:e.coords?.accuracy??null,altitude:e.coords?.altitude??null,heading:e.coords?.heading??null,speed:e.coords?.speed??null},timestamp:e.timestamp??null});export const adaptExpoLocation=e=>{const t=new Map;let o=1;return{getCurrentPosition:(t,o,n)=>{e.getCurrentPositionAsync(toExpoOptions(n)).then(e=>t(toNativePosition(e))).catch(e=>o?.(toNativeError(e)))},watchPosition:(n,s,c)=>{const r=o++;return t.set(r,null),e.watchPositionAsync(toExpoOptions(c),e=>n(toNativePosition(e))).then(e=>{t.has(r)?t.set(r,e):e.remove()}).catch(e=>{t.delete(r),s?.(toNativeError(e))}),r},clearWatch:e=>{const o=t.get(e);t.delete(e),o?.remove()}}};
1
+ "use strict";const ACCURACY_BALANCED=3,ACCURACY_HIGHEST=5,toExpoOptions=t=>{const e={accuracy:t?.enableHighAccuracy?5:3};return"number"==typeof t?.distanceFilter&&(e.distanceInterval=t.distanceFilter),e},PERMISSION_PATTERN=/permission|denied|not (been )?granted|authoriz/i,SERVICES_PATTERN=/location services|provider|disabled|switched off|turned off/i,TIMEOUT_PATTERN=/time ?d? ?out|timeout/i,toNativeError=t=>{const e=t instanceof Error?t.message:String(t);return PERMISSION_PATTERN.test(e)?{code:1,message:e}:TIMEOUT_PATTERN.test(e)?{code:3,message:e}:(SERVICES_PATTERN.test(e),{code:2,message:e})},toNativePosition=t=>({coords:{latitude:t.coords?.latitude??null,longitude:t.coords?.longitude??null,accuracy:t.coords?.accuracy??null,altitude:t.coords?.altitude??null,heading:t.coords?.heading??null,speed:t.coords?.speed??null},timestamp:t.timestamp??null});export const adaptExpoLocation=t=>{const e=new Map;let o=1;return{getCurrentPosition:(e,o,i)=>{t.getCurrentPositionAsync(toExpoOptions(i)).then(t=>e(toNativePosition(t))).catch(t=>o?.(toNativeError(t)))},watchPosition:(i,n,s)=>{const r=o++;return e.set(r,null),t.watchPositionAsync(toExpoOptions(s),t=>i(toNativePosition(t))).then(t=>{e.has(r)?e.set(r,t):t.remove()}).catch(t=>{e.delete(r),n?.(toNativeError(t))}),r},clearWatch:t=>{const o=e.get(t);e.delete(t),o?.remove()}}};