@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.
- package/README.md +32 -0
- package/lib/commonjs/api/clientHeaders.js +1 -0
- package/lib/commonjs/api/minAppVersion.js +1 -0
- package/lib/commonjs/api/publicClient.js +1 -1
- package/lib/commonjs/api/requestDefaults.js +1 -0
- package/lib/commonjs/api/retry.js +1 -1
- package/lib/commonjs/api/tokenRefresh.js +1 -1
- package/lib/commonjs/api/userClient.js +1 -1
- package/lib/commonjs/auth/authStore.js +1 -1
- package/lib/commonjs/auth/index.js +1 -1
- package/lib/commonjs/config/index.js +1 -1
- package/lib/commonjs/errors/extractApiError.js +1 -0
- package/lib/commonjs/errors/index.js +1 -0
- package/lib/commonjs/formatters/currency.js +1 -1
- package/lib/commonjs/formatters/date.js +1 -1
- package/lib/commonjs/formatters/dateMath.js +1 -1
- package/lib/commonjs/formatters/formatConfig.js +1 -0
- package/lib/commonjs/formatters/house.js +1 -0
- package/lib/commonjs/formatters/index.js +1 -1
- package/lib/commonjs/formatters/number.js +1 -1
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/initSDK.js +1 -1
- package/lib/commonjs/initUserAuth.js +1 -1
- package/lib/commonjs/logger/index.js +1 -1
- package/lib/commonjs/query/apiBaseQuery.js +1 -0
- package/lib/commonjs/query/createAppApi.js +1 -0
- package/lib/commonjs/query/index.js +1 -0
- package/lib/commonjs/query/listeners.js +1 -0
- package/lib/commonjs/query/paging.js +1 -0
- package/lib/commonjs/query/tags.js +1 -0
- package/lib/commonjs/redux/errorToastMiddleware.js +1 -0
- package/lib/commonjs/redux/index.js +1 -0
- package/lib/commonjs/redux/rootReducer.js +1 -0
- package/lib/commonjs/redux/serializableCheck.js +1 -0
- package/lib/commonjs/versionCheck/buildNumber.js +1 -0
- package/lib/commonjs/versionCheck/index.js +1 -1
- package/lib/module/api/baseUrl.js +1 -1
- package/lib/module/api/clientHeaders.js +1 -0
- package/lib/module/api/curl.js +1 -1
- package/lib/module/api/minAppVersion.js +1 -0
- package/lib/module/api/multipart.js +1 -1
- package/lib/module/api/publicClient.js +1 -1
- package/lib/module/api/requestDefaults.js +1 -0
- package/lib/module/api/responseBodyText.js +1 -1
- package/lib/module/api/retry.js +1 -1
- package/lib/module/api/tokenRefresh.js +1 -1
- package/lib/module/api/userClient.js +1 -1
- package/lib/module/auth/authStore.js +1 -1
- package/lib/module/auth/index.js +1 -1
- package/lib/module/auth/jwt.js +1 -1
- package/lib/module/config/index.js +1 -1
- package/lib/module/deepLink/index.js +1 -1
- package/lib/module/download/adapters/expoFs.js +1 -1
- package/lib/module/download/adapters/shared.js +1 -1
- package/lib/module/download/index.js +1 -1
- package/lib/module/errors/extractApiError.js +1 -0
- package/lib/module/errors/index.js +1 -0
- package/lib/module/formatters/currency.js +1 -1
- package/lib/module/formatters/date.js +1 -1
- package/lib/module/formatters/dateMath.js +1 -1
- package/lib/module/formatters/formatConfig.js +1 -0
- package/lib/module/formatters/house.js +1 -0
- package/lib/module/formatters/index.js +1 -1
- package/lib/module/formatters/initials.js +1 -1
- package/lib/module/formatters/intlCache.js +1 -1
- package/lib/module/formatters/number.js +1 -1
- package/lib/module/formatters/phone.js +1 -1
- package/lib/module/formatters/windowsToIanaTable.js +1 -1
- package/lib/module/geolocation/adapters/expoLocation.js +1 -1
- package/lib/module/geolocation/index.js +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/initSDK.js +1 -1
- package/lib/module/initUserAuth.js +1 -1
- package/lib/module/logger/crashlytics.js +1 -1
- package/lib/module/logger/index.js +1 -1
- package/lib/module/logger/redact.js +1 -1
- package/lib/module/network/index.js +1 -1
- package/lib/module/network/networkStatus.js +1 -1
- package/lib/module/permissions/calendar.js +1 -1
- package/lib/module/permissions/camera.js +1 -1
- package/lib/module/permissions/contacts.js +1 -1
- package/lib/module/permissions/index.js +1 -1
- package/lib/module/permissions/location.js +1 -1
- package/lib/module/permissions/mediaLibrary.js +1 -1
- package/lib/module/permissions/notifications.js +1 -1
- package/lib/module/permissions/photos.js +1 -1
- package/lib/module/phone/countries.js +1 -1
- package/lib/module/push/index.js +1 -1
- package/lib/module/push/push.js +1 -1
- package/lib/module/push/status.js +1 -1
- package/lib/module/push/task.js +1 -1
- package/lib/module/query/apiBaseQuery.js +1 -0
- package/lib/module/query/createAppApi.js +1 -0
- package/lib/module/query/index.js +1 -0
- package/lib/module/query/listeners.js +1 -0
- package/lib/module/query/paging.js +1 -0
- package/lib/module/query/tags.js +1 -0
- package/lib/module/redux/errorToastMiddleware.js +1 -0
- package/lib/module/redux/index.js +1 -0
- package/lib/module/redux/rootReducer.js +1 -0
- package/lib/module/redux/serializableCheck.js +1 -0
- package/lib/module/secureScreen/index.js +1 -1
- package/lib/module/share/index.js +1 -1
- package/lib/module/smsRetriever/index.js +1 -1
- package/lib/module/specs/NativeSmsRetriever.js +1 -1
- package/lib/module/sqlite/adapters/expo.js +1 -1
- package/lib/module/sqlite/index.js +1 -1
- package/lib/module/storage/index.js +1 -1
- package/lib/module/types/axios.js +1 -1
- package/lib/module/types/globals.d.js +1 -1
- package/lib/module/utils/base64.js +1 -1
- package/lib/module/utils/imageCompression.js +1 -1
- package/lib/module/utils/index.js +1 -1
- package/lib/module/validators/index.js +1 -1
- package/lib/module/versionCheck/buildNumber.js +1 -0
- package/lib/module/versionCheck/index.js +1 -1
- package/lib/typescript/commonjs/api/clientHeaders.d.ts +25 -0
- package/lib/typescript/commonjs/api/minAppVersion.d.ts +24 -0
- package/lib/typescript/commonjs/api/requestDefaults.d.ts +21 -0
- package/lib/typescript/commonjs/api/retry.d.ts +23 -9
- package/lib/typescript/commonjs/api/tokenRefresh.d.ts +14 -2
- package/lib/typescript/commonjs/api/userClient.d.ts +1 -1
- package/lib/typescript/commonjs/auth/authStore.d.ts +76 -0
- package/lib/typescript/commonjs/auth/index.d.ts +2 -2
- package/lib/typescript/commonjs/config/index.d.ts +31 -2
- package/lib/typescript/commonjs/errors/extractApiError.d.ts +69 -0
- package/lib/typescript/commonjs/errors/index.d.ts +3 -0
- package/lib/typescript/commonjs/formatters/currency.d.ts +22 -7
- package/lib/typescript/commonjs/formatters/date.d.ts +13 -13
- package/lib/typescript/commonjs/formatters/dateMath.d.ts +4 -2
- package/lib/typescript/commonjs/formatters/formatConfig.d.ts +48 -0
- package/lib/typescript/commonjs/formatters/house.d.ts +143 -0
- package/lib/typescript/commonjs/formatters/index.d.ts +4 -0
- package/lib/typescript/commonjs/formatters/number.d.ts +15 -5
- package/lib/typescript/commonjs/index.d.ts +21 -8
- package/lib/typescript/commonjs/initSDK.d.ts +18 -6
- package/lib/typescript/commonjs/initUserAuth.d.ts +29 -0
- package/lib/typescript/commonjs/logger/index.d.ts +17 -0
- package/lib/typescript/commonjs/query/apiBaseQuery.d.ts +55 -0
- package/lib/typescript/commonjs/query/createAppApi.d.ts +21 -0
- package/lib/typescript/commonjs/query/index.d.ts +9 -0
- package/lib/typescript/commonjs/query/listeners.d.ts +11 -0
- package/lib/typescript/commonjs/query/paging.d.ts +42 -0
- package/lib/typescript/commonjs/query/tags.d.ts +31 -0
- package/lib/typescript/commonjs/redux/errorToastMiddleware.d.ts +51 -0
- package/lib/typescript/commonjs/redux/index.d.ts +6 -0
- package/lib/typescript/commonjs/redux/rootReducer.d.ts +19 -0
- package/lib/typescript/commonjs/redux/serializableCheck.d.ts +14 -0
- package/lib/typescript/commonjs/versionCheck/buildNumber.d.ts +14 -0
- package/lib/typescript/commonjs/versionCheck/index.d.ts +28 -17
- package/lib/typescript/module/api/clientHeaders.d.ts +25 -0
- package/lib/typescript/module/api/minAppVersion.d.ts +24 -0
- package/lib/typescript/module/api/requestDefaults.d.ts +21 -0
- package/lib/typescript/module/api/retry.d.ts +23 -9
- package/lib/typescript/module/api/tokenRefresh.d.ts +14 -2
- package/lib/typescript/module/api/userClient.d.ts +1 -1
- package/lib/typescript/module/auth/authStore.d.ts +76 -0
- package/lib/typescript/module/auth/index.d.ts +2 -2
- package/lib/typescript/module/config/index.d.ts +31 -2
- package/lib/typescript/module/errors/extractApiError.d.ts +69 -0
- package/lib/typescript/module/errors/index.d.ts +3 -0
- package/lib/typescript/module/formatters/currency.d.ts +22 -7
- package/lib/typescript/module/formatters/date.d.ts +13 -13
- package/lib/typescript/module/formatters/dateMath.d.ts +4 -2
- package/lib/typescript/module/formatters/formatConfig.d.ts +48 -0
- package/lib/typescript/module/formatters/house.d.ts +143 -0
- package/lib/typescript/module/formatters/index.d.ts +4 -0
- package/lib/typescript/module/formatters/number.d.ts +15 -5
- package/lib/typescript/module/index.d.ts +21 -8
- package/lib/typescript/module/initSDK.d.ts +18 -6
- package/lib/typescript/module/initUserAuth.d.ts +29 -0
- package/lib/typescript/module/logger/index.d.ts +17 -0
- package/lib/typescript/module/query/apiBaseQuery.d.ts +55 -0
- package/lib/typescript/module/query/createAppApi.d.ts +21 -0
- package/lib/typescript/module/query/index.d.ts +9 -0
- package/lib/typescript/module/query/listeners.d.ts +11 -0
- package/lib/typescript/module/query/paging.d.ts +42 -0
- package/lib/typescript/module/query/tags.d.ts +31 -0
- package/lib/typescript/module/redux/errorToastMiddleware.d.ts +51 -0
- package/lib/typescript/module/redux/index.d.ts +6 -0
- package/lib/typescript/module/redux/rootReducer.d.ts +19 -0
- package/lib/typescript/module/redux/serializableCheck.d.ts +14 -0
- package/lib/typescript/module/versionCheck/buildNumber.d.ts +14 -0
- package/lib/typescript/module/versionCheck/index.d.ts +28 -17
- package/package.json +30 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
"use strict";import*as ExpoLocation from"expo-location";import{useCallback,useEffect,useRef,useState}from"react";import{Logger}from"../logger/index.js";import{Permissions}from"../permissions/index.js";import"../permissions/location.js";import{adaptExpoLocation}from"./adapters/expoLocation.js";const PREFIX="[@webority/mobile-core]";export class GeolocationError extends Error{constructor(e,o){super(o),this.name="GeolocationError",this.code=e,Object.setPrototypeOf(this,GeolocationError.prototype)}}const DEFAULT_TIMEOUT_MS=15e3,DEFAULT_RETRIES=1,DEFAULT_RETRY_DELAY_MS=800;let backend=null;const hasNativeLocation=e=>"function"==typeof e?.getCurrentPositionAsync&&"function"==typeof e?.watchPositionAsync;let expoBackend;const resolveBackend=()=>{if(backend)return backend;if(void 0===expoBackend){const e=ExpoLocation;expoBackend=hasNativeLocation(e)?adaptExpoLocation(e):null}return expoBackend};export const setGeolocationImplementation=e=>{backend=e};const requireBackend=e=>{const o=resolveBackend();if(!o)throw new GeolocationError("unsupported",`${PREFIX} No geolocation provider is available; cannot ${e}. expo-location did not load, which on a real build means the native module was not linked.`);return o},SERVICES_OFF_PATTERN=/(location|gps)[^.]{0,40}(disabled|switched off|turned off|not enabled)|no location provider|settings_not_satisfied|location services (are |is )?off/i,toGeoError=e=>{if(e instanceof GeolocationError)return e;const o=e??{},t="string"==typeof o.message&&o.message.length>0?o.message:"the provider gave no reason";switch(o.code){case 1:return new GeolocationError("permission-denied",`${PREFIX} Location permission was denied (${t}). Request the location permission before calling, or send the user to settings.`);case 2:return SERVICES_OFF_PATTERN.test(t)?new GeolocationError("services-disabled",`${PREFIX} Location services are switched off (${t}). Ask the user to enable location in system settings; retrying will not help.`):new GeolocationError("position-unavailable",`${PREFIX} No position fix (${t}).`);case 3:return new GeolocationError("timeout",`${PREFIX} Location request timed out (${t}).`);case 4:case 5:return new GeolocationError("services-disabled",`${PREFIX} Location services are unavailable on this device (${t}). Ask the user to enable location, or install Google Play services.`);default:return new GeolocationError("position-unavailable",`${PREFIX} Location request failed (${t}).`)}},RETRYABLE=["timeout","position-unavailable"],normalizeCoords=e=>{const o=e?.coords;return o&&Number.isFinite(o.latitude)&&Number.isFinite(o.longitude)?{latitude:o.latitude,longitude:o.longitude,accuracy:Number.isFinite(o.accuracy)?o.accuracy:Number.POSITIVE_INFINITY,altitude:Number.isFinite(o.altitude)?o.altitude:null,heading:Number.isFinite(o.heading)?o.heading:null,speed:Number.isFinite(o.speed)?o.speed:null}:null},normalizePosition=e=>{const o=normalizeCoords(e);return o?{coords:o,timestamp:Number.isFinite(e?.timestamp)?e?.timestamp:Date.now()}:null},toNativeOptions=e=>{const o={enableHighAccuracy:"fine"===(e.accuracy??"fine"),timeout:e.timeoutMs??15e3,maximumAge:e.maximumAgeMs??0};return void 0!==e.distanceFilterM&&(o.distanceFilter=e.distanceFilterM),o},sleep=e=>new Promise(o=>{setTimeout(o,e)}),ensureLocationPermission=async()=>{const e=await Permissions.ensure("location");if("granted"!==e&&"limited"!==e){if("unavailable"!==e)throw new GeolocationError("permission-denied",`${PREFIX} Location permission is "${e}". Grant it before requesting a position`+("blocked"===e?", or call Permissions.openSettings() to let the user fix it.":"."));Logger.warn(`${PREFIX} Location permission status is unavailable (expo-location is not installed, or the check failed); attempting the location request anyway.`)}},positionOnce=(e,o)=>{const t=o.timeoutMs??15e3;return new Promise((i,r)=>{let n=!1;const s=setTimeout(()=>{n||(n=!0,r(new GeolocationError("timeout",`${PREFIX} Location request timed out after ${t}ms. Raise timeoutMs, or use accuracy: 'coarse' where a network fix is good enough.`)))},t),settle=e=>{n||(n=!0,clearTimeout(s),e())},onSuccess=e=>settle(()=>{const t=normalizePosition(e);if(!t)return void r(new GeolocationError("position-unavailable",`${PREFIX} The provider returned a fix without usable coordinates.`));const n=o.minimumAccuracyM;void 0!==n&&t.coords.accuracy>n?r(new GeolocationError("position-unavailable",`${PREFIX} Fix accuracy ${t.coords.accuracy}m is worse than the required ${n}m.`)):i(t)}),onError=e=>settle(()=>r(toGeoError(e)));try{e.getCurrentPosition(onSuccess,onError,toNativeOptions(o))}catch(e){settle(()=>r(toGeoError(e)))}})},getCurrentPosition=async(e={})=>{const o=requireBackend("get the current position");await ensureLocationPermission();const t=Math.max(0,Math.trunc(e.retries??1))+1,i=e.retryDelayMs??800;let r=null;for(let n=0;n<t;n+=1)try{return await positionOnce(o,e)}catch(e){const o=toGeoError(e);if(!RETRYABLE.includes(o.code))throw o;r=o,n<t-1&&i>0&&await sleep(i)}throw r??new GeolocationError("position-unavailable",`${PREFIX} Location request failed.`)},watchPosition=(e,o={})=>{const t=requireBackend("watch the position");let i=!1,r=null;const fail=e=>{const t=toGeoError(e);Logger.error(t.message),o.onError?.(t)};return ensureLocationPermission().then(()=>{i||(r=t.watchPosition(t=>{if(i)return;const r=normalizePosition(t);if(!r)return;const n=o.minimumAccuracyM;void 0!==n&&r.coords.accuracy>n||e(r)},e=>{i||fail(e)},toNativeOptions(o)))}).catch(fail),()=>{i||(i=!0,null!==r&&(t.clearWatch(r),r=null))}},isAvailable=()=>null!==resolveBackend();export const Geolocation={getCurrentPosition:getCurrentPosition,watchPosition:watchPosition,isAvailable:isAvailable};export const useCurrentPosition=(e={})=>{const{enabled:o=!0,accuracy:t,timeoutMs:i,maximumAgeMs:r,retries:n,minimumAccuracyM:s,retryDelayMs:a}=e,[c,l]=useState({position:null,error:null,loading:o}),u=useRef(!0),d=useRef(0);useEffect(()=>(u.current=!0,()=>{u.current=!1}),[]);const m=useCallback(()=>{d.current+=1;const e=d.current;l(e=>e.loading?e:{...e,loading:!0});const accept=o=>{u.current&&d.current===e&&l(o)};getCurrentPosition({accuracy:t,timeoutMs:i,maximumAgeMs:r,retries:n,minimumAccuracyM:s,retryDelayMs:a}).then(e=>accept({position:e,error:null,loading:!1}),e=>accept({position:null,error:toGeoError(e),loading:!1}))},[t,i,r,n,s,a]);return useEffect(()=>{if(!o)return d.current+=1,void l(e=>e.loading||null!==e.position||null!==e.error?{position:null,error:null,loading:!1}:e);m()},[o,m]),{position:c.position,error:c.error,loading:c.loading,refresh:m}};
|
package/lib/module/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{buildCurl,logCurl}from"./api/curl.js";export{default as publicClient}from"./api/publicClient.js";export{attachRetry,isRetryableStatus}from"./api/retry.js";export{refreshAccessToken}from"./api/tokenRefresh.js";export{default as userClient,injectStore,injectUserAuth,RequestOfflineError,resetRefreshState,SESSION_TERMINATION_CODES}from"./api/userClient.js";export{ACCESS_TOKEN_KEY,getToken,REFRESH_TOKEN_KEY,removeToken,setKeychainImplementation,storeToken}from"./auth/authStore.js";export{decodeJWT,getJWTExpiry,isJWTExpired}from"./auth/jwt.js";export{getConfig,getConfigValue,resetConfig,setConfig}from"./config/index.js";export{DeepLink,parseDeepLink,useDeepLink}from"./deepLink/index.js";export{AsYouType,addDays,clampNationalNumber,countryFlagEmoji,detectPhoneCountry,diffMs,formatCompactNumber,formatCurrency,formatDate,formatDateDDMMMYYYY,formatDateISO,formatDatePattern,formatDateTime,formatNumber,formatPercent,formatPhone,formatPhoneAsTyped,formatRelativeTime,formatTime,formatTime12h,formatTimeInWindowsZone,formatTimeInZone,getCountries,getCountryCallingCode,getInitials,getPhoneCountries,isDateAfter,isDateBefore,isSameDay,isSupportedCountry,isValidNationalNumber,isValidPhoneNumber,maxNationalNumberLength,normalizePhone,parsePhoneNumber,parsePhoneNumberFromString,splitPhoneNumber,startOfDay,validatePhoneNumberLength}from"./formatters/index.js";export{initWebority}from"./initSDK.js";export{initUserAuth}from"./initUserAuth.js";export{configureLogger,getDeviceContext,Logger,setDeviceContext,setRemoteLogger}from"./logger/index.js";export{crashlyticsRemoteLogger}from"./logger/crashlytics.js";export{addNetworkStatusListener,getNetworkStatus,setNetworkStatusImplementation,useNetworkStatus}from"./network/index.js";export{PUSH_STATUS}from"./push/status.js";export{isStorageAvailable,Storage,setStorageImplementation}from"./storage/index.js";export{encodeBase64}from"./utils/base64.js";export{isAadhaar,isAlphanumeric,isBetween,isEmail,isGstin,isHexColor,isIfsc,isIndianMobile,isIndianPincode,isInteger,isNonEmpty,isNumeric,isPan,isPhone,isStrongPassword,isUrl,maxLength,minLength}from"./validators/index.js";export{setDeviceInfoImplementation,useVersionCheck,VersionCheck}from"./versionCheck/index.js";
|
|
1
|
+
"use strict";export{ACCOUNT_ID_HEADER,CLIENT_BUILD_HEADER,CLIENT_KIND,CLIENT_KIND_HEADER,getClientBuild}from"./api/clientHeaders.js";export{buildCurl,logCurl}from"./api/curl.js";export{addMinAppVersionListener,getMinAppVersion,MIN_APP_VERSION_HEADER}from"./api/minAppVersion.js";export{default as publicClient}from"./api/publicClient.js";export{applyRequestDefaults,newCorrelationId}from"./api/requestDefaults.js";export{attachRetry,IDEMPOTENCY_KEY_HEADER,isNeverSentError,isRetryableFailure,isRetryableStatus,retryAfterMs}from"./api/retry.js";export{refreshAccessToken}from"./api/tokenRefresh.js";export{default as userClient,injectStore,injectUserAuth,RequestOfflineError,resetRefreshState,SESSION_TERMINATION_CODES,SIGN_OUT_REASON_HEADER}from"./api/userClient.js";export{ACCESS_TOKEN_KEY,addSessionEndedListener,clearSession,getSessionUser,getToken,LEGACY_REFRESH_TOKEN_LIFETIME_MS,REFRESH_TOKEN_KEY,removeSessionUser,removeToken,SESSION_USER_KEY,setKeychainImplementation,setLegacyTokenKeys,storeSessionUser,storeToken}from"./auth/authStore.js";export{decodeJWT,getJWTExpiry,isJWTExpired}from"./auth/jwt.js";export{getConfig,getConfigValue,resetConfig,setConfig}from"./config/index.js";export{DeepLink,parseDeepLink,useDeepLink}from"./deepLink/index.js";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"./errors/index.js";export{AsYouType,addDays,clampNationalNumber,configureFormatters,countryFlagEmoji,detectPhoneCountry,diffMs,formatCompactNumber,formatCurrency,formatDate,formatDateDDMMMYYYY,formatDateISO,formatDatePattern,formatDateTime,formatMinor,formatNumber,formatPercent,formatPhone,formatPhoneAsTyped,formatRelative,formatRelativeTime,formatTime,formatTime12h,formatTimeInWindowsZone,formatTimeInZone,getCountries,getCountryCallingCode,getFormatterConfig,getInitials,getPhoneCountries,isDateAfter,isDateBefore,isSameDay,isSupportedCountry,isValidNationalNumber,isValidPhoneNumber,maxNationalNumberLength,normalizePhone,parsePhoneNumber,parsePhoneNumberFromString,splitPhoneNumber,startOfDay,validatePhoneNumberLength}from"./formatters/index.js";export{initWebority}from"./initSDK.js";export{initUserAuth}from"./initUserAuth.js";export{configureLogger,getDeviceContext,Logger,setDeviceContext,setRemoteLogger}from"./logger/index.js";export{crashlyticsRemoteLogger}from"./logger/crashlytics.js";export{addNetworkStatusListener,getNetworkStatus,setNetworkStatusImplementation,useNetworkStatus}from"./network/index.js";export{PUSH_STATUS}from"./push/status.js";export{isStorageAvailable,Storage,setStorageImplementation}from"./storage/index.js";export{encodeBase64}from"./utils/base64.js";export{isAadhaar,isAlphanumeric,isBetween,isEmail,isGstin,isHexColor,isIfsc,isIndianMobile,isIndianPincode,isInteger,isNonEmpty,isNumeric,isPan,isPhone,isStrongPassword,isUrl,maxLength,minLength}from"./validators/index.js";export{isBuildBelowMinimum,parseBuildNumber,setDeviceInfoImplementation,useVersionCheck,VersionCheck}from"./versionCheck/index.js";
|
package/lib/module/initSDK.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{setKeychainImplementation
|
|
1
|
+
"use strict";import{setKeychainImplementation}from"./auth/authStore.js";import{DEFAULT_CORRELATION_ID_HEADER,DEFAULT_LOG_LEVEL,DEFAULT_RETRIES,DEFAULT_TIMEOUT_MS,setConfig}from"./config/index.js";import{Logger}from"./logger/index.js";import{setNetworkStatusImplementation}from"./network/networkStatus.js";import{setStorageImplementation}from"./storage/index.js";export const initWebority=e=>{if(!e.baseUrl)throw new Error("baseUrl is required for Webority packages initialization");setConfig({baseUrl:e.baseUrl,loggingEnabled:e.loggingEnabled??!0,logLevel:e.logLevel||DEFAULT_LOG_LEVEL,environment:e.environment||"Development",country:(e.country||"in").toLowerCase(),appId:e.appId??null,appVersion:e.appVersion??null,commit:e.commit??null,appBuild:e.appBuild??null,appStoreId:e.appStoreId??null,logCurl:e.logCurl??!1,timeoutMs:e.timeoutMs??DEFAULT_TIMEOUT_MS,retries:e.retries??DEFAULT_RETRIES,correlationIdHeader:void 0===e.correlationIdHeader?DEFAULT_CORRELATION_ID_HEADER:e.correlationIdHeader});const t=e.backends;t?.storage&&setStorageImplementation(t.storage),t?.keychain&&setKeychainImplementation(t.keychain),t?.network&&setNetworkStatusImplementation(t.network),Logger.info("[@webority/mobile-core] initialized")};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{injectStore
|
|
1
|
+
"use strict";import{injectStore,injectUserAuth}from"./api/userClient.js";import{setLegacyTokenKeys}from"./auth/authStore.js";import{Logger}from"./logger/index.js";export const initUserAuth=(e,r)=>{if(!e)throw new Error("Redux store is required for user package initialization");if(!r.logout||!r.refresh?.path)throw new Error("initUserAuth needs a logout action and refresh.path");injectStore(e),injectUserAuth(r),setLegacyTokenKeys(r.legacyKeys??null),Logger.info("[@webority/mobile-core] user auth wired to the store")};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const describe=r=>{try{return JSON.stringify(r)}catch{return String(r)}};export const crashlyticsRemoteLogger=r=>{const send=t=>{try{const e=t(r.getCrashlytics());e&&"function"==typeof e.catch&&e.catch(()=>{})}catch{}};return{breadcrumb:(t,e)=>send(o=>r.log(o,e?`${t} ${describe(e)}`:t)),recordError:(t,e)=>{e&&send(t=>r.log(t,`context ${describe(e)}`)),send(e=>
|
|
1
|
+
"use strict";const toError=r=>r instanceof Error?r:new Error(String(r)),describe=r=>{try{return JSON.stringify(r)}catch{return String(r)}};export const crashlyticsRemoteLogger=r=>{const send=t=>{try{const e=t(r.getCrashlytics());e&&"function"==typeof e.catch&&e.catch(()=>{})}catch{}};return{breadcrumb:(t,e)=>send(o=>r.log(o,e?`${t} ${describe(e)}`:t)),recordError:(t,e)=>{e&&send(t=>r.log(t,`context ${describe(e)}`)),send(e=>r.recordError(e,toError(t)))},setUser:t=>send(e=>r.setUserId(e,t??"")),setAttribute:(t,e)=>send(o=>r.setAttribute(o,t,null===e?"":String(e))),log:(t,e)=>send(o=>r.log(o,`[${t.toUpperCase()}] ${e}`))}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getConfigValue
|
|
1
|
+
"use strict";import{getConfigValue}from"../config/index.js";import{redact,redactString}from"./redact.js";const Colors={RESET:"[0m",GRAY:"[90m",BLUE:"[34m",YELLOW:"[33m",RED_BOLD:"[31;1m"},LogLevels={DEBUG:{level:"debug",color:Colors.GRAY},INFO:{level:"info",color:Colors.BLUE},WARN:{level:"warn",color:Colors.YELLOW},ERROR:{level:"error",color:Colors.RED_BOLD}},isLogLevelAllowed=e=>{const r=["debug","info","warn","error"],o=getConfigValue("logLevel","info");return r.indexOf(e)>=r.indexOf(o)},isEnabled=()=>getConfigValue("loggingEnabled",!0);let remote=null;export const setRemoteLogger=e=>{remote=e};const safe=e=>{if(e)try{e()}catch{}},toErrorObject=e=>{if(e instanceof Error)return e;if("string"==typeof e)return new Error(e);try{return new Error(JSON.stringify(e))}catch{return new Error(String(e))}};let deviceContext=null;const normalizeAttributeValue=e=>null==e?null:"string"==typeof e||"number"==typeof e||"boolean"==typeof e?e:String(e);export const setDeviceContext=e=>{if(deviceContext=e,e)for(const[r,o]of Object.entries(e))safe(()=>remote?.setAttribute?.(r,normalizeAttributeValue(o)))};export const getDeviceContext=()=>deviceContext;const DEFAULT_LOGGER_OPTIONS={dedupeWindowMs:5e3,dedupeMaxPerWindow:1,screenHistoryLimit:20};let loggerOptions={...DEFAULT_LOGGER_OPTIONS};export const configureLogger=e=>{loggerOptions={...loggerOptions,...e},screenHistory.length>loggerOptions.screenHistoryLimit&&(screenHistory=screenHistory.slice(screenHistory.length-loggerOptions.screenHistoryLimit))};let currentScreen=null,screenHistory=[];const dedupeMap=new Map,MAX_DEDUPE_ENTRIES=200,dedupeKeyFor=e=>{const r=e.stack?.split("\n")[1]?.trim();return r?`${e.message}::${r}`:e.message},capDedupeMap=()=>{for(;dedupeMap.size>200;){const e=dedupeMap.keys().next().value;if(void 0===e)return;dedupeMap.delete(e)}},shouldForward=e=>{if(loggerOptions.dedupeWindowMs<=0)return{forward:!0};const r=Date.now(),o=dedupeMap.get(e);if(!o||r-o.windowStart>=loggerOptions.dedupeWindowMs){const t=o?.suppressedCount??0;return dedupeMap.set(e,{windowStart:r,count:1,suppressedCount:0}),capDedupeMap(),t>0?{forward:!0,suppressedCount:t}:{forward:!0}}return o.count+=1,o.count>loggerOptions.dedupeMaxPerWindow?(o.suppressedCount+=1,{forward:!1}):{forward:!0}},buildErrorContext=(e,r)=>{const o={...deviceContext};return null!==currentScreen&&(o.screen=currentScreen),r&&(o.suppressedCount=r),{...o,...e}},forwardErrorToRemote=(e,r)=>{const o=dedupeKeyFor(e),{forward:t,suppressedCount:n}=shouldForward(o);t&&safe(()=>remote?.recordError?.(e,buildErrorContext(r,n)))},logDebug=(e,...r)=>{isEnabled()&&isLogLevelAllowed(LogLevels.DEBUG.level)&&console.debug(`${LogLevels.DEBUG.color}[DEBUG]: ${redactString(e)}${Colors.RESET}`,...redact(r))},logInfo=(e,...r)=>{const o=redactString(e),t=redact(r);isEnabled()&&isLogLevelAllowed(LogLevels.INFO.level)&&(console.info(`${LogLevels.INFO.color}[INFO]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("info",o,t)))},logWarning=(e,...r)=>{const o=redactString(e),t=redact(r);isEnabled()&&isLogLevelAllowed(LogLevels.WARN.level)&&(console.warn(`${LogLevels.WARN.color}[WARNING]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("warn",o,t)))},logError=(e,...r)=>{const o=redactString(e),t=redact(r);isEnabled()&&isLogLevelAllowed(LogLevels.ERROR.level)&&console.error(`${LogLevels.ERROR.color}[ERROR]: ${o}${Colors.RESET}`,...t),safe(()=>remote?.log?.("error",o,t));const n=t[0];void 0!==n&&forwardErrorToRemote(toErrorObject(n),{source:"Logger.error",message:o})},breadcrumb=(e,r)=>{const o=redactString(e),t=redact(r);isEnabled()&&isLogLevelAllowed("info")&&console.info(`${Colors.BLUE}[BREADCRUMB]: ${o}${Colors.RESET}`,t??""),safe(()=>remote?.breadcrumb?.(o,t))},recordError=(e,r)=>{const o=redact(toErrorObject(e)),t=redact(r);isEnabled()&&isLogLevelAllowed("error")&&console.error(`${Colors.RED_BOLD}[RECORDED]: ${o.message}${Colors.RESET}`,t??""),forwardErrorToRemote(o,t)},asDict=e=>"object"==typeof e&&null!==e?e:null,headerValue=(e,r)=>{const o=asDict(e);if(!o)return null;const t="function"==typeof o.get?o.get.call(e,r):o[r]??o[r.toLowerCase()];return"string"==typeof t&&""!==t?t:null},requestFailed=(e,r={})=>{const{label:o,expectedStatuses:t=[],...n}=r,s=asDict(e),l=asDict(s?.config),c=asDict(s?.response),i=asDict(c?.data),d="number"==typeof c?.status?c.status:null,a="string"==typeof l?.method?l.method.toUpperCase():null,g="string"==typeof l?.url?l.url.split("?")[0]??null:null,u=o??([a,g].filter(Boolean).join(" ")||"Request");if("CanceledError"===s?.name||"ERR_CANCELED"===s?.code||!0===s?.__CANCEL__)return void logInfo(`${u} canceled`);if(null!==d&&t.includes(d))return void logWarning(`${u} refused (${d})`);const E="string"==typeof s?.message?s.message:e instanceof Error?e.message:null,f=redactString(null===d?`${u} failed`:`${u} failed (${d})`);isEnabled()&&isLogLevelAllowed(LogLevels.ERROR.level)&&console.error(`${LogLevels.ERROR.color}[ERROR]: ${f}${Colors.RESET}`,redactString(E??"")),safe(()=>remote?.log?.("error",f,[]));const p=getConfigValue("correlationIdHeader",null),L=redact({source:"Logger.requestFailed",label:u,status:d,method:a,path:g,code:"string"==typeof i?.code?i.code:null,traceId:"string"==typeof i?.traceId?i.traceId:null,correlationId:p?headerValue(l?.headers,p):null,detail:E,...n});forwardErrorToRemote(redact(new Error(f)),L)},setUser=(e,r)=>{safe(()=>remote?.setUser?.(e,r))},setAttribute=(e,r)=>{safe(()=>remote?.setAttribute?.(e,r))},trackScreen=(e,r)=>{e!==currentScreen&&(currentScreen=e,screenHistory.push(e),screenHistory.length>loggerOptions.screenHistoryLimit&&(screenHistory=screenHistory.slice(screenHistory.length-loggerOptions.screenHistoryLimit)),breadcrumb(`Screen: ${e}`,r))},getCurrentScreen=()=>currentScreen,getScreenHistory=()=>[...screenHistory];export const Logger={debug:logDebug,info:logInfo,warn:logWarning,error:logError,breadcrumb:breadcrumb,recordError:recordError,requestFailed:requestFailed,setUser:setUser,setAttribute:setAttribute,trackScreen:trackScreen,getCurrentScreen:getCurrentScreen,getScreenHistory:getScreenHistory};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
"use strict";const REDACTED="[REDACTED]",SECRET_KEYS=/^(token|accesstoken|refreshtoken|password|authorization)$/i,BEARER=/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi,JWT=/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/g,KEYED_VALUE=/(["']?(?:token|accessToken|refreshToken|password|authorization)["']?\s*[:=]\s*)(?:"(?:[^"\\]|\\.)*"|'[^']*'|[^\s,;&}]+)/gi,MAX_DEPTH=6;export const redactString=e=>e.replace(BEARER,`Bearer ${REDACTED}`).replace(JWT,REDACTED).replace(KEYED_VALUE,(e,r)=>`${r}"${REDACTED}"`);const redactInner=(e,r,t)=>{if("string"==typeof e)return redactString(e);if(null===e||"object"!=typeof e)return e;if(e instanceof Error)return e.message=redactString(e.message),e.stack&&(e.stack=redactString(e.stack)),e;if(r>=6||t.has(e))return e;if(t.add(e),Array.isArray(e))return e.map(e=>redactInner(e,r+1,t));const n=Object.getPrototypeOf(e);if(n!==Object.prototype&&null!==n)return e;const a={};for(const[n,s]of Object.entries(e))a[n]=SECRET_KEYS.test(n)?REDACTED:redactInner(s,r+1,t);return a};export const redact=e=>redactInner(e,0,new WeakSet);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{addNetworkStatusListener,getNetworkStatus,setNetworkStatusImplementation,useNetworkStatus}from"./networkStatus.js";
|
|
1
|
+
"use strict";export{addNetworkStatusListener,getNetworkStatus,setNetworkStatusImplementation,useNetworkStatus}from"./networkStatus.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
"use strict";import*as ExpoNetwork from"expo-network";import{useEffect,useState}from"react";import{Logger}from"../logger/index.js";const DEFAULT_STATUS={isConnected:!0,isInternetReachable:null,type:"unknown"};let override=null,lastKnown=null,stopFollowing=null;const stopFollowingNetwork=()=>{stopFollowing?.(),stopFollowing=null,lastKnown=null};export const setNetworkStatusImplementation=t=>{override=t,stopFollowingNetwork()};const resolveNetInfo=()=>override??expoNetworkBackend,expoNetworkBackend={fetch:async()=>{const t=await ExpoNetwork.getNetworkStateAsync();return{isConnected:!1!==t?.isConnected,isInternetReachable:t?.isInternetReachable??null,type:t?.type?String(t.type).toLowerCase():void 0}},addEventListener:t=>{const e=ExpoNetwork.addNetworkStateListener(e=>{t({isConnected:!1!==e?.isConnected,isInternetReachable:e?.isInternetReachable??null,type:e?.type?String(e.type).toLowerCase():void 0})});return()=>e.remove()}},normalize=t=>t?{isConnected:!1!==t.isConnected,isInternetReachable:t.isInternetReachable,type:t.type??"unknown"}:DEFAULT_STATUS;export const getNetworkStatus=async()=>{const t=resolveNetInfo();if(!t)return DEFAULT_STATUS;try{const e=await t.fetch();return normalize(e)}catch(t){return Logger.error("[network] getNetworkStatus failed",t),DEFAULT_STATUS}};export const addNetworkStatusListener=t=>{const e=resolveNetInfo();return e?e.addEventListener(e=>t(normalize(e))):()=>{}};export const getLastKnownNetworkStatus=async()=>{if(!stopFollowing)try{stopFollowing=addNetworkStatusListener(t=>{lastKnown=t})}catch(t){return Logger.error("[network] could not follow network changes",t),getNetworkStatus()}if(lastKnown&&!1!==lastKnown.isConnected)return lastKnown;const t=stopFollowing,e=lastKnown,o=await getNetworkStatus();return stopFollowing!==t?o:(lastKnown===e&&(lastKnown=o),lastKnown??o)};export const useNetworkStatus=()=>{const[t,e]=useState(DEFAULT_STATUS);return useEffect(()=>{let t=!0;getNetworkStatus().then(o=>{t&&e(o)});const o=addNetworkStatusListener(o=>{t&&e(o)});return()=>{t=!1,o()}},[]),t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerPermissionAdapter
|
|
1
|
+
"use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-calendar");registerPermissionAdapter("calendar",{check:m.getCalendarPermissionsAsync,request:m.requestCalendarPermissionsAsync}),registerPermissionAdapter("reminders",{check:m.getRemindersPermissionsAsync,request:m.requestRemindersPermissionsAsync});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerPermissionAdapter
|
|
1
|
+
"use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-camera");registerPermissionAdapter("camera",{check:()=>m.Camera.getCameraPermissionsAsync(),request:()=>m.Camera.requestCameraPermissionsAsync()}),registerPermissionAdapter("microphone",{check:()=>m.Camera.getMicrophonePermissionsAsync(),request:()=>m.Camera.requestMicrophonePermissionsAsync()});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerPermissionAdapter
|
|
1
|
+
"use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-contacts");registerPermissionAdapter("contacts",{check:m.getPermissionsAsync,request:m.requestPermissionsAsync});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Linking
|
|
1
|
+
"use strict";import{Linking}from"react-native";import{Logger}from"../logger/index.js";let backend=null;export const setPermissionsImplementation=e=>{backend=e};const registry=new Map;export const registerPermissionAdapter=(e,t)=>{registry.set(e,t)};const resolveExpoModule=e=>registry.get(e)??null,toStatus=e=>e?"limited"===e.accessPrivileges?"limited":"granted"===e.status?"granted":"denied"===e.status?e.canAskAgain?"denied":"blocked":"denied":"unavailable",checkPermission=async e=>{if(backend)return backend.check(e);const t=resolveExpoModule(e);if(!t)return"unavailable";try{return toStatus(await t.check())}catch(t){return Logger.error(`[permissions] check(${e}) failed`,t),"unavailable"}},requestPermission=async e=>{if(backend)return backend.request(e);const t=resolveExpoModule(e);if(!t)return"unavailable";try{return toStatus(await t.request())}catch(t){return Logger.error(`[permissions] request(${e}) failed`,t),"unavailable"}},openAppSettings=async()=>{try{return await Linking.openSettings(),!0}catch(e){return Logger.error("[permissions] openAppSettings failed",e),!1}};export const Permissions={check:checkPermission,request:requestPermission,isAuthorized:async e=>{const t=await checkPermission(e);return"granted"===t||"limited"===t},ensure:async e=>{const t=await checkPermission(e);return"granted"===t||"limited"===t||"blocked"===t||"unavailable"===t?t:requestPermission(e)},openSettings:openAppSettings};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerPermissionAdapter
|
|
1
|
+
"use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-location");registerPermissionAdapter("location",{check:m.getForegroundPermissionsAsync,request:m.requestForegroundPermissionsAsync}),registerPermissionAdapter("locationAlways",{check:m.getBackgroundPermissionsAsync,request:m.requestBackgroundPermissionsAsync});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerPermissionAdapter
|
|
1
|
+
"use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-media-library");registerPermissionAdapter("mediaLibrary",{check:m.getPermissionsAsync,request:m.requestPermissionsAsync});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerPermissionAdapter
|
|
1
|
+
"use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-notifications");registerPermissionAdapter("notifications",{check:m.getPermissionsAsync,request:m.requestPermissionsAsync});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerPermissionAdapter
|
|
1
|
+
"use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-image-picker");registerPermissionAdapter("photos",{check:()=>m.getMediaLibraryPermissionsAsync(!1),request:()=>m.requestMediaLibraryPermissionsAsync(!1)}),registerPermissionAdapter("photosAdd",{check:()=>m.getMediaLibraryPermissionsAsync(!0),request:()=>m.requestMediaLibraryPermissionsAsync(!0)});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PHONE_COUNTRY_NAMES={AF:"Afghanistan",AX:"Åland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AG:"Antigua and Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AC:"Ascension Island",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia",BA:"Bosnia and Herzegovina",BW:"Botswana",BR:"Brazil",IO:"British Indian Ocean Territory",VG:"British Virgin Islands",BN:"Brunei",BG:"Bulgaria",BF:"Burkina Faso",BI:"Burundi",KH:"Cambodia",CM:"Cameroon",CA:"Canada",CV:"Cape Verde",BQ:"Caribbean Netherlands",KY:"Cayman Islands",CF:"Central African Republic",TD:"Chad",CL:"Chile",CN:"China",CX:"Christmas Island",CC:"Cocos (Keeling) Islands",CO:"Colombia",KM:"Comoros",CG:"Congo - Brazzaville",CD:"Congo - Kinshasa",CK:"Cook Islands",CR:"Costa Rica",CI:"Côte d’Ivoire",HR:"Croatia",CU:"Cuba",CW:"Curaçao",CY:"Cyprus",CZ:"Czechia",DK:"Denmark",DJ:"Djibouti",DM:"Dominica",DO:"Dominican Republic",EC:"Ecuador",EG:"Egypt",SV:"El Salvador",GQ:"Equatorial Guinea",ER:"Eritrea",EE:"Estonia",SZ:"Eswatini",ET:"Ethiopia",FK:"Falkland Islands",FO:"Faroe Islands",FJ:"Fiji",FI:"Finland",FR:"France",GF:"French Guiana",PF:"French Polynesia",GA:"Gabon",GM:"Gambia",GE:"Georgia",DE:"Germany",GH:"Ghana",GI:"Gibraltar",GR:"Greece",GL:"Greenland",GD:"Grenada",GP:"Guadeloupe",GU:"Guam",GT:"Guatemala",GG:"Guernsey",GN:"Guinea",GW:"Guinea-Bissau",GY:"Guyana",HT:"Haiti",HN:"Honduras",HK:"Hong Kong SAR China",HU:"Hungary",IS:"Iceland",IN:"India",ID:"Indonesia",IR:"Iran",IQ:"Iraq",IE:"Ireland",IM:"Isle of Man",IL:"Israel",IT:"Italy",JM:"Jamaica",JP:"Japan",JE:"Jersey",JO:"Jordan",KZ:"Kazakhstan",KE:"Kenya",KI:"Kiribati",XK:"Kosovo",KW:"Kuwait",KG:"Kyrgyzstan",LA:"Laos",LV:"Latvia",LB:"Lebanon",LS:"Lesotho",LR:"Liberia",LY:"Libya",LI:"Liechtenstein",LT:"Lithuania",LU:"Luxembourg",MO:"Macao SAR China",MG:"Madagascar",MW:"Malawi",MY:"Malaysia",MV:"Maldives",ML:"Mali",MT:"Malta",MH:"Marshall Islands",MQ:"Martinique",MR:"Mauritania",MU:"Mauritius",YT:"Mayotte",MX:"Mexico",FM:"Micronesia",MD:"Moldova",MC:"Monaco",MN:"Mongolia",ME:"Montenegro",MS:"Montserrat",MA:"Morocco",MZ:"Mozambique",MM:"Myanmar (Burma)",NA:"Namibia",NR:"Nauru",NP:"Nepal",NL:"Netherlands",NC:"New Caledonia",NZ:"New Zealand",NI:"Nicaragua",NE:"Niger",NG:"Nigeria",NU:"Niue",NF:"Norfolk Island",KP:"North Korea",MK:"North Macedonia",MP:"Northern Mariana Islands",NO:"Norway",OM:"Oman",PK:"Pakistan",PW:"Palau",PS:"Palestinian Territories",PA:"Panama",PG:"Papua New Guinea",PY:"Paraguay",PE:"Peru",PH:"Philippines",PL:"Poland",PT:"Portugal",PR:"Puerto Rico",QA:"Qatar",RE:"Réunion",RO:"Romania",RU:"Russia",RW:"Rwanda",WS:"Samoa",SM:"San Marino",ST:"São Tomé and Príncipe",SA:"Saudi Arabia",SN:"Senegal",RS:"Serbia",SC:"Seychelles",SL:"Sierra Leone",SG:"Singapore",SX:"Sint Maarten",SK:"Slovakia",SI:"Slovenia",SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",KR:"South Korea",SS:"South Sudan",ES:"Spain",LK:"Sri Lanka",BL:"St. Barthélemy",SH:"St. Helena",KN:"St. Kitts and Nevis",LC:"St. Lucia",MF:"St. Martin",PM:"St. Pierre and Miquelon",VC:"St. Vincent and Grenadines",SD:"Sudan",SR:"Suriname",SJ:"Svalbard and Jan Mayen",SE:"Sweden",CH:"Switzerland",SY:"Syria",TW:"Taiwan",TJ:"Tajikistan",TZ:"Tanzania",TH:"Thailand",TL:"Timor-Leste",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad and Tobago",TA:"Tristan da Cunha",TN:"Tunisia",TR:"Türkiye",TM:"Turkmenistan",TC:"Turks and Caicos Islands",TV:"Tuvalu",VI:"U.S. Virgin Islands",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VA:"Vatican City",VE:"Venezuela",VN:"Vietnam",WF:"Wallis and Futuna",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"};
|
|
1
|
+
"use strict";export const PHONE_COUNTRY_NAMES={AF:"Afghanistan",AX:"Åland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AG:"Antigua and Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AC:"Ascension Island",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia",BA:"Bosnia and Herzegovina",BW:"Botswana",BR:"Brazil",IO:"British Indian Ocean Territory",VG:"British Virgin Islands",BN:"Brunei",BG:"Bulgaria",BF:"Burkina Faso",BI:"Burundi",KH:"Cambodia",CM:"Cameroon",CA:"Canada",CV:"Cape Verde",BQ:"Caribbean Netherlands",KY:"Cayman Islands",CF:"Central African Republic",TD:"Chad",CL:"Chile",CN:"China",CX:"Christmas Island",CC:"Cocos (Keeling) Islands",CO:"Colombia",KM:"Comoros",CG:"Congo - Brazzaville",CD:"Congo - Kinshasa",CK:"Cook Islands",CR:"Costa Rica",CI:"Côte d’Ivoire",HR:"Croatia",CU:"Cuba",CW:"Curaçao",CY:"Cyprus",CZ:"Czechia",DK:"Denmark",DJ:"Djibouti",DM:"Dominica",DO:"Dominican Republic",EC:"Ecuador",EG:"Egypt",SV:"El Salvador",GQ:"Equatorial Guinea",ER:"Eritrea",EE:"Estonia",SZ:"Eswatini",ET:"Ethiopia",FK:"Falkland Islands",FO:"Faroe Islands",FJ:"Fiji",FI:"Finland",FR:"France",GF:"French Guiana",PF:"French Polynesia",GA:"Gabon",GM:"Gambia",GE:"Georgia",DE:"Germany",GH:"Ghana",GI:"Gibraltar",GR:"Greece",GL:"Greenland",GD:"Grenada",GP:"Guadeloupe",GU:"Guam",GT:"Guatemala",GG:"Guernsey",GN:"Guinea",GW:"Guinea-Bissau",GY:"Guyana",HT:"Haiti",HN:"Honduras",HK:"Hong Kong SAR China",HU:"Hungary",IS:"Iceland",IN:"India",ID:"Indonesia",IR:"Iran",IQ:"Iraq",IE:"Ireland",IM:"Isle of Man",IL:"Israel",IT:"Italy",JM:"Jamaica",JP:"Japan",JE:"Jersey",JO:"Jordan",KZ:"Kazakhstan",KE:"Kenya",KI:"Kiribati",XK:"Kosovo",KW:"Kuwait",KG:"Kyrgyzstan",LA:"Laos",LV:"Latvia",LB:"Lebanon",LS:"Lesotho",LR:"Liberia",LY:"Libya",LI:"Liechtenstein",LT:"Lithuania",LU:"Luxembourg",MO:"Macao SAR China",MG:"Madagascar",MW:"Malawi",MY:"Malaysia",MV:"Maldives",ML:"Mali",MT:"Malta",MH:"Marshall Islands",MQ:"Martinique",MR:"Mauritania",MU:"Mauritius",YT:"Mayotte",MX:"Mexico",FM:"Micronesia",MD:"Moldova",MC:"Monaco",MN:"Mongolia",ME:"Montenegro",MS:"Montserrat",MA:"Morocco",MZ:"Mozambique",MM:"Myanmar (Burma)",NA:"Namibia",NR:"Nauru",NP:"Nepal",NL:"Netherlands",NC:"New Caledonia",NZ:"New Zealand",NI:"Nicaragua",NE:"Niger",NG:"Nigeria",NU:"Niue",NF:"Norfolk Island",KP:"North Korea",MK:"North Macedonia",MP:"Northern Mariana Islands",NO:"Norway",OM:"Oman",PK:"Pakistan",PW:"Palau",PS:"Palestinian Territories",PA:"Panama",PG:"Papua New Guinea",PY:"Paraguay",PE:"Peru",PH:"Philippines",PL:"Poland",PT:"Portugal",PR:"Puerto Rico",QA:"Qatar",RE:"Réunion",RO:"Romania",RU:"Russia",RW:"Rwanda",WS:"Samoa",SM:"San Marino",ST:"São Tomé and Príncipe",SA:"Saudi Arabia",SN:"Senegal",RS:"Serbia",SC:"Seychelles",SL:"Sierra Leone",SG:"Singapore",SX:"Sint Maarten",SK:"Slovakia",SI:"Slovenia",SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",KR:"South Korea",SS:"South Sudan",ES:"Spain",LK:"Sri Lanka",BL:"St. Barthélemy",SH:"St. Helena",KN:"St. Kitts and Nevis",LC:"St. Lucia",MF:"St. Martin",PM:"St. Pierre and Miquelon",VC:"St. Vincent and Grenadines",SD:"Sudan",SR:"Suriname",SJ:"Svalbard and Jan Mayen",SE:"Sweden",CH:"Switzerland",SY:"Syria",TW:"Taiwan",TJ:"Tajikistan",TZ:"Tanzania",TH:"Thailand",TL:"Timor-Leste",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad and Tobago",TA:"Tristan da Cunha",TN:"Tunisia",TR:"Türkiye",TM:"Turkmenistan",TC:"Turks and Caicos Islands",TV:"Tuvalu",VI:"U.S. Virgin Islands",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VA:"Vatican City",VE:"Venezuela",VN:"Vietnam",WF:"Wallis and Futuna",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"};
|
package/lib/module/push/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{disablePush,enablePush,initPush,notifyLocal,onAction,setBadgeCount,setCategories,setPushImplementation,usePush}from"./push.js";export{PUSH_STATUS}from"./status.js";
|
|
1
|
+
"use strict";export{disablePush,enablePush,initPush,notifyLocal,onAction,setBadgeCount,setCategories,setPushImplementation,usePush}from"./push.js";export{PUSH_STATUS}from"./status.js";
|
package/lib/module/push/push.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useSyncExternalStore
|
|
1
|
+
"use strict";import{useSyncExternalStore}from"react";import{Platform}from"react-native";import{Logger}from"../logger/index.js";let resolved,override=null;export const setPushImplementation=e=>{override=e};export const resolveModules=()=>{if(override)return override;if(void 0!==resolved)return resolved;try{if(require("expo").isRunningInExpoGo())return resolved=null,resolved;const e=require("expo-notifications"),t=require("expo-application");resolved={notifications:e,applicationId:t.applicationId}}catch(e){Logger.warn("[push] expo-notifications is not available; push is off",e),resolved=null}return resolved};let state={status:"unknown",enabled:!1};const subscribers=new Set,setState=e=>{state={...state,...e};for(const e of subscribers)e()};let config=null,channelsReady=Promise.resolve(),tokenSubscription=null,actionHandler=null,listening=!1;const pendingResponses=[],routedAt=new Map,REPEAT_WINDOW_MS=1e4,requireConfig=()=>{if(!config)throw new Error("[@webority/mobile-core] call initPush before enablePush or disablePush.");return config},toPermissionStatus=e=>e.granted?"granted":"denied"===e.status?"denied":"unknown",toStringData=e=>{const t={};for(const[n,o]of Object.entries(e??{}))null!=o&&(t[n]="object"==typeof o?JSON.stringify(o):String(o));return t},contentData=e=>{const t=e.notification.request.content;if(t.data)return toStringData(t.data);if("string"==typeof t.dataString)try{return toStringData(JSON.parse(t.dataString))}catch(e){Logger.error("[push] notification data is not JSON",e)}return{}},triggerData=e=>{const t=e.notification.request.trigger,n={...t?.remoteMessage?.data??{}};for(const[e,o]of Object.entries(t?.payload??{}))"aps"===e||"body"===e&&"object"==typeof o||(n[e]=o);return toStringData(n)},responseData=e=>({...triggerData(e),...contentData(e)});export const toPushAction=e=>({actionId:e.actionIdentifier,...e.userText?{userText:e.userText}:{},data:responseData(e),notificationId:e.notification.request.identifier});export const toNotificationActions=e=>e.map(e=>({identifier:e.id,buttonTitle:e.title,...e.textInput?{textInput:{submitButtonTitle:e.textInput.submitTitle,placeholder:e.textInput.placeholder}}:{},options:{opensAppToForeground:e.opensApp??!0,isDestructive:e.destructive??!1,isAuthenticationRequired:e.authenticationRequired??!1}}));const routeResponse=async(e,t)=>{const n=`${t.notification.request.identifier}:${t.actionIdentifier}`,o=routedAt.get(n);if(void 0!==o&&Date.now()-o<1e4)return;if(t.actionIdentifier!==e.DEFAULT_ACTION_IDENTIFIER&&actionHandler){routedAt.set(n,Date.now());try{await actionHandler(toPushAction(t))}catch(e){Logger.error("[push] onAction threw",e)}}else if(config){routedAt.set(n,Date.now());try{config.onOpen(responseData(t))}catch(e){Logger.error("[push] onOpen threw",e)}}else pendingResponses.push(t)},drainPending=async e=>{const t=pendingResponses.splice(0);for(const n of t)await routeResponse(e,n)},listenForResponses=e=>{listening||(listening=!0,e.addNotificationResponseReceivedListener(t=>{routeResponse(e,t)}),e.getLastNotificationResponseAsync().then(async t=>(t&&await routeResponse(e,t),e.clearLastNotificationResponseAsync?.())).catch(e=>Logger.error("[push] reading the launch notification failed",e)))};export const routeTaskPayload=async e=>{const t=resolveModules(),n=e;t&&"string"==typeof n?.actionIdentifier&&"string"==typeof n.notification?.request?.identifier&&await routeResponse(t.notifications,n)};const createChannels=async(e,t)=>{for(const n of t)try{await e.setNotificationChannelAsync(n.id,{name:n.name,importance:"high"===n.importance?e.AndroidImportance.HIGH:e.AndroidImportance.DEFAULT})}catch(e){Logger.error(`[push] creating channel ${n.id} failed`,e)}},toDevice=async(e,t)=>{const n="android"===e.type?"Fcm":"ios"===e.type?"Apns":null;if(!n||"string"!=typeof e.data)return null;if(!t)throw new Error("[@webority/mobile-core] push needs the app bundle id from expo-application.");return{installationId:await requireConfig().getInstallationId(),platform:n,token:e.data,appId:t}};export const initPush=e=>{const t=null===config;if(config=e,!t)return;const n=resolveModules();if(!n)return void setState({status:"unavailable"});const o=n.notifications;o.setNotificationHandler({handleNotification:async()=>{const e=config?.showInForeground?.()??!0;return{shouldShowBanner:e,shouldShowList:e,shouldPlaySound:e&&(config?.playSoundInForeground?.()??!0),shouldSetBadge:!0}}}),"android"===Platform.OS&&e.androidChannels?.length&&(channelsReady=createChannels(o,e.androidChannels)),listenForResponses(o),drainPending(o),o.getPermissionsAsync().then(e=>setState({status:toPermissionStatus(e)})).catch(e=>Logger.error("[push] permission check failed",e))};let registering=null,registeredKey=null;const registerOnce=e=>{const t=JSON.stringify(e);if(registering?.key===t)return registering.promise;const n=requireConfig().register(e).then(()=>{registeredKey=t}).finally(()=>{registering?.promise===n&&(registering=null)});return registering={key:t,promise:n},n};export const enablePush=async()=>{requireConfig();const e=resolveModules();if(!e)return setState({status:"unavailable"}),"unavailable";const t=e.notifications;await channelsReady;let n=await t.getPermissionsAsync();if(n.granted||(n=await t.requestPermissionsAsync()),!n.granted)return setState({status:"denied"}),"denied";const o=await toDevice(await t.getDevicePushTokenAsync(),e.applicationId);return o?(await registerOnce(o),tokenSubscription?.remove(),tokenSubscription=t.addPushTokenListener(t=>{toDevice(t,e.applicationId).then(e=>e&&JSON.stringify(e)!==registeredKey?registerOnce(e):void 0).catch(e=>Logger.error("[push] re-registering a new token failed",e))}),setState({status:"granted",enabled:!0}),"granted"):(setState({status:"unavailable"}),"unavailable")};export const disablePush=async()=>{const e=requireConfig();tokenSubscription?.remove(),tokenSubscription=null,registeredKey=null,setState({enabled:!1}),await e.unregister(await e.getInstallationId())};export const setBadgeCount=async e=>{const t=resolveModules();t&&await t.notifications.setBadgeCountAsync(e)};export const setCategories=async e=>{const t=resolveModules();if(t)for(const n of e)await t.notifications.setNotificationCategoryAsync(n.id,toNotificationActions(n.actions))};export const onAction=e=>{actionHandler=e;const t=resolveModules();return t&&(listenForResponses(t.notifications),drainPending(t.notifications)),()=>{actionHandler===e&&(actionHandler=null)}};export const notifyLocal=async({title:e,body:t,data:n})=>{const o=resolveModules();o&&await o.notifications.scheduleNotificationAsync({content:{title:e,body:t,data:n??{}},trigger:null})};const subscribe=e=>(subscribers.add(e),()=>{subscribers.delete(e)}),getSnapshot=()=>state,enable=async()=>{await enablePush()};export const usePush=()=>({...useSyncExternalStore(subscribe,getSnapshot,getSnapshot),enable:enable,disable:disablePush});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PUSH_STATUS={unknown:"unknown",granted:"granted",denied:"denied",unavailable:"unavailable"};
|
|
1
|
+
"use strict";export const PUSH_STATUS={unknown:"unknown",granted:"granted",denied:"denied",unavailable:"unavailable"};
|
package/lib/module/push/task.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Platform
|
|
1
|
+
"use strict";import{Platform}from"react-native";import{Logger}from"../logger/index.js";import{onAction,resolveModules,routeTaskPayload}from"./push.js";const PUSH_ACTION_TASK="webority-push-action";export const definePushActionTask=o=>{onAction(o);const r=resolveModules();if(!r||"android"!==Platform.OS)return;require("expo-task-manager").defineTask(PUSH_ACTION_TASK,async({data:o,error:r})=>{r?Logger.error("[push] the notification task failed",r):await routeTaskPayload(o)}),r.notifications.registerTaskAsync(PUSH_ACTION_TASK).catch(o=>Logger.error("[push] registering the notification task failed",o))};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import axios from"axios";import{extractApiError}from"../errors/index.js";export const createApiBaseQuery=({client:t,publicClient:e})=>async(r,{signal:s},a)=>{const i="string"==typeof r?{url:r}:r,o=i.silent??a?.silent??!1;if(i.public&&!e)throw new Error(`createApiBaseQuery: "${i.url}" is marked public but no publicClient was passed.`);const n=i.public?e:t,u={url:i.url,method:i.method??"GET",data:i.data,params:i.params,headers:i.headers,responseType:i.responseType,timeout:i.timeout,signal:s};try{const t=await n.request(u);return{data:t.data,meta:{silent:o,status:t.status}}}catch(t){const e=extractApiError(t),r=axios.isCancel(t);return{error:e,meta:{silent:o||r,status:e.status}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import{createApi}from"@reduxjs/toolkit/query/react";export const APP_API_DEFAULTS={keepUnusedDataFor:60,refetchOnReconnect:!0,refetchOnFocus:!0};export const createAppApi=e=>createApi({...APP_API_DEFAULTS,...e});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";export{createApiBaseQuery}from"./apiBaseQuery.js";export{APP_API_DEFAULTS,createAppApi}from"./createAppApi.js";export{setupApiListeners}from"./listeners.js";export{buildListQuery,getNextPageParam,getPreviousPageParam,hasNextPage,hasPreviousPage}from"./paging.js";export{itemTag,LIST_TAG_ID,listTag,providesList,providesPagedList}from"./tags.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import{setupListeners}from"@reduxjs/toolkit/query";import{AppState}from"react-native";import{addNetworkStatusListener}from"../network/index.js";export const setupApiListeners=t=>setupListeners(t,(t,{onFocus:e,onFocusLost:n,onOnline:s,onOffline:o})=>{let r="active"===AppState.currentState;const i=AppState.addEventListener("change",s=>{const o="active"===s;o!==r&&(r=o,t(o?e():n()))});let a=!0;const p=addNetworkStatusListener(({isConnected:e})=>{e!==a&&(a=e,t(e?s():o()))});return()=>{i.remove(),p()}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";export const buildListQuery=({page:e,pageSize:r,sortBy:t,sortOrder:a,filters:o})=>{const s={},put=(e,r)=>{null!=r&&""!==r&&(s[e]=r)};put("page",e),put("pageSize",r),put("sortBy",t),put("sortOrder",a);for(const[e,r]of Object.entries(o??{})){if("page"===e||"pageSize"===e||"sortBy"===e||"sortOrder"===e)throw new Error(`buildListQuery: filter "${e}" collides with a paging parameter.`);put(e,r)}return s};export const hasNextPage=e=>e.page<e.totalPages;export const hasPreviousPage=e=>e.page>1;export const getNextPageParam=e=>hasNextPage(e)?e.page+1:void 0;export const getPreviousPageParam=e=>hasPreviousPage(e)?e.page-1:void 0;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";export const LIST_TAG_ID="LIST";const byPublicId=t=>t.publicId;export const listTag=t=>({type:t,id:"LIST"});export const itemTag=(t,i)=>({type:t,id:i});export function providesList(t,i,e){const s=e??byPublicId;return[listTag(t),...(i??[]).map(i=>itemTag(t,s(i)))]}export function providesPagedList(t,i){const e=i??byPublicId;return i=>providesList(t,i?.items,e)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import{extractApiError,REQUEST_CANCELED_CODE}from"../errors/extractApiError.js";const isDict=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),hasSilent=e=>isDict(e)&&!0===e.silent;export const isSilentRejection=e=>hasSilent(e)||hasSilent(e.arg)||isDict(e.arg)&&hasSilent(e.arg.originalArgs)||hasSilent(e.baseQueryMeta);export function errorToastMiddleware(e){const{showToast:t,ignoreCodes:r=[],ignoreStatuses:s=[401],dedupeMs:i=4e3,onRejected:n}=e,o=new Map;return e=>a=>c=>{const u=a(c);if(!isDict(c)||!isDict(c.meta))return u;const l=c.meta;if("rejected"!==l.requestStatus||!0===l.aborted||!0===l.condition)return u;const d=extractApiError(!0===l.rejectedWithValue?c.payload:c.error);if(d.code===REQUEST_CANCELED_CODE)return u;const f=n?.(c,d,e);if("silent"===f||isSilentRejection(l))return u;if("toast"!==f){if(null!==d.code&&r.includes(d.code))return u;if(s.includes(d.status))return u}return(e=>{if(i<=0)return!0;const t=Date.now();for(const[e,r]of o)t-r>=i&&o.delete(e);return!o.has(e)&&(o.set(e,t),!0)})(d.message)&&t(d.message,d),u}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";export{errorToastMiddleware,isSilentRejection}from"./errorToastMiddleware.js";export{createRootReducer,resetState}from"./rootReducer.js";export{SERIALIZABLE_IGNORED_ACTION_PATHS}from"./serializableCheck.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import{combineReducers,createAction}from"@reduxjs/toolkit";export const resetState=createAction("app/resetState");export function createRootReducer(e,t={}){const r=combineReducers(e),o=t.preserve??[];return(e,t)=>{if(void 0!==e&&resetState.match(t)){const c={};for(const t of o)c[t]=e[t];return r(c,t)}return r(e,t)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";export const SERIALIZABLE_IGNORED_ACTION_PATHS=["meta.arg","meta.baseQueryMeta"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useEffect
|
|
1
|
+
"use strict";import{useEffect,useRef}from"react";import{Platform}from"react-native";import{Logger}from"../logger/index.js";const screenCapture=()=>require("expo-screen-capture"),report=e=>r=>{Logger.error(`[@webority/mobile-core] useSecureScreen could not ${e}.`,r)};let nextKey=0,appSwitcherHolders=0;export const useSecureScreen=(e={})=>{const{focused:r=!0}=e,t=useRef(null);null===t.current&&(nextKey+=1,t.current=`webority-secure-screen-${nextKey}`),useEffect(()=>{if(!r)return;const e=t.current,c=screenCapture();c.preventScreenCaptureAsync(e).catch(report("block screen capture"));const o="ios"===Platform.OS;return o&&(appSwitcherHolders+=1,1===appSwitcherHolders&&c.enableAppSwitcherProtectionAsync().catch(report("hide the app switcher snapshot"))),()=>{c.allowScreenCaptureAsync(e).catch(report("release screen capture")),o&&(appSwitcherHolders-=1,0===appSwitcherHolders&&c.disableAppSwitcherProtectionAsync().catch(report("restore the app switcher snapshot")))}},[r])};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
"use strict";const PREFIX="[@webority/mobile-core]",sharing=()=>require("expo-sharing"),UTIS={"application/pdf":"com.adobe.pdf","text/plain":"public.plain-text","text/csv":"public.comma-separated-values-text","image/jpeg":"public.jpeg","image/png":"public.png"};export class ShareError extends Error{constructor(e,r){super(`${PREFIX} ${r}`),this.name="ShareError",this.code=e,Object.setPrototypeOf(this,ShareError.prototype)}}const HAS_SCHEME=/^[a-z][a-z0-9+.-]*:/i;export const shareFile=async(e,r={})=>{const t=HAS_SCHEME.test(e)?e:`file://${e}`,a=sharing();if(!await a.isAvailableAsync())throw new ShareError("unavailable",`Sharing is not available on this device, so ${t} cannot be opened.`);const{mimeType:i,dialogTitle:o}=r;try{await a.shareAsync(t,{mimeType:i,UTI:i?UTIS[i]:void 0,dialogTitle:o})}catch(e){throw new ShareError("failed",`${t}${i?` (${i})`:""} could not be shared: ${e instanceof Error?e.message:String(e)}`)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DeviceEventEmitter
|
|
1
|
+
"use strict";import{DeviceEventEmitter,Platform}from"react-native";import{Logger}from"../logger/index.js";const OTP_EVENT="WeborityMobileCoreSmsRetrieved",ERROR_EVENT="WeborityMobileCoreSmsRetrieverError";let nativeModule,backend=null;export const setSmsRetrieverImplementation=e=>{backend=e};const resolveNativeModule=()=>{if(void 0!==nativeModule)return nativeModule;if("android"!==Platform.OS)return nativeModule=null,null;try{nativeModule=require("../specs/NativeSmsRetriever").default??null}catch(e){Logger.warn("[smsRetriever] native module not available",e),nativeModule=null}return nativeModule??null},defaultBackend={getAppHash:async()=>{const e=resolveNativeModule();if(!e)throw new Error("[smsRetriever] getAppHash: native module unavailable (Android only).");return e.getAppHash()},startListening:(e,t)=>{const r=resolveNativeModule();if(!r)return t?.({type:"SERVICE_UNAVAILABLE",message:"SMS Retriever is Android-only, or the native module is not linked."}),{remove:()=>{}};const i=DeviceEventEmitter.addListener(OTP_EVENT,t=>e(t.message)),n=t?DeviceEventEmitter.addListener(ERROR_EVENT,e=>t(e)):null;try{r.startSMSListener()}catch(e){Logger.error("[smsRetriever] startSMSListener failed",e)}return{remove:()=>{i.remove(),n?.remove();try{r.stopSMSListener()}catch(e){Logger.error("[smsRetriever] stopSMSListener failed",e)}}}}};export const SmsRetriever={isAvailable:()=>null!==resolveNativeModule(),getAppHash:()=>(backend??defaultBackend).getAppHash(),startListening:(e,t)=>(backend??defaultBackend).startListening(e,t)};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TurboModuleRegistry
|
|
1
|
+
"use strict";import{TurboModuleRegistry}from"react-native";export default TurboModuleRegistry.getEnforcing("WeborityMobileCoreSmsRetriever");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const adaptExpoSqlite=
|
|
1
|
+
"use strict";export const adaptExpoSqlite=t=>({open:async(a,e)=>{const s=await t.openDatabaseAsync(a,void 0,e?.location);return{execute:async(t,a)=>{const e=await s.prepareAsync(t);try{const t=await e.executeAsync(a?[...a]:[]);return{rows:await t.getAllAsync(),rowsAffected:t.changes,insertId:t.lastInsertRowId}}finally{await e.finalizeAsync()}},close:async()=>{await s.closeAsync()}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as e from"expo-sqlite";import{Logger as t}from"../logger/index.js";import{adaptExpoSqlite as n}from"./adapters/expo.js";let r,o=null;export const setSqliteImplementation=e=>{o=e};const resolveDriver=()=>{if(o)return o;if(void 0===r){const t=e;r=(e=>"function"==typeof e?.openDatabaseAsync)(t)?n(t):null}return r};export const isSqliteAvailable=()=>null!==resolveDriver();export const MIGRATIONS_TABLE="_webority_migrations";const a=/^[A-Za-z_][A-Za-z0-9_]*$/;export const assertSqlIdentifier=(e,t="identifier")=>{if("string"!=typeof e||!a.test(e))throw new Error(`[@webority/mobile-core] Invalid SQL ${t} ${JSON.stringify(e)}. Only letters, digits and underscores are allowed, and it must not start with a digit. Pass values as bound parameters instead of building them into the name.`);return e};const quoteIdentifier=(e,t="identifier")=>`"${assertSqlIdentifier(e,t)}"`,escapeIdentifier=e=>`"${e.replace(/"/g,'""')}"`,i=/^[A-Za-z0-9_ ,.()'"+*/=<>|%:$-]+$/;export const toSqliteValue=e=>void 0===e?null:"boolean"==typeof e?e?1:0:e instanceof Date?e.toISOString():e;export const fromSqliteBoolean=e=>{if("boolean"==typeof e)return e;if("number"==typeof e)return 0!==e;if("string"==typeof e){const t=e.trim().toLowerCase();return"1"===t||"true"===t}return!1};export const whereIn=(e,t)=>{const n=quoteIdentifier(e,"column name");return 0===t.length?{sql:"1 = 0",params:[]}:{sql:`${n} IN (${t.map(()=>"?").join(", ")})`,params:t.map(toSqliteValue)}};const buildWhere=e=>{if(!e)return{clause:"",params:[]};if((e=>"string"==typeof e.sql&&Object.keys(e).every(e=>"sql"===e||"params"===e))(e)){const t=e.sql.trim();return 0===t.length?{clause:"",params:[]}:{clause:` WHERE ${t}`,params:[...e.params??[]]}}const t=Object.entries(e);if(0===t.length)return{clause:"",params:[]};const n=[],r=[];for(const[e,o]of t){const t=quoteIdentifier(e,"column name"),a=toSqliteValue(o);null===a?n.push(`${t} IS NULL`):(n.push(`${t} = ?`),r.push(a))}return{clause:` WHERE ${n.join(" AND ")}`,params:r}},assertNonNegativeInteger=(e,t)=>{if(!Number.isInteger(e)||e<0)throw new Error(`[@webority/mobile-core] Invalid ${t} ${JSON.stringify(e)}. Expected a non-negative integer.`);return e},hashString=e=>{let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return`${t.toString(16).padStart(8,"0")}-${e.length.toString(16)}`},migrationChecksum=e=>{if("function"==typeof e.up)return hashString("fn");const t=Array.isArray(e.up)?e.up.join("\n"):e.up;return hashString(t)};export const DEFAULT_PRAGMAS={journal_mode:"WAL",synchronous:"NORMAL",foreign_keys:"ON",busy_timeout:5e3};const s=/^[A-Za-z0-9_-]+$/,renderPragmaValue=(e,t)=>{if("number"==typeof t){if(!Number.isFinite(t))throw new Error(`[@webority/mobile-core] Invalid value for PRAGMA ${e}: ${t}.`);return String(t)}if(!s.test(t))throw new Error(`[@webority/mobile-core] Invalid value ${JSON.stringify(t)} for PRAGMA ${e}. PRAGMA values cannot be bound, so only letters, digits, underscores and hyphens are accepted.`);return t},createDb=(e,n)=>{let r=Promise.resolve();const execute=async(e,r)=>{try{return await n.execute(e,r)}catch(n){throw t.error(`[@webority/mobile-core] SQLite execute failed: ${e}`,n),n}},select=async(e,t)=>(await execute(e,t)).rows,selectOne=async(e,t)=>{const n=await select(e,t);return n.length>0?n[0]:null},runTransaction=async e=>{let r;await n.execute("BEGIN");try{r=await e({execute:execute,select:select,selectOne:selectOne})}catch(e){try{await n.execute("ROLLBACK")}catch(e){t.error("[@webority/mobile-core] SQLite ROLLBACK failed",e)}throw e}try{await n.execute("COMMIT")}catch(e){try{await n.execute("ROLLBACK")}catch{}throw e}return r},transaction=e=>{const t=r.then(()=>runTransaction(e),()=>runTransaction(e));return r=t.catch(()=>{}),t},insertSql=(e,t)=>{const n=quoteIdentifier(e,"table name"),r=Object.entries(t);if(0===r.length)throw new Error(`[@webority/mobile-core] Cannot insert an empty row into ${e}. Pass at least one column.`);const o=r.map(([e])=>quoteIdentifier(e,"column name")),a=r.map(()=>"?");return{sql:`INSERT INTO ${n} (${o.join(", ")}) VALUES (${a.join(", ")})`,params:r.map(([,e])=>toSqliteValue(e))}},findAll=async(e,t,n)=>{const r=quoteIdentifier(e,"table name"),o=buildWhere(t),a=[...o.params];let i=`SELECT * FROM ${r}${o.clause}${(e=>{if(void 0===e)return"";const t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0);return 0===t.length?"":` ORDER BY ${t.map(t=>{const[n,r,...o]=t.split(/\s+/);if(o.length>0)throw new Error(`[@webority/mobile-core] Invalid orderBy term ${JSON.stringify(t)}. Expected a column name optionally followed by ASC or DESC.`);const a=quoteIdentifier(n,"orderBy column");if(void 0===r)return a;const i=r.toUpperCase();if("ASC"!==i&&"DESC"!==i)throw new Error(`[@webority/mobile-core] Invalid sort direction ${JSON.stringify(r)} in orderBy ${JSON.stringify(e)}. Expected ASC or DESC.`);return`${a} ${i}`}).join(", ")}`})(n?.orderBy)}`;return void 0!==n?.limit?(assertNonNegativeInteger(n.limit,"limit"),i+=" LIMIT ?",a.push(n.limit)):void 0!==n?.offset&&(i+=" LIMIT -1"),void 0!==n?.offset&&(assertNonNegativeInteger(n.offset,"offset"),i+=" OFFSET ?",a.push(n.offset)),select(i,a)},ensureLedger=async()=>{await execute(`CREATE TABLE IF NOT EXISTS ${escapeIdentifier(MIGRATIONS_TABLE)} (version INTEGER PRIMARY KEY, name TEXT, applied_at TEXT NOT NULL, checksum TEXT NOT NULL)`)},o=`INSERT OR REPLACE INTO ${escapeIdentifier(MIGRATIONS_TABLE)} (version, name, applied_at, checksum) VALUES (?, ?, ?, ?)`,wipe=async()=>{const e=await selectOne("PRAGMA foreign_keys"),t=1===Number(e?.foreign_keys??0);await execute("PRAGMA foreign_keys = OFF");try{await transaction(async e=>{const t=await e.select("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' AND name <> ?",[MIGRATIONS_TABLE]);for(const n of t)await e.execute(`DELETE FROM ${escapeIdentifier(n.name)}`)})}finally{await execute("PRAGMA foreign_keys = "+(t?"ON":"OFF"))}},migrate=async(t,n)=>{const r=new Set;for(const n of t){if(r.has(n.version))throw new Error(`[@webority/mobile-core] Duplicate migration version ${n.version} for database "${e}".`);r.add(n.version)}const a=await selectOne("PRAGMA user_version");let i=Number(a?.user_version??0);if(t.length>0&&!n?.allowDowngrade){const n=t.reduce((e,t)=>Math.max(e,t.version),0);if(i>n)throw new Error(`[@webority/mobile-core] Database "${e}" is at schema version ${i}, which is newer than the highest migration supplied (${n}). This build would run old code against a newer schema. Ship the missing migrations, or pass { allowDowngrade: true } if this build is known to be compatible.`)}await ensureLedger();const s=await select(`SELECT version, checksum FROM ${escapeIdentifier(MIGRATIONS_TABLE)}`),c=new Map(s.map(e=>[Number(e.version),String(e.checksum)]));for(const n of t){if(n.version>i)continue;const t=c.get(n.version);if(void 0===t)continue;const r=migrationChecksum(n);if(t!==r)throw new Error(`[@webority/mobile-core] Migration ${n.version} has changed since it was applied to database "${e}" (recorded ${t}, now ${r}). A released migration must never be edited; add a new one instead.`)}const l=t.filter(e=>e.version>i).sort((e,t)=>e.version-t.version);for(const e of l){const t=migrationChecksum(e);await transaction(async n=>{if("function"==typeof e.up)await e.up(n);else{const t=Array.isArray(e.up)?e.up:[e.up];for(const e of t)await n.execute(e)}await n.execute(o,[e.version,e.name??null,(new Date).toISOString(),t]),await n.execute(`PRAGMA user_version = ${e.version}`)}),i=e.version}return i};return{name:e,execute:execute,select:select,selectOne:selectOne,transaction:transaction,insert:async(e,t)=>{const{sql:n,params:r}=insertSql(e,t);return(await execute(n,r)).insertId},insertMany:async(e,t)=>{if(0===t.length)return 0;const n=t.map(t=>insertSql(e,t));return await transaction(async e=>{for(const t of n)await e.execute(t.sql,t.params)}),t.length},update:async(e,t,n)=>{const r=quoteIdentifier(e,"table name"),o=Object.entries(t);if(0===o.length)throw new Error(`[@webority/mobile-core] Cannot update ${e} with no values. Pass at least one column to set.`);const a=o.map(([e])=>`${quoteIdentifier(e,"column name")} = ?`),i=o.map(([,e])=>toSqliteValue(e)),s=buildWhere(n);return(await execute(`UPDATE ${r} SET ${a.join(", ")}${s.clause}`,[...i,...s.params])).rowsAffected},remove:async(e,t)=>{const n=quoteIdentifier(e,"table name"),r=buildWhere(t);return(await execute(`DELETE FROM ${n}${r.clause}`,r.params)).rowsAffected},upsert:async(e,t,n)=>{if(0===n.length)throw new Error(`[@webority/mobile-core] upsert on ${e} needs at least one conflict column; without one SQLite has no key to match an existing row on.`);const{sql:r,params:o}=insertSql(e,t),a=new Set(n),i=n.map(e=>quoteIdentifier(e,"column name")),s=Object.keys(t).filter(e=>!a.has(e)).map(e=>{const t=quoteIdentifier(e,"column name");return`${t} = excluded.${t}`}),c=s.length>0?`DO UPDATE SET ${s.join(", ")}`:"DO NOTHING";await execute(`${r} ON CONFLICT (${i.join(", ")}) ${c}`,o)},findAll:findAll,findOne:async(e,t)=>{const n=await findAll(e,t,{limit:1});return n.length>0?n[0]:null},count:async(e,t)=>{const n=quoteIdentifier(e,"table name"),r=buildWhere(t),o=await selectOne(`SELECT COUNT(*) AS cnt FROM ${n}${r.clause}`,r.params);return Number(o?.cnt??0)},tableExists:async e=>{assertSqlIdentifier(e,"table name");return null!==await selectOne("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?",[e])},createTable:async(e,t,n)=>{const r=quoteIdentifier(e,"table name"),o=Object.entries(t);if(0===o.length)throw new Error(`[@webority/mobile-core] Cannot create table ${e} with no columns.`);const a=o.map(([e,t])=>`${quoteIdentifier(e,"column name")} ${((e,t)=>{const n="string"==typeof e?e.trim():"";if(0===n.length||!i.test(n)||n.includes("--"))throw new Error(`[@webority/mobile-core] Invalid column definition for "${t}": ${JSON.stringify(e)}. A definition is raw SQL such as 'INTEGER NOT NULL DEFAULT 0' and may not contain a statement separator or a comment.`);return n})(t,e)}`),s=!1===n?.ifNotExists?"":"IF NOT EXISTS ";await execute(`CREATE TABLE ${s}${r} (${a.join(", ")})`)},dropTable:async(e,t)=>{const n=quoteIdentifier(e,"table name"),r=!1===t?.ifExists?"":"IF EXISTS ";await execute(`DROP TABLE ${r}${n}`)},wipe:wipe,reset:async e=>(await wipe(),await ensureLedger(),await transaction(async e=>{await e.execute(`DELETE FROM ${escapeIdentifier(MIGRATIONS_TABLE)}`),await e.execute("PRAGMA user_version = 0")}),migrate(e)),migrate:migrate,baseline:async(e,t)=>{assertNonNegativeInteger(e,"baseline version"),await ensureLedger();const n=(new Date).toISOString();await transaction(async r=>{for(const a of t??[])a.version>e||await r.execute(o,[a.version,a.name??null,n,migrationChecksum(a)]);await r.execute(`PRAGMA user_version = ${e}`)})},close:async()=>{await n.close()}}};export const openDatabase=async(e,n)=>{const r=(e=>{const n=resolveDriver();if(!n){const n=new Error(`[@webority/mobile-core] No SQLite driver available; cannot ${e}. Install expo-sqlite (the only sanctioned driver) in the consuming app.`);throw t.error(n.message),n}return n})("open"),o=await r.open(e,n?{location:n.location}:void 0),a=createDb(e,o);if(!1!==n?.pragmas){const e={...DEFAULT_PRAGMAS,...n?.pragmas??{}};for(const[t,n]of Object.entries(e))assertSqlIdentifier(t,"PRAGMA name"),await a.execute(`PRAGMA ${t} = ${renderPragmaValue(t,n)}`)}return a};
|
|
1
|
+
"use strict";import*as ExpoSqlite from"expo-sqlite";import{Logger}from"../logger/index.js";import{adaptExpoSqlite}from"./adapters/expo.js";let expoDriver,backend=null;export const setSqliteImplementation=e=>{backend=e};const hasNativeSqlite=e=>"function"==typeof e?.openDatabaseAsync,resolveDriver=()=>{if(backend)return backend;if(void 0===expoDriver){const e=ExpoSqlite;expoDriver=hasNativeSqlite(e)?adaptExpoSqlite(e):null}return expoDriver};export const isSqliteAvailable=()=>null!==resolveDriver();const requireBackend=e=>{const t=resolveDriver();if(!t){const t=new Error(`[@webority/mobile-core] No SQLite driver available; cannot ${e}. Install expo-sqlite (the only sanctioned driver) in the consuming app.`);throw Logger.error(t.message),t}return t};export const MIGRATIONS_TABLE="_webority_migrations";const IDENTIFIER=/^[A-Za-z_][A-Za-z0-9_]*$/;export const assertSqlIdentifier=(e,t="identifier")=>{if("string"!=typeof e||!IDENTIFIER.test(e))throw new Error(`[@webority/mobile-core] Invalid SQL ${t} ${JSON.stringify(e)}. Only letters, digits and underscores are allowed, and it must not start with a digit. Pass values as bound parameters instead of building them into the name.`);return e};const quoteIdentifier=(e,t="identifier")=>`"${assertSqlIdentifier(e,t)}"`,escapeIdentifier=e=>`"${e.replace(/"/g,'""')}"`,COLUMN_DEFINITION=/^[A-Za-z0-9_ ,.()'"+*/=<>|%:$-]+$/,assertColumnDefinition=(e,t)=>{const r="string"==typeof e?e.trim():"";if(0===r.length||!COLUMN_DEFINITION.test(r)||r.includes("--"))throw new Error(`[@webority/mobile-core] Invalid column definition for "${t}": ${JSON.stringify(e)}. A definition is raw SQL such as 'INTEGER NOT NULL DEFAULT 0' and may not contain a statement separator or a comment.`);return r};export const toSqliteValue=e=>void 0===e?null:"boolean"==typeof e?e?1:0:e instanceof Date?e.toISOString():e;export const fromSqliteBoolean=e=>{if("boolean"==typeof e)return e;if("number"==typeof e)return 0!==e;if("string"==typeof e){const t=e.trim().toLowerCase();return"1"===t||"true"===t}return!1};export const whereIn=(e,t)=>{const r=quoteIdentifier(e,"column name");return 0===t.length?{sql:"1 = 0",params:[]}:{sql:`${r} IN (${t.map(()=>"?").join(", ")})`,params:t.map(toSqliteValue)}};const isRawWhere=e=>"string"==typeof e.sql&&Object.keys(e).every(e=>"sql"===e||"params"===e),buildWhere=e=>{if(!e)return{clause:"",params:[]};if(isRawWhere(e)){const t=e.sql.trim();return 0===t.length?{clause:"",params:[]}:{clause:` WHERE ${t}`,params:[...e.params??[]]}}const t=Object.entries(e);if(0===t.length)return{clause:"",params:[]};const r=[],n=[];for(const[e,i]of t){const t=quoteIdentifier(e,"column name"),o=toSqliteValue(i);null===o?r.push(`${t} IS NULL`):(r.push(`${t} = ?`),n.push(o))}return{clause:` WHERE ${r.join(" AND ")}`,params:n}},buildOrderBy=e=>{if(void 0===e)return"";const t=e.split(",").map(e=>e.trim()).filter(e=>e.length>0);if(0===t.length)return"";return` ORDER BY ${t.map(t=>{const[r,n,...i]=t.split(/\s+/);if(i.length>0)throw new Error(`[@webority/mobile-core] Invalid orderBy term ${JSON.stringify(t)}. Expected a column name optionally followed by ASC or DESC.`);const o=quoteIdentifier(r,"orderBy column");if(void 0===n)return o;const a=n.toUpperCase();if("ASC"!==a&&"DESC"!==a)throw new Error(`[@webority/mobile-core] Invalid sort direction ${JSON.stringify(n)} in orderBy ${JSON.stringify(e)}. Expected ASC or DESC.`);return`${o} ${a}`}).join(", ")}`},assertNonNegativeInteger=(e,t)=>{if(!Number.isInteger(e)||e<0)throw new Error(`[@webority/mobile-core] Invalid ${t} ${JSON.stringify(e)}. Expected a non-negative integer.`);return e},hashString=e=>{let t=2166136261;for(let r=0;r<e.length;r+=1)t^=e.charCodeAt(r),t=Math.imul(t,16777619)>>>0;return`${t.toString(16).padStart(8,"0")}-${e.length.toString(16)}`},migrationChecksum=e=>{if("function"==typeof e.up)return hashString("fn");const t=Array.isArray(e.up)?e.up.join("\n"):e.up;return hashString(t)};export const DEFAULT_PRAGMAS={journal_mode:"WAL",synchronous:"NORMAL",foreign_keys:"ON",busy_timeout:5e3};const PRAGMA_VALUE=/^[A-Za-z0-9_-]+$/,renderPragmaValue=(e,t)=>{if("number"==typeof t){if(!Number.isFinite(t))throw new Error(`[@webority/mobile-core] Invalid value for PRAGMA ${e}: ${t}.`);return String(t)}if(!PRAGMA_VALUE.test(t))throw new Error(`[@webority/mobile-core] Invalid value ${JSON.stringify(t)} for PRAGMA ${e}. PRAGMA values cannot be bound, so only letters, digits, underscores and hyphens are accepted.`);return t},createDb=(e,t)=>{let r=Promise.resolve();const execute=async(e,r)=>{try{return await t.execute(e,r)}catch(t){throw Logger.error(`[@webority/mobile-core] SQLite execute failed: ${e}`,t),t}},select=async(e,t)=>(await execute(e,t)).rows,selectOne=async(e,t)=>{const r=await select(e,t);return r.length>0?r[0]:null},runTransaction=async e=>{let r;await t.execute("BEGIN");try{r=await e({execute:execute,select:select,selectOne:selectOne})}catch(e){try{await t.execute("ROLLBACK")}catch(e){Logger.error("[@webority/mobile-core] SQLite ROLLBACK failed",e)}throw e}try{await t.execute("COMMIT")}catch(e){try{await t.execute("ROLLBACK")}catch{}throw e}return r},transaction=e=>{const t=r.then(()=>runTransaction(e),()=>runTransaction(e));return r=t.catch(()=>{}),t},insertSql=(e,t)=>{const r=quoteIdentifier(e,"table name"),n=Object.entries(t);if(0===n.length)throw new Error(`[@webority/mobile-core] Cannot insert an empty row into ${e}. Pass at least one column.`);const i=n.map(([e])=>quoteIdentifier(e,"column name")),o=n.map(()=>"?");return{sql:`INSERT INTO ${r} (${i.join(", ")}) VALUES (${o.join(", ")})`,params:n.map(([,e])=>toSqliteValue(e))}},findAll=async(e,t,r)=>{const n=quoteIdentifier(e,"table name"),i=buildWhere(t),o=[...i.params];let a=`SELECT * FROM ${n}${i.clause}${buildOrderBy(r?.orderBy)}`;return void 0!==r?.limit?(assertNonNegativeInteger(r.limit,"limit"),a+=" LIMIT ?",o.push(r.limit)):void 0!==r?.offset&&(a+=" LIMIT -1"),void 0!==r?.offset&&(assertNonNegativeInteger(r.offset,"offset"),a+=" OFFSET ?",o.push(r.offset)),select(a,o)},ensureLedger=async()=>{await execute(`CREATE TABLE IF NOT EXISTS ${escapeIdentifier(MIGRATIONS_TABLE)} (version INTEGER PRIMARY KEY, name TEXT, applied_at TEXT NOT NULL, checksum TEXT NOT NULL)`)},n=`INSERT OR REPLACE INTO ${escapeIdentifier(MIGRATIONS_TABLE)} (version, name, applied_at, checksum) VALUES (?, ?, ?, ?)`,wipe=async()=>{const e=await selectOne("PRAGMA foreign_keys"),t=1===Number(e?.foreign_keys??0);await execute("PRAGMA foreign_keys = OFF");try{await transaction(async e=>{const t=await e.select("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' AND name <> ?",[MIGRATIONS_TABLE]);for(const r of t)await e.execute(`DELETE FROM ${escapeIdentifier(r.name)}`)})}finally{await execute("PRAGMA foreign_keys = "+(t?"ON":"OFF"))}},migrate=async(t,r)=>{const i=new Set;for(const r of t){if(i.has(r.version))throw new Error(`[@webority/mobile-core] Duplicate migration version ${r.version} for database "${e}".`);i.add(r.version)}const o=await selectOne("PRAGMA user_version");let a=Number(o?.user_version??0);if(t.length>0&&!r?.allowDowngrade){const r=t.reduce((e,t)=>Math.max(e,t.version),0);if(a>r)throw new Error(`[@webority/mobile-core] Database "${e}" is at schema version ${a}, which is newer than the highest migration supplied (${r}). This build would run old code against a newer schema. Ship the missing migrations, or pass { allowDowngrade: true } if this build is known to be compatible.`)}await ensureLedger();const s=await select(`SELECT version, checksum FROM ${escapeIdentifier(MIGRATIONS_TABLE)}`),c=new Map(s.map(e=>[Number(e.version),String(e.checksum)]));for(const r of t){if(r.version>a)continue;const t=c.get(r.version);if(void 0===t)continue;const n=migrationChecksum(r);if(t!==n)throw new Error(`[@webority/mobile-core] Migration ${r.version} has changed since it was applied to database "${e}" (recorded ${t}, now ${n}). A released migration must never be edited; add a new one instead.`)}const l=t.filter(e=>e.version>a).sort((e,t)=>e.version-t.version);for(const e of l){const t=migrationChecksum(e);await transaction(async r=>{if("function"==typeof e.up)await e.up(r);else{const t=Array.isArray(e.up)?e.up:[e.up];for(const e of t)await r.execute(e)}await r.execute(n,[e.version,e.name??null,(new Date).toISOString(),t]),await r.execute(`PRAGMA user_version = ${e.version}`)}),a=e.version}return a};return{name:e,execute:execute,select:select,selectOne:selectOne,transaction:transaction,insert:async(e,t)=>{const{sql:r,params:n}=insertSql(e,t);return(await execute(r,n)).insertId},insertMany:async(e,t)=>{if(0===t.length)return 0;const r=t.map(t=>insertSql(e,t));return await transaction(async e=>{for(const t of r)await e.execute(t.sql,t.params)}),t.length},update:async(e,t,r)=>{const n=quoteIdentifier(e,"table name"),i=Object.entries(t);if(0===i.length)throw new Error(`[@webority/mobile-core] Cannot update ${e} with no values. Pass at least one column to set.`);const o=i.map(([e])=>`${quoteIdentifier(e,"column name")} = ?`),a=i.map(([,e])=>toSqliteValue(e)),s=buildWhere(r);return(await execute(`UPDATE ${n} SET ${o.join(", ")}${s.clause}`,[...a,...s.params])).rowsAffected},remove:async(e,t)=>{const r=quoteIdentifier(e,"table name"),n=buildWhere(t);return(await execute(`DELETE FROM ${r}${n.clause}`,n.params)).rowsAffected},upsert:async(e,t,r)=>{if(0===r.length)throw new Error(`[@webority/mobile-core] upsert on ${e} needs at least one conflict column; without one SQLite has no key to match an existing row on.`);const{sql:n,params:i}=insertSql(e,t),o=new Set(r),a=r.map(e=>quoteIdentifier(e,"column name")),s=Object.keys(t).filter(e=>!o.has(e)).map(e=>{const t=quoteIdentifier(e,"column name");return`${t} = excluded.${t}`}),c=s.length>0?`DO UPDATE SET ${s.join(", ")}`:"DO NOTHING";await execute(`${n} ON CONFLICT (${a.join(", ")}) ${c}`,i)},findAll:findAll,findOne:async(e,t)=>{const r=await findAll(e,t,{limit:1});return r.length>0?r[0]:null},count:async(e,t)=>{const r=quoteIdentifier(e,"table name"),n=buildWhere(t),i=await selectOne(`SELECT COUNT(*) AS cnt FROM ${r}${n.clause}`,n.params);return Number(i?.cnt??0)},tableExists:async e=>{assertSqlIdentifier(e,"table name");return null!==await selectOne("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?",[e])},createTable:async(e,t,r)=>{const n=quoteIdentifier(e,"table name"),i=Object.entries(t);if(0===i.length)throw new Error(`[@webority/mobile-core] Cannot create table ${e} with no columns.`);const o=i.map(([e,t])=>`${quoteIdentifier(e,"column name")} ${assertColumnDefinition(t,e)}`),a=!1===r?.ifNotExists?"":"IF NOT EXISTS ";await execute(`CREATE TABLE ${a}${n} (${o.join(", ")})`)},dropTable:async(e,t)=>{const r=quoteIdentifier(e,"table name"),n=!1===t?.ifExists?"":"IF EXISTS ";await execute(`DROP TABLE ${n}${r}`)},wipe:wipe,reset:async e=>(await wipe(),await ensureLedger(),await transaction(async e=>{await e.execute(`DELETE FROM ${escapeIdentifier(MIGRATIONS_TABLE)}`),await e.execute("PRAGMA user_version = 0")}),migrate(e)),migrate:migrate,baseline:async(e,t)=>{assertNonNegativeInteger(e,"baseline version"),await ensureLedger();const r=(new Date).toISOString();await transaction(async i=>{for(const o of t??[])o.version>e||await i.execute(n,[o.version,o.name??null,r,migrationChecksum(o)]);await i.execute(`PRAGMA user_version = ${e}`)})},close:async()=>{await t.close()}}};export const openDatabase=async(e,t)=>{const r=requireBackend("open"),n=await r.open(e,t?{location:t.location}:void 0),i=createDb(e,n);if(!1!==t?.pragmas){const e={...DEFAULT_PRAGMAS,...t?.pragmas??{}};for(const[t,r]of Object.entries(e))assertSqlIdentifier(t,"PRAGMA name"),await i.execute(`PRAGMA ${t} = ${renderPragmaValue(t,r)}`)}return i};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
"use strict";import KvStore from"expo-sqlite/kv-store";import{Logger}from"../logger/index.js";let backend=null;const resolveBackend=()=>backend??KvStore;export const isStorageAvailable=()=>null!==resolveBackend();const requireBackend=e=>{const t=resolveBackend();if(!t){const t=new Error(`[Storage] no storage backend available; cannot ${e}.`);throw Logger.error(t.message),t}return t};export const setStorageImplementation=e=>{backend=e};const safeJsonParse=e=>{if(null==e)return null;try{return JSON.parse(e)}catch(e){return Logger.warn("[Storage] Failed to parse JSON value, returning null",e),null}},getItem=async e=>{try{return await requireBackend("getItem").getItem(e)}catch(t){return Logger.error(`[Storage] getItem failed for key "${e}"`,t),null}},setItem=async(e,t)=>{try{return await requireBackend("setItem").setItem(e,t),!0}catch(t){return Logger.error(`[Storage] setItem failed for key "${e}"`,t),!1}},removeItem=async e=>{try{return await requireBackend("removeItem").removeItem(e),!0}catch(t){return Logger.error(`[Storage] removeItem failed for key "${e}"`,t),!1}},getJson=async e=>{const t=await getItem(e);return safeJsonParse(t)},setJson=async(e,t)=>{try{return await setItem(e,JSON.stringify(t))}catch(t){return Logger.error(`[Storage] setJson failed for key "${e}"`,t),!1}},multiGet=async e=>{try{const t=requireBackend("multiGet");if(t.getMany)return await t.getMany([...e]);if(!t.multiGet){const r={};return await Promise.all(e.map(async e=>{r[e]=await t.getItem(e)})),r}const r=await t.multiGet(e),a={};for(const[e,t]of r)a[e]=t;return a}catch(e){return Logger.error("[Storage] multiGet failed",e),{}}},multiSet=async e=>{try{const t=requireBackend("multiSet");if(t.setMany)return await t.setMany(e),!0;const r=Object.entries(e);return t.multiSet?(await t.multiSet(r),!0):(await Promise.all(r.map(([e,r])=>t.setItem(e,r))),!0)}catch(e){return Logger.error("[Storage] multiSet failed",e),!1}},multiRemove=async e=>{try{const t=requireBackend("multiRemove");return t.removeMany?(await t.removeMany([...e]),!0):t.multiRemove?(await t.multiRemove(e),!0):(await Promise.all(e.map(e=>t.removeItem(e))),!0)}catch(e){return Logger.error("[Storage] multiRemove failed",e),!1}},clear=async()=>{try{const e=requireBackend("clear");return e.clear?(await e.clear(),!0):(Logger.warn("[Storage] backend does not support clear()"),!1)}catch(e){return Logger.error("[Storage] clear failed",e),!1}},getAllKeys=async()=>{try{const e=requireBackend("getAllKeys");if(!e.getAllKeys)return[];return[...await e.getAllKeys()]}catch(e){return Logger.error("[Storage] getAllKeys failed",e),[]}};export const Storage={getItem:getItem,setItem:setItem,removeItem:removeItem,getJson:getJson,setJson:setJson,multiGet:multiGet,multiSet:multiSet,multiRemove:multiRemove,clear:clear,getAllKeys:getAllKeys};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"axios";
|
|
1
|
+
"use strict";import"axios";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{};
|
|
1
|
+
"use strict";export{};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const encodeBase64=
|
|
1
|
+
"use strict";const CHUNK=8192;export const encodeBase64=t=>{const r=new Uint8Array(t);let e="";for(let t=0;t<r.length;t+=8192)e+=String.fromCharCode.apply(null,r.subarray(t,t+8192));return btoa(e)};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{File
|
|
1
|
+
"use strict";import{File}from"expo-file-system";import{ImageManipulator}from"expo-image-manipulator";import{Logger}from"../logger/index.js";export class ImageUnreadableError extends Error{constructor(e,t){super(`Image is unreadable (${t}): ${e||"<empty uri>"}`),this.name="ImageUnreadableError",this.uri=e}}const release=e=>{try{e?.release?.()}catch{}},expoBackend={stat:async e=>{const t=new File(e);return t.exists?null==t.size?null:{exists:!0,size:t.size}:{exists:!1,size:0}},remove:async e=>{new File(e).delete()},open:async e=>{const t=ImageManipulator.manipulate(e);let i;try{i=await t.renderAsync()}finally{release(t)}return{width:i.width,height:i.height,encode:async({width:e,height:t,quality:a,format:n})=>{const r=ImageManipulator.manipulate(i);let o=null;try{void 0===e&&void 0===t||r.resize({width:e??null,height:t??null}),o=await r.renderAsync();const i=await o.saveAsync({compress:a,format:n});return{uri:i.uri,width:i.width,height:i.height}}finally{release(o),release(r)}},close:()=>release(i)}}};let backend=null;export const setImageCompressorImplementation=e=>{backend=e};const resolveBackend=()=>backend??expoBackend,EIGHT_MB=8388608,THREE_MB=3145728;export const qualityForFileSize=e=>null==e?.7:e>8388608?.6:e>3145728?.7:.8;const DEFAULT_MAX_SIZE=1500,DEFAULT_MIN_QUALITY=.4,QUALITY_STEP=.1,SIZE_STEP=.75,MIN_SIDE=320,FORMAT={jpg:{encode:"jpeg",mimeType:"image/jpeg"},png:{encode:"png",mimeType:"image/png"},webp:{encode:"webp",mimeType:"image/webp"}},MIME_BY_EXTENSION={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp",gif:"image/gif",heic:"image/heic",heif:"image/heif",bmp:"image/bmp",tif:"image/tiff",tiff:"image/tiff"},lastSegment=e=>{const t=e.split(/[?#]/)[0]??"";return decodeURIComponentSafe(t.slice(t.lastIndexOf("/")+1))},decodeURIComponentSafe=e=>{try{return decodeURIComponent(e)}catch{return e}},extensionOf=e=>{const t=e.lastIndexOf(".");return t>0?e.slice(t+1).toLowerCase():""},withoutExtension=e=>{const t=e.lastIndexOf(".");return t>0?e.slice(0,t):e},baseNameFor=(e,t)=>withoutExtension(t?.trim()||lastSegment(e))||"image",round1=e=>Math.round(10*e)/10,safeStat=async(e,t)=>{try{return await e.stat(t)}catch{return null}},safeRemove=async(e,t)=>{try{await e.remove(t)}catch{}},renderWithin=async(e,t,i,a,n)=>{const r=Math.max(t.width,t.height)>i?t.width>=t.height?{width:i}:{height:i}:{},o=await t.encode({...r,quality:a,format:n}),s=await safeStat(e,o.uri);if(s&&(!s.exists||0===s.size))throw await safeRemove(e,o.uri),new ImageUnreadableError(o.uri,"the encoder wrote an empty file");return{...o,size:s?.size??null}},originalResult=(e,t,i,a)=>{const n=extensionOf(lastSegment(e))||"jpg",r=MIME_BY_EXTENSION[n]??"image/jpeg",o=`${i}.${n}`;return{uri:e,width:a?.width??null,height:a?.height??null,size:t,mimeType:r,extension:n,fileName:o,compressed:!1,quality:null,part:{uri:e,name:o,type:r}}};export const compressImage=async(e,t={})=>{if(!e)throw new ImageUnreadableError(e,"no uri");const i=resolveBackend(),{maxSize:a=DEFAULT_MAX_SIZE,output:n="jpg",maxBytes:r,minQuality:o=DEFAULT_MIN_QUALITY,name:s}=t,l=FORMAT[n]??FORMAT.jpg,m=baseNameFor(e,s),g=await safeStat(i,e);if(g&&!g.exists)throw new ImageUnreadableError(e,"the file does not exist");if(g&&0===g.size)throw new ImageUnreadableError(e,"the file is empty");const h=g?.size??t.fileSize??null;let c;try{c=await i.open(e)}catch(t){return Logger.error("[imageCompression] could not decode the image; uploading the original",t),originalResult(e,h,m,null)}try{let e=t.quality??qualityForFileSize(h),s=a,g=await renderWithin(i,c,s,e,l.encode);if(void 0!==r)for(;null!==g.size&&g.size>r;){if("png"!==n&&round1(e-.1)>=o)e=round1(e-.1);else{const e=Math.max(g.width,g.height);if(e<=320)break;s=Math.max(320,Math.floor(.75*e))}const t=await renderWithin(i,c,s,e,l.encode);await safeRemove(i,g.uri),g=t}const u=`${m}.${n}`;return{uri:g.uri,width:g.width,height:g.height,size:g.size,mimeType:l.mimeType,extension:n,fileName:u,compressed:!0,quality:"png"===n?null:e,part:{uri:g.uri,name:u,type:l.mimeType}}}catch(t){if(t instanceof ImageUnreadableError)throw t;return Logger.error("[imageCompression] encoding failed; uploading the original",t),originalResult(e,h,m,{width:c.width,height:c.height})}finally{c.close()}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{compressImage,setImageCompressorImplementation}from"./imageCompression.js";
|
|
1
|
+
"use strict";export{compressImage,setImageCompressorImplementation}from"./imageCompression.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
"use strict";const RE_EMAIL=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,RE_INDIAN_MOBILE=/^[6-9]\d{9}$/,RE_NUMERIC=/^-?\d+(?:\.\d+)?$/,RE_INTEGER=/^-?\d+$/,RE_ALPHANUMERIC=/^[a-zA-Z0-9]+$/,RE_PINCODE_IN=/^[1-9]\d{5}$/,RE_PAN=/^[A-Z]{5}\d{4}[A-Z]$/,RE_GSTIN=/^\d{2}[A-Z]{5}\d{4}[A-Z][1-9A-Z]Z[0-9A-Z]$/,RE_AADHAAR=/^[2-9]\d{11}$/,RE_IFSC=/^[A-Z]{4}0[A-Z0-9]{6}$/,RE_HEX_COLOR=/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/,asString=t=>"string"==typeof t?t.trim():null;export const isNonEmpty=t=>{const e=asString(t);return!!e&&e.length>0};export const isEmail=t=>{const e=asString(t);return!!e&&RE_EMAIL.test(e)};export const isIndianMobile=t=>{const e=asString(t);if(!e)return!1;const r=e.replace(/\D/g,""),n=r.startsWith("91")&&12===r.length?r.slice(2):r;return RE_INDIAN_MOBILE.test(n)};export const isPhone=t=>{const e=asString(t);if(!e)return!1;const r=e.replace(/[^\d+]/g,"").replace(/^\+/,"");return r.length>=7&&r.length<=15&&/^\d+$/.test(r)};export const isUrl=t=>{const e=asString(t);if(!e)return!1;try{return new URL(e),/^https?:\/\//i.test(e)||/^[a-z][a-z0-9+\-.]*:\/\//i.test(e)}catch{return!1}};export const isNumeric=t=>{if("number"==typeof t)return Number.isFinite(t);const e=asString(t);return!!e&&RE_NUMERIC.test(e)};export const isInteger=t=>{if("number"==typeof t)return Number.isInteger(t);const e=asString(t);return!!e&&RE_INTEGER.test(e)};export const isAlphanumeric=t=>{const e=asString(t);return!!e&&RE_ALPHANUMERIC.test(e)};export const isStrongPassword=(t,e={})=>{if("string"!=typeof t)return!1;const{minLength:r=8,requireUppercase:n=!0,requireLowercase:s=!0,requireNumber:o=!0,requireSymbol:i=!1}=e;return!(t.length<r)&&(!(n&&!/[A-Z]/.test(t))&&(!(s&&!/[a-z]/.test(t))&&(!(o&&!/\d/.test(t))&&!(i&&!/[^A-Za-z0-9]/.test(t)))))};export const isIndianPincode=t=>{const e=asString(t);return!!e&&RE_PINCODE_IN.test(e)};export const isPan=t=>{const e=asString(t);return!!e&&RE_PAN.test(e.toUpperCase())};const BASE_36="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",gstinCheckCharacter=t=>{let e=0;for(let r=0;r<14;r+=1){const n=BASE_36.indexOf(t[r])*(r%2==0?1:2);e+=Math.floor(n/36)+n%36}return BASE_36[(36-e%36)%36]};export const isGstin=t=>{const e=asString(t)?.toUpperCase();return!!e&&RE_GSTIN.test(e)&&e[14]===gstinCheckCharacter(e)};const VERHOEFF_D=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],VERHOEFF_P=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]],isVerhoeffValid=t=>{let e=0;for(let r=0;r<t.length;r+=1){const n=Number(t[t.length-1-r]);e=VERHOEFF_D[e][VERHOEFF_P[r%8][n]]}return 0===e};export const isAadhaar=t=>{const e=asString(t);if(!e)return!1;const r=e.replace(/[\s-]/g,"");return RE_AADHAAR.test(r)&&isVerhoeffValid(r)};export const isIfsc=t=>{const e=asString(t);return!!e&&RE_IFSC.test(e.toUpperCase())};export const isHexColor=t=>{const e=asString(t);return!!e&&RE_HEX_COLOR.test(e)};export const isBetween=(t,e,r,n=!0)=>{const s="number"==typeof t?t:Number(asString(t));return!!Number.isFinite(s)&&(n?s>=e&&s<=r:s>e&&s<r)};export const minLength=(t,e)=>{const r=asString(t);return!!r&&r.length>=e};export const maxLength=(t,e)=>{const r=asString(t);return null==r||r.length<=e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";export const parseBuildNumber=e=>{if("number"==typeof e)return Number.isSafeInteger(e)&&e>=0?e:null;if("string"!=typeof e)return null;const r=e.trim();if(!/^\d+$/.test(r))return null;const t=Number(r);return Number.isSafeInteger(t)?t:null};export const isBuildBelowMinimum=(e,r)=>null!==r&&e<r;
|