@webority/mobile-core 0.0.29 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +32 -0
  2. package/lib/commonjs/api/baseUrl.js +1 -34
  3. package/lib/commonjs/api/clientHeaders.js +1 -0
  4. package/lib/commonjs/api/curl.js +1 -109
  5. package/lib/commonjs/api/minAppVersion.js +1 -0
  6. package/lib/commonjs/api/multipart.js +1 -21
  7. package/lib/commonjs/api/publicClient.js +1 -79
  8. package/lib/commonjs/api/requestDefaults.js +1 -0
  9. package/lib/commonjs/api/responseBodyText.js +1 -0
  10. package/lib/commonjs/api/retry.js +1 -91
  11. package/lib/commonjs/api/tokenRefresh.js +1 -205
  12. package/lib/commonjs/api/userClient.js +1 -265
  13. package/lib/commonjs/auth/authStore.js +1 -265
  14. package/lib/commonjs/auth/index.js +1 -44
  15. package/lib/commonjs/auth/jwt.js +1 -112
  16. package/lib/commonjs/config/index.js +1 -72
  17. package/lib/commonjs/deepLink/index.js +1 -286
  18. package/lib/commonjs/download/adapters/expoFs.js +1 -69
  19. package/lib/commonjs/download/adapters/shared.js +1 -13
  20. package/lib/commonjs/download/index.js +1 -250
  21. package/lib/commonjs/errors/extractApiError.js +1 -0
  22. package/lib/commonjs/errors/index.js +1 -0
  23. package/lib/commonjs/formatters/currency.js +1 -70
  24. package/lib/commonjs/formatters/date.js +1 -167
  25. package/lib/commonjs/formatters/dateMath.js +1 -311
  26. package/lib/commonjs/formatters/formatConfig.js +1 -0
  27. package/lib/commonjs/formatters/house.js +1 -0
  28. package/lib/commonjs/formatters/index.js +1 -246
  29. package/lib/commonjs/formatters/initials.js +1 -32
  30. package/lib/commonjs/formatters/intlCache.js +1 -37
  31. package/lib/commonjs/formatters/number.js +1 -89
  32. package/lib/commonjs/formatters/phone.js +1 -369
  33. package/lib/commonjs/formatters/windowsToIanaTable.js +1 -164
  34. package/lib/commonjs/geolocation/adapters/expoLocation.js +1 -126
  35. package/lib/commonjs/geolocation/index.js +1 -355
  36. package/lib/commonjs/index.js +1 -644
  37. package/lib/commonjs/initSDK.js +1 -66
  38. package/lib/commonjs/initUserAuth.js +1 -37
  39. package/lib/commonjs/logger/crashlytics.js +1 -0
  40. package/lib/commonjs/logger/index.js +1 -301
  41. package/lib/commonjs/logger/redact.js +1 -50
  42. package/lib/commonjs/network/index.js +1 -31
  43. package/lib/commonjs/network/networkStatus.js +1 -171
  44. package/lib/commonjs/permissions/calendar.js +1 -14
  45. package/lib/commonjs/permissions/camera.js +1 -14
  46. package/lib/commonjs/permissions/contacts.js +1 -10
  47. package/lib/commonjs/permissions/index.js +1 -133
  48. package/lib/commonjs/permissions/location.js +1 -14
  49. package/lib/commonjs/permissions/mediaLibrary.js +1 -10
  50. package/lib/commonjs/permissions/notifications.js +1 -10
  51. package/lib/commonjs/permissions/photos.js +1 -14
  52. package/lib/commonjs/phone/countries.js +1 -265
  53. package/lib/commonjs/push/index.js +1 -61
  54. package/lib/commonjs/push/push.js +1 -468
  55. package/lib/commonjs/push/status.js +1 -0
  56. package/lib/commonjs/push/task.js +1 -43
  57. package/lib/commonjs/query/apiBaseQuery.js +1 -0
  58. package/lib/commonjs/query/createAppApi.js +1 -0
  59. package/lib/commonjs/query/index.js +1 -0
  60. package/lib/commonjs/query/listeners.js +1 -0
  61. package/lib/commonjs/query/paging.js +1 -0
  62. package/lib/commonjs/query/tags.js +1 -0
  63. package/lib/commonjs/redux/errorToastMiddleware.js +1 -0
  64. package/lib/commonjs/redux/index.js +1 -0
  65. package/lib/commonjs/redux/rootReducer.js +1 -0
  66. package/lib/commonjs/redux/serializableCheck.js +1 -0
  67. package/lib/commonjs/secureScreen/index.js +1 -0
  68. package/lib/commonjs/share/index.js +1 -70
  69. package/lib/commonjs/smsRetriever/index.js +1 -91
  70. package/lib/commonjs/specs/NativeSmsRetriever.js +1 -15
  71. package/lib/commonjs/sqlite/adapters/expo.js +1 -53
  72. package/lib/commonjs/sqlite/index.js +1 -604
  73. package/lib/commonjs/storage/index.js +1 -214
  74. package/lib/commonjs/types/axios.js +1 -4
  75. package/lib/commonjs/types/globals.d.js +1 -6
  76. package/lib/commonjs/utils/base64.js +1 -24
  77. package/lib/commonjs/utils/imageCompression.js +1 -389
  78. package/lib/commonjs/utils/index.js +1 -19
  79. package/lib/commonjs/validators/index.js +1 -227
  80. package/lib/commonjs/versionCheck/buildNumber.js +1 -0
  81. package/lib/commonjs/versionCheck/index.js +1 -419
  82. package/lib/module/api/baseUrl.js +1 -30
  83. package/lib/module/api/clientHeaders.js +1 -0
  84. package/lib/module/api/curl.js +1 -104
  85. package/lib/module/api/minAppVersion.js +1 -0
  86. package/lib/module/api/multipart.js +1 -16
  87. package/lib/module/api/publicClient.js +1 -75
  88. package/lib/module/api/requestDefaults.js +1 -0
  89. package/lib/module/api/responseBodyText.js +1 -0
  90. package/lib/module/api/retry.js +1 -85
  91. package/lib/module/api/tokenRefresh.js +1 -192
  92. package/lib/module/api/userClient.js +1 -243
  93. package/lib/module/auth/authStore.js +1 -257
  94. package/lib/module/auth/index.js +1 -5
  95. package/lib/module/auth/jwt.js +1 -106
  96. package/lib/module/config/index.js +1 -64
  97. package/lib/module/deepLink/index.js +1 -280
  98. package/lib/module/download/adapters/expoFs.js +1 -64
  99. package/lib/module/download/adapters/shared.js +1 -8
  100. package/lib/module/download/index.js +1 -242
  101. package/lib/module/errors/extractApiError.js +1 -0
  102. package/lib/module/errors/index.js +1 -0
  103. package/lib/module/formatters/currency.js +1 -65
  104. package/lib/module/formatters/date.js +1 -159
  105. package/lib/module/formatters/dateMath.js +1 -295
  106. package/lib/module/formatters/formatConfig.js +1 -0
  107. package/lib/module/formatters/house.js +1 -0
  108. package/lib/module/formatters/index.js +1 -9
  109. package/lib/module/formatters/initials.js +1 -27
  110. package/lib/module/formatters/intlCache.js +1 -30
  111. package/lib/module/formatters/number.js +1 -82
  112. package/lib/module/formatters/phone.js +1 -302
  113. package/lib/module/formatters/windowsToIanaTable.js +1 -160
  114. package/lib/module/geolocation/adapters/expoLocation.js +1 -121
  115. package/lib/module/geolocation/index.js +1 -347
  116. package/lib/module/index.js +1 -57
  117. package/lib/module/initSDK.js +1 -61
  118. package/lib/module/initUserAuth.js +1 -33
  119. package/lib/module/logger/crashlytics.js +1 -0
  120. package/lib/module/logger/index.js +1 -295
  121. package/lib/module/logger/redact.js +1 -44
  122. package/lib/module/network/index.js +1 -4
  123. package/lib/module/network/networkStatus.js +1 -161
  124. package/lib/module/permissions/calendar.js +1 -15
  125. package/lib/module/permissions/camera.js +1 -15
  126. package/lib/module/permissions/contacts.js +1 -11
  127. package/lib/module/permissions/index.js +1 -128
  128. package/lib/module/permissions/location.js +1 -15
  129. package/lib/module/permissions/mediaLibrary.js +1 -11
  130. package/lib/module/permissions/notifications.js +1 -11
  131. package/lib/module/permissions/photos.js +1 -15
  132. package/lib/module/phone/countries.js +1 -261
  133. package/lib/module/push/index.js +1 -4
  134. package/lib/module/push/push.js +1 -452
  135. package/lib/module/push/status.js +1 -0
  136. package/lib/module/push/task.js +1 -38
  137. package/lib/module/query/apiBaseQuery.js +1 -0
  138. package/lib/module/query/createAppApi.js +1 -0
  139. package/lib/module/query/index.js +1 -0
  140. package/lib/module/query/listeners.js +1 -0
  141. package/lib/module/query/paging.js +1 -0
  142. package/lib/module/query/tags.js +1 -0
  143. package/lib/module/redux/errorToastMiddleware.js +1 -0
  144. package/lib/module/redux/index.js +1 -0
  145. package/lib/module/redux/rootReducer.js +1 -0
  146. package/lib/module/redux/serializableCheck.js +1 -0
  147. package/lib/module/secureScreen/index.js +1 -0
  148. package/lib/module/share/index.js +1 -64
  149. package/lib/module/smsRetriever/index.js +1 -86
  150. package/lib/module/specs/NativeSmsRetriever.js +1 -13
  151. package/lib/module/sqlite/adapters/expo.js +1 -48
  152. package/lib/module/sqlite/index.js +1 -594
  153. package/lib/module/storage/index.js +1 -208
  154. package/lib/module/types/axios.js +1 -4
  155. package/lib/module/types/globals.d.js +1 -10
  156. package/lib/module/utils/base64.js +1 -19
  157. package/lib/module/utils/imageCompression.js +1 -383
  158. package/lib/module/utils/index.js +1 -4
  159. package/lib/module/validators/index.js +1 -205
  160. package/lib/module/versionCheck/buildNumber.js +1 -0
  161. package/lib/module/versionCheck/index.js +1 -413
  162. package/lib/typescript/commonjs/api/clientHeaders.d.ts +25 -0
  163. package/lib/typescript/commonjs/api/minAppVersion.d.ts +24 -0
  164. package/lib/typescript/commonjs/api/requestDefaults.d.ts +21 -0
  165. package/lib/typescript/commonjs/api/responseBodyText.d.ts +6 -0
  166. package/lib/typescript/commonjs/api/retry.d.ts +23 -9
  167. package/lib/typescript/commonjs/api/tokenRefresh.d.ts +14 -2
  168. package/lib/typescript/commonjs/api/userClient.d.ts +1 -1
  169. package/lib/typescript/commonjs/auth/authStore.d.ts +76 -0
  170. package/lib/typescript/commonjs/auth/index.d.ts +2 -2
  171. package/lib/typescript/commonjs/config/index.d.ts +31 -2
  172. package/lib/typescript/commonjs/errors/extractApiError.d.ts +69 -0
  173. package/lib/typescript/commonjs/errors/index.d.ts +3 -0
  174. package/lib/typescript/commonjs/formatters/currency.d.ts +22 -7
  175. package/lib/typescript/commonjs/formatters/date.d.ts +13 -13
  176. package/lib/typescript/commonjs/formatters/dateMath.d.ts +4 -2
  177. package/lib/typescript/commonjs/formatters/formatConfig.d.ts +48 -0
  178. package/lib/typescript/commonjs/formatters/house.d.ts +143 -0
  179. package/lib/typescript/commonjs/formatters/index.d.ts +4 -0
  180. package/lib/typescript/commonjs/formatters/number.d.ts +15 -5
  181. package/lib/typescript/commonjs/index.d.ts +26 -8
  182. package/lib/typescript/commonjs/initSDK.d.ts +18 -6
  183. package/lib/typescript/commonjs/initUserAuth.d.ts +29 -0
  184. package/lib/typescript/commonjs/logger/crashlytics.d.ts +31 -0
  185. package/lib/typescript/commonjs/logger/index.d.ts +17 -0
  186. package/lib/typescript/commonjs/push/index.d.ts +3 -1
  187. package/lib/typescript/commonjs/push/push.d.ts +1 -1
  188. package/lib/typescript/commonjs/push/status.d.ts +9 -0
  189. package/lib/typescript/commonjs/query/apiBaseQuery.d.ts +55 -0
  190. package/lib/typescript/commonjs/query/createAppApi.d.ts +21 -0
  191. package/lib/typescript/commonjs/query/index.d.ts +9 -0
  192. package/lib/typescript/commonjs/query/listeners.d.ts +11 -0
  193. package/lib/typescript/commonjs/query/paging.d.ts +42 -0
  194. package/lib/typescript/commonjs/query/tags.d.ts +31 -0
  195. package/lib/typescript/commonjs/redux/errorToastMiddleware.d.ts +51 -0
  196. package/lib/typescript/commonjs/redux/index.d.ts +6 -0
  197. package/lib/typescript/commonjs/redux/rootReducer.d.ts +19 -0
  198. package/lib/typescript/commonjs/redux/serializableCheck.d.ts +14 -0
  199. package/lib/typescript/commonjs/secureScreen/index.d.ts +25 -0
  200. package/lib/typescript/commonjs/versionCheck/buildNumber.d.ts +14 -0
  201. package/lib/typescript/commonjs/versionCheck/index.d.ts +28 -17
  202. package/lib/typescript/module/api/clientHeaders.d.ts +25 -0
  203. package/lib/typescript/module/api/minAppVersion.d.ts +24 -0
  204. package/lib/typescript/module/api/requestDefaults.d.ts +21 -0
  205. package/lib/typescript/module/api/responseBodyText.d.ts +6 -0
  206. package/lib/typescript/module/api/retry.d.ts +23 -9
  207. package/lib/typescript/module/api/tokenRefresh.d.ts +14 -2
  208. package/lib/typescript/module/api/userClient.d.ts +1 -1
  209. package/lib/typescript/module/auth/authStore.d.ts +76 -0
  210. package/lib/typescript/module/auth/index.d.ts +2 -2
  211. package/lib/typescript/module/config/index.d.ts +31 -2
  212. package/lib/typescript/module/errors/extractApiError.d.ts +69 -0
  213. package/lib/typescript/module/errors/index.d.ts +3 -0
  214. package/lib/typescript/module/formatters/currency.d.ts +22 -7
  215. package/lib/typescript/module/formatters/date.d.ts +13 -13
  216. package/lib/typescript/module/formatters/dateMath.d.ts +4 -2
  217. package/lib/typescript/module/formatters/formatConfig.d.ts +48 -0
  218. package/lib/typescript/module/formatters/house.d.ts +143 -0
  219. package/lib/typescript/module/formatters/index.d.ts +4 -0
  220. package/lib/typescript/module/formatters/number.d.ts +15 -5
  221. package/lib/typescript/module/index.d.ts +26 -8
  222. package/lib/typescript/module/initSDK.d.ts +18 -6
  223. package/lib/typescript/module/initUserAuth.d.ts +29 -0
  224. package/lib/typescript/module/logger/crashlytics.d.ts +31 -0
  225. package/lib/typescript/module/logger/index.d.ts +17 -0
  226. package/lib/typescript/module/push/index.d.ts +3 -1
  227. package/lib/typescript/module/push/push.d.ts +1 -1
  228. package/lib/typescript/module/push/status.d.ts +9 -0
  229. package/lib/typescript/module/query/apiBaseQuery.d.ts +55 -0
  230. package/lib/typescript/module/query/createAppApi.d.ts +21 -0
  231. package/lib/typescript/module/query/index.d.ts +9 -0
  232. package/lib/typescript/module/query/listeners.d.ts +11 -0
  233. package/lib/typescript/module/query/paging.d.ts +42 -0
  234. package/lib/typescript/module/query/tags.d.ts +31 -0
  235. package/lib/typescript/module/redux/errorToastMiddleware.d.ts +51 -0
  236. package/lib/typescript/module/redux/index.d.ts +6 -0
  237. package/lib/typescript/module/redux/rootReducer.d.ts +19 -0
  238. package/lib/typescript/module/redux/serializableCheck.d.ts +14 -0
  239. package/lib/typescript/module/secureScreen/index.d.ts +25 -0
  240. package/lib/typescript/module/versionCheck/buildNumber.d.ts +14 -0
  241. package/lib/typescript/module/versionCheck/index.d.ts +28 -17
  242. package/package.json +52 -5
@@ -1,295 +1 @@
1
- "use strict";
2
-
3
- import { getConfigValue } from "../config/index.js";
4
- import { redact, redactString } from "./redact.js";
5
-
6
- // ANSI color codes
7
- const Colors = {
8
- RESET: '\x1b[0m',
9
- BLUE: '\x1b[34m',
10
- YELLOW: '\x1b[33m',
11
- RED_BOLD: '\x1b[31;1m'
12
- };
13
- const LogLevels = {
14
- INFO: {
15
- level: 'info',
16
- color: Colors.BLUE
17
- },
18
- WARN: {
19
- level: 'warn',
20
- color: Colors.YELLOW
21
- },
22
- ERROR: {
23
- level: 'error',
24
- color: Colors.RED_BOLD
25
- }
26
- };
27
-
28
- // Check if a specific log level is allowed
29
- const isLogLevelAllowed = level => {
30
- const levels = ['info', 'warn', 'error'];
31
- const current = getConfigValue('logLevel', 'info');
32
- return levels.indexOf(level) >= levels.indexOf(current);
33
- };
34
- const isEnabled = () => getConfigValue('loggingEnabled', true);
35
-
36
- /**
37
- * Optional remote sink. Apps wire this via `setRemoteLogger()` to forward errors
38
- * and breadcrumbs to Crashlytics, Sentry, Bugsnag, etc. — without making the
39
- * library depend on any of them.
40
- *
41
- * Every method is optional; the library calls only what the adapter implements.
42
- */
43
-
44
- let remote = null;
45
-
46
- /**
47
- * Inject a remote logger adapter (e.g. Firebase Crashlytics, Sentry).
48
- * Pass `null` to detach. Safe to call before or after `initWebority`.
49
- */
50
- export const setRemoteLogger = impl => {
51
- remote = impl;
52
- };
53
- const safe = fn => {
54
- if (!fn) {
55
- return;
56
- }
57
- try {
58
- fn();
59
- } catch {
60
- /* never let the remote sink break the caller */
61
- }
62
- };
63
- const toErrorObject = input => {
64
- if (input instanceof Error) {
65
- return input;
66
- }
67
- if (typeof input === 'string') {
68
- return new Error(input);
69
- }
70
- try {
71
- return new Error(JSON.stringify(input));
72
- } catch {
73
- return new Error(String(input));
74
- }
75
- };
76
-
77
- /**
78
- * Device / app context attached once at boot (platform, OS version, app version,
79
- * build number, device model, etc). Merged into every `recordError` context so
80
- * every crash carries it without every call site repeating it.
81
- */
82
-
83
- let deviceContext = null;
84
- const normalizeAttributeValue = value => {
85
- if (value === null || value === undefined) {
86
- return null;
87
- }
88
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
89
- return value;
90
- }
91
- return String(value);
92
- };
93
-
94
- /**
95
- * Set (or clear, with `null`) the device/app context merged into every
96
- * `recordError` call. Each key is also forwarded to `remote.setAttribute`
97
- * once, at the moment it is set.
98
- */
99
- export const setDeviceContext = context => {
100
- deviceContext = context;
101
- if (context) {
102
- for (const [key, value] of Object.entries(context)) {
103
- safe(() => remote?.setAttribute?.(key, normalizeAttributeValue(value)));
104
- }
105
- }
106
- };
107
- export const getDeviceContext = () => deviceContext;
108
-
109
- /** Tuning knobs for screen history and duplicate-error suppression. */
110
-
111
- const DEFAULT_LOGGER_OPTIONS = {
112
- dedupeWindowMs: 5000,
113
- dedupeMaxPerWindow: 1,
114
- screenHistoryLimit: 20
115
- };
116
- let loggerOptions = {
117
- ...DEFAULT_LOGGER_OPTIONS
118
- };
119
-
120
- /** Configure dedupe window/threshold and screen history size. Merges with current options. */
121
- export const configureLogger = options => {
122
- loggerOptions = {
123
- ...loggerOptions,
124
- ...options
125
- };
126
- if (screenHistory.length > loggerOptions.screenHistoryLimit) {
127
- screenHistory = screenHistory.slice(screenHistory.length - loggerOptions.screenHistoryLimit);
128
- }
129
- };
130
- let currentScreen = null;
131
- let screenHistory = [];
132
- const dedupeMap = new Map();
133
- const MAX_DEDUPE_ENTRIES = 200;
134
- const dedupeKeyFor = err => {
135
- const firstFrame = err.stack?.split('\n')[1]?.trim();
136
- return firstFrame ? `${err.message}::${firstFrame}` : err.message;
137
- };
138
- const capDedupeMap = () => {
139
- while (dedupeMap.size > MAX_DEDUPE_ENTRIES) {
140
- const oldestKey = dedupeMap.keys().next().value;
141
- if (oldestKey === undefined) {
142
- return;
143
- }
144
- dedupeMap.delete(oldestKey);
145
- }
146
- };
147
- const shouldForward = key => {
148
- if (loggerOptions.dedupeWindowMs <= 0) {
149
- return {
150
- forward: true
151
- };
152
- }
153
- const now = Date.now();
154
- const entry = dedupeMap.get(key);
155
- if (!entry || now - entry.windowStart >= loggerOptions.dedupeWindowMs) {
156
- const suppressedCount = entry?.suppressedCount ?? 0;
157
- dedupeMap.set(key, {
158
- windowStart: now,
159
- count: 1,
160
- suppressedCount: 0
161
- });
162
- capDedupeMap();
163
- return suppressedCount > 0 ? {
164
- forward: true,
165
- suppressedCount
166
- } : {
167
- forward: true
168
- };
169
- }
170
- entry.count += 1;
171
- if (entry.count > loggerOptions.dedupeMaxPerWindow) {
172
- entry.suppressedCount += 1;
173
- return {
174
- forward: false
175
- };
176
- }
177
- return {
178
- forward: true
179
- };
180
- };
181
- const buildErrorContext = (context, suppressedCount) => {
182
- const merged = {
183
- ...deviceContext
184
- };
185
- if (currentScreen !== null) {
186
- merged.screen = currentScreen;
187
- }
188
- if (suppressedCount) {
189
- merged.suppressedCount = suppressedCount;
190
- }
191
- return {
192
- ...merged,
193
- ...context
194
- };
195
- };
196
- const forwardErrorToRemote = (err, context) => {
197
- const key = dedupeKeyFor(err);
198
- const {
199
- forward,
200
- suppressedCount
201
- } = shouldForward(key);
202
- if (!forward) {
203
- return;
204
- }
205
- safe(() => remote?.recordError?.(err, buildErrorContext(context, suppressedCount)));
206
- };
207
- const logInfo = (rawMessage, ...rawParams) => {
208
- const message = redactString(rawMessage);
209
- const optionalParams = redact(rawParams);
210
- if (!isEnabled() || !isLogLevelAllowed(LogLevels.INFO.level)) {
211
- return;
212
- }
213
- console.info(`${LogLevels.INFO.color}[INFO]: ${message}${Colors.RESET}`, ...optionalParams);
214
- safe(() => remote?.log?.('info', message, optionalParams));
215
- };
216
- const logWarning = (rawMessage, ...rawParams) => {
217
- const message = redactString(rawMessage);
218
- const optionalParams = redact(rawParams);
219
- if (!isEnabled() || !isLogLevelAllowed(LogLevels.WARN.level)) {
220
- return;
221
- }
222
- console.warn(`${LogLevels.WARN.color}[WARNING]: ${message}${Colors.RESET}`, ...optionalParams);
223
- safe(() => remote?.log?.('warn', message, optionalParams));
224
- };
225
- const logError = (rawMessage, ...rawParams) => {
226
- const message = redactString(rawMessage);
227
- const optionalParams = redact(rawParams);
228
- if (isEnabled() && isLogLevelAllowed(LogLevels.ERROR.level)) {
229
- console.error(`${LogLevels.ERROR.color}[ERROR]: ${message}${Colors.RESET}`, ...optionalParams);
230
- }
231
- // Always forward errors to the remote sink — even when console logging is muted —
232
- // so production crash reporting still works with `loggingEnabled: false`.
233
- safe(() => remote?.log?.('error', message, optionalParams));
234
- // First optional param is treated as the underlying error if it looks like one.
235
- const candidate = optionalParams[0];
236
- if (candidate !== undefined) {
237
- forwardErrorToRemote(toErrorObject(candidate), {
238
- source: 'Logger.error',
239
- message
240
- });
241
- }
242
- };
243
- const breadcrumb = (rawMessage, rawData) => {
244
- const message = redactString(rawMessage);
245
- const data = redact(rawData);
246
- if (isEnabled() && isLogLevelAllowed('info')) {
247
- console.info(`${Colors.BLUE}[BREADCRUMB]: ${message}${Colors.RESET}`, data ?? '');
248
- }
249
- safe(() => remote?.breadcrumb?.(message, data));
250
- };
251
- const recordError = (error, rawContext) => {
252
- const err = redact(toErrorObject(error));
253
- const context = redact(rawContext);
254
- if (isEnabled() && isLogLevelAllowed('error')) {
255
- console.error(`${Colors.RED_BOLD}[RECORDED]: ${err.message}${Colors.RESET}`, context ?? '');
256
- }
257
- forwardErrorToRemote(err, context);
258
- };
259
- const setUser = (id, attrs) => {
260
- safe(() => remote?.setUser?.(id, attrs));
261
- };
262
- const setAttribute = (key, value) => {
263
- safe(() => remote?.setAttribute?.(key, value));
264
- };
265
-
266
- /**
267
- * Record the active screen as a breadcrumb and remember it for subsequent
268
- * `recordError` context. Re-tracking the same screen name is a no-op.
269
- */
270
- const trackScreen = (name, params) => {
271
- if (name === currentScreen) {
272
- return;
273
- }
274
- currentScreen = name;
275
- screenHistory.push(name);
276
- if (screenHistory.length > loggerOptions.screenHistoryLimit) {
277
- screenHistory = screenHistory.slice(screenHistory.length - loggerOptions.screenHistoryLimit);
278
- }
279
- breadcrumb(`Screen: ${name}`, params);
280
- };
281
- const getCurrentScreen = () => currentScreen;
282
- const getScreenHistory = () => [...screenHistory];
283
- export const Logger = {
284
- info: logInfo,
285
- warn: logWarning,
286
- error: logError,
287
- breadcrumb,
288
- recordError,
289
- setUser,
290
- setAttribute,
291
- trackScreen,
292
- getCurrentScreen,
293
- getScreenHistory
294
- };
295
- //# sourceMappingURL=index.js.map
1
+ "use strict";import{getConfigValue}from"../config/index.js";import{redact,redactString}from"./redact.js";const Colors={RESET:"",GRAY:"",BLUE:"",YELLOW:"",RED_BOLD:""},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,44 +1 @@
1
- "use strict";
2
-
3
- const REDACTED = '[REDACTED]';
4
- const SECRET_KEYS = /^(token|accesstoken|refreshtoken|password|authorization)$/i;
5
- const BEARER = /\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi;
6
- const JWT = /\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/g;
7
- const KEYED_VALUE = /(["']?(?:token|accessToken|refreshToken|password|authorization)["']?\s*[:=]\s*)(?:"(?:[^"\\]|\\.)*"|'[^']*'|[^\s,;&}]+)/gi;
8
- const MAX_DEPTH = 6;
9
- export const redactString = input => input.replace(BEARER, `Bearer ${REDACTED}`).replace(JWT, REDACTED).replace(KEYED_VALUE, (_match, prefix) => `${prefix}"${REDACTED}"`);
10
- const redactInner = (value, depth, seen) => {
11
- if (typeof value === 'string') {
12
- return redactString(value);
13
- }
14
- if (value === null || typeof value !== 'object') {
15
- return value;
16
- }
17
- if (value instanceof Error) {
18
- value.message = redactString(value.message);
19
- if (value.stack) {
20
- value.stack = redactString(value.stack);
21
- }
22
- return value;
23
- }
24
- if (depth >= MAX_DEPTH || seen.has(value)) {
25
- return value;
26
- }
27
- seen.add(value);
28
- if (Array.isArray(value)) {
29
- return value.map(item => redactInner(item, depth + 1, seen));
30
- }
31
- const proto = Object.getPrototypeOf(value);
32
- if (proto !== Object.prototype && proto !== null) {
33
- return value;
34
- }
35
- const out = {};
36
- for (const [key, item] of Object.entries(value)) {
37
- out[key] = SECRET_KEYS.test(key) ? REDACTED : redactInner(item, depth + 1, seen);
38
- }
39
- return out;
40
- };
41
-
42
- /** Returns a copy with secrets masked; Errors are masked in place so identity and stack survive. */
43
- export const redact = value => redactInner(value, 0, new WeakSet());
44
- //# sourceMappingURL=redact.js.map
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,4 +1 @@
1
- "use strict";
2
-
3
- export { addNetworkStatusListener, getNetworkStatus, setNetworkStatusImplementation, useNetworkStatus } from "./networkStatus.js";
4
- //# sourceMappingURL=index.js.map
1
+ "use strict";export{addNetworkStatusListener,getNetworkStatus,setNetworkStatusImplementation,useNetworkStatus}from"./networkStatus.js";
@@ -1,161 +1 @@
1
- "use strict";
2
-
3
- import * as ExpoNetwork from 'expo-network';
4
- import { useEffect, useState } from 'react';
5
- import { Logger } from "../logger/index.js";
6
- const DEFAULT_STATUS = {
7
- isConnected: true,
8
- isInternetReachable: null,
9
- type: 'unknown'
10
- };
11
- /**
12
- * expo-network is imported directly, not resolved through a seam.
13
- *
14
- * `expo` is a REQUIRED peer of this package, so every consumer has the Expo
15
- * modules by construction and the static-require problem that forced the old
16
- * injection design does not arise. An app wires nothing: connectivity works
17
- * because the library uses Expo, which is the point of the Expo-first policy.
18
- * One backend also means one behaviour, rather than each app choosing.
19
- */
20
- let override = null;
21
- let lastKnown = null;
22
- let stopFollowing = null;
23
- const stopFollowingNetwork = () => {
24
- stopFollowing?.();
25
- stopFollowing = null;
26
- lastKnown = null;
27
- };
28
-
29
- /**
30
- * Replace the backend. Intended for TESTS and for the showcase, which uses it
31
- * to reach error paths that a healthy device never takes; it is not the way an
32
- * app is meant to configure the library. Pass `null` to restore expo-network.
33
- */
34
- export const setNetworkStatusImplementation = impl => {
35
- override = impl;
36
- stopFollowingNetwork();
37
- };
38
- const resolveNetInfo = () => override ?? expoNetworkBackend;
39
-
40
- /**
41
- * expo-network in the shape this module already speaks.
42
- *
43
- * The conversion is not cosmetic: expo reports its type as an UPPERCASE enum
44
- * where this module's vocabulary is lowercase, marks every field optional, and
45
- * returns an EventSubscription where an unsubscribe function is expected.
46
- */
47
- const expoNetworkBackend = {
48
- fetch: async () => {
49
- const state = await ExpoNetwork.getNetworkStateAsync();
50
- return {
51
- isConnected: state?.isConnected !== false,
52
- isInternetReachable: state?.isInternetReachable ?? null,
53
- type: state?.type ? String(state.type).toLowerCase() : undefined
54
- };
55
- },
56
- addEventListener: cb => {
57
- const subscription = ExpoNetwork.addNetworkStateListener(state => {
58
- cb({
59
- isConnected: state?.isConnected !== false,
60
- isInternetReachable: state?.isInternetReachable ?? null,
61
- type: state?.type ? String(state.type).toLowerCase() : undefined
62
- });
63
- });
64
- return () => subscription.remove();
65
- }
66
- };
67
- const normalize = state => {
68
- if (!state) {
69
- return DEFAULT_STATUS;
70
- }
71
- return {
72
- isConnected: state.isConnected !== false,
73
- isInternetReachable: state.isInternetReachable,
74
- type: state.type ?? 'unknown'
75
- };
76
- };
77
-
78
- /**
79
- * Imperative one-shot fetch of current network status. Resolves to the default
80
- * online status when NetInfo is unavailable so callers never crash.
81
- */
82
- export const getNetworkStatus = async () => {
83
- const ni = resolveNetInfo();
84
- if (!ni) {
85
- return DEFAULT_STATUS;
86
- }
87
- try {
88
- const state = await ni.fetch();
89
- return normalize(state);
90
- } catch (error) {
91
- Logger.error('[network] getNetworkStatus failed', error);
92
- return DEFAULT_STATUS;
93
- }
94
- };
95
-
96
- /**
97
- * Subscribe to network status changes. Returns an unsubscribe function.
98
- */
99
- export const addNetworkStatusListener = listener => {
100
- const ni = resolveNetInfo();
101
- if (!ni) {
102
- return () => undefined;
103
- }
104
- return ni.addEventListener(state => listener(normalize(state)));
105
- };
106
-
107
- /**
108
- * The connectivity the HTTP client checks before every request. One listener,
109
- * attached on first use, keeps it current, so a request costs no native probe:
110
- * one probe seeds the value and the listener's events replace it.
111
- */
112
- export const getLastKnownNetworkStatus = async () => {
113
- if (!stopFollowing) {
114
- try {
115
- stopFollowing = addNetworkStatusListener(status => {
116
- lastKnown = status;
117
- });
118
- } catch (error) {
119
- Logger.error('[network] could not follow network changes', error);
120
- return getNetworkStatus();
121
- }
122
- }
123
- if (lastKnown) {
124
- return lastKnown;
125
- }
126
- const following = stopFollowing;
127
- const probed = await getNetworkStatus();
128
- if (stopFollowing !== following) {
129
- return probed;
130
- }
131
- // An event that arrived during the probe is newer than the probe.
132
- lastKnown ??= probed;
133
- return lastKnown;
134
- };
135
-
136
- /**
137
- * React hook that returns the current network status and re-renders on change.
138
- * Reports an optimistic online default when NetInfo is not installed.
139
- */
140
- export const useNetworkStatus = () => {
141
- const [status, setStatus] = useState(DEFAULT_STATUS);
142
- useEffect(() => {
143
- let mounted = true;
144
- void getNetworkStatus().then(s => {
145
- if (mounted) {
146
- setStatus(s);
147
- }
148
- });
149
- const unsubscribe = addNetworkStatusListener(s => {
150
- if (mounted) {
151
- setStatus(s);
152
- }
153
- });
154
- return () => {
155
- mounted = false;
156
- unsubscribe();
157
- };
158
- }, []);
159
- return status;
160
- };
161
- //# sourceMappingURL=networkStatus.js.map
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,15 +1 @@
1
- "use strict";
2
-
3
- import { registerPermissionAdapter } from "./index.js";
4
-
5
- /** The one place `expo-calendar` is named. Import only if you use calendar/reminders. */
6
- const m = require('expo-calendar');
7
- registerPermissionAdapter('calendar', {
8
- check: m.getCalendarPermissionsAsync,
9
- request: m.requestCalendarPermissionsAsync
10
- });
11
- registerPermissionAdapter('reminders', {
12
- check: m.getRemindersPermissionsAsync,
13
- request: m.requestRemindersPermissionsAsync
14
- });
15
- //# sourceMappingURL=calendar.js.map
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,15 +1 @@
1
- "use strict";
2
-
3
- import { registerPermissionAdapter } from "./index.js";
4
-
5
- /** The one place `expo-camera` is named. Import only if you use camera/microphone. */
6
- const m = require('expo-camera');
7
- registerPermissionAdapter('camera', {
8
- check: m.getCameraPermissionsAsync,
9
- request: m.requestCameraPermissionsAsync
10
- });
11
- registerPermissionAdapter('microphone', {
12
- check: m.getMicrophonePermissionsAsync,
13
- request: m.requestMicrophonePermissionsAsync
14
- });
15
- //# sourceMappingURL=camera.js.map
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,11 +1 @@
1
- "use strict";
2
-
3
- import { registerPermissionAdapter } from "./index.js";
4
-
5
- /** The one place `expo-contacts` is named. Import only if you use contacts. */
6
- const m = require('expo-contacts');
7
- registerPermissionAdapter('contacts', {
8
- check: m.getPermissionsAsync,
9
- request: m.requestPermissionsAsync
10
- });
11
- //# sourceMappingURL=contacts.js.map
1
+ "use strict";import{registerPermissionAdapter}from"./index.js";const m=require("expo-contacts");registerPermissionAdapter("contacts",{check:m.getPermissionsAsync,request:m.requestPermissionsAsync});