@zoho_apptics/apptics-js-sdk 2.0.0-beta → 2.0.0-beta.2

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 (236) hide show
  1. package/CHANGELOG.md +191 -21
  2. package/README.md +519 -333
  3. package/dist/apptics.esm.min.js +2 -2
  4. package/dist/apptics.esm.min.js.map +1 -1
  5. package/dist/apptics.min.js +2 -2
  6. package/dist/apptics.min.js.map +1 -1
  7. package/dist/chunks/lifecycle-C6m1W7jo.min.js +3 -0
  8. package/dist/chunks/lifecycle-C6m1W7jo.min.js.map +1 -0
  9. package/dist/chunks/send-CgUO82ne.min.js +3 -0
  10. package/dist/chunks/send-CgUO82ne.min.js.map +1 -0
  11. package/dist/cjs/core/attempts.js +1 -1
  12. package/dist/cjs/core/batch.js +2 -2
  13. package/dist/cjs/core/consent.d.ts +18 -4
  14. package/dist/cjs/core/consent.js +31 -15
  15. package/dist/cjs/core/constants.d.ts +57 -27
  16. package/dist/cjs/core/constants.js +52 -33
  17. package/dist/cjs/core/db.d.ts +12 -4
  18. package/dist/cjs/core/db.js +167 -34
  19. package/dist/cjs/core/debug.js +1 -1
  20. package/dist/cjs/core/env.d.ts +0 -3
  21. package/dist/cjs/core/env.js +1 -9
  22. package/dist/cjs/core/framework-id.d.ts +1 -1
  23. package/dist/cjs/core/framework-id.js +3 -3
  24. package/dist/cjs/core/guard.d.ts +9 -0
  25. package/dist/cjs/core/guard.js +27 -13
  26. package/dist/cjs/core/hooks.d.ts +7 -4
  27. package/dist/cjs/core/hooks.js +3 -3
  28. package/dist/cjs/core/locks.d.ts +9 -0
  29. package/dist/cjs/core/locks.js +22 -0
  30. package/dist/cjs/core/logger.d.ts +3 -4
  31. package/dist/cjs/core/logger.js +4 -40
  32. package/dist/cjs/core/state.d.ts +9 -6
  33. package/dist/cjs/core/state.js +3 -5
  34. package/dist/cjs/core/storage.d.ts +20 -5
  35. package/dist/cjs/core/storage.js +115 -20
  36. package/dist/cjs/core/stylesheet.d.ts +8 -0
  37. package/dist/cjs/core/stylesheet.js +29 -0
  38. package/dist/cjs/core/transport.d.ts +2 -0
  39. package/dist/cjs/core/transport.js +30 -18
  40. package/dist/cjs/core/utils.js +1 -1
  41. package/dist/cjs/core/validate.js +2 -2
  42. package/dist/cjs/device/appversion.d.ts +10 -6
  43. package/dist/cjs/device/appversion.js +38 -3
  44. package/dist/cjs/device/index.d.ts +28 -2
  45. package/dist/cjs/device/index.js +312 -44
  46. package/dist/cjs/engagement/api-rules.d.ts +32 -67
  47. package/dist/cjs/engagement/api-rules.js +144 -157
  48. package/dist/cjs/engagement/auto-api.js +2 -2
  49. package/dist/cjs/engagement/auto-screen.d.ts +2 -0
  50. package/dist/cjs/engagement/auto-screen.js +67 -3
  51. package/dist/cjs/engagement/defined-events.js +1 -1
  52. package/dist/cjs/engagement/send.js +12 -3
  53. package/dist/cjs/engagement/session.d.ts +29 -3
  54. package/dist/cjs/engagement/session.js +253 -26
  55. package/dist/cjs/engagement/track.d.ts +4 -4
  56. package/dist/cjs/engagement/track.js +58 -30
  57. package/dist/cjs/errors/send.js +2 -2
  58. package/dist/cjs/errors/track.d.ts +2 -1
  59. package/dist/cjs/errors/track.js +49 -7
  60. package/dist/cjs/feedback/controls.d.ts +12 -0
  61. package/dist/cjs/feedback/controls.js +104 -25
  62. package/dist/cjs/feedback/index.d.ts +8 -7
  63. package/dist/cjs/feedback/index.js +32 -13
  64. package/dist/cjs/feedback/logs.d.ts +13 -11
  65. package/dist/cjs/feedback/logs.js +57 -28
  66. package/dist/cjs/feedback/quartz.d.ts +18 -0
  67. package/dist/cjs/feedback/quartz.js +105 -0
  68. package/dist/cjs/feedback/send.d.ts +5 -2
  69. package/dist/cjs/feedback/send.js +30 -28
  70. package/dist/cjs/feedback/styles.d.ts +10 -0
  71. package/dist/cjs/feedback/styles.js +8 -0
  72. package/dist/cjs/feedback/template.d.ts +1 -1
  73. package/dist/cjs/feedback/template.js +20 -12
  74. package/dist/cjs/feedback/ui.d.ts +21 -6
  75. package/dist/cjs/feedback/ui.js +283 -70
  76. package/dist/cjs/heatmap/send.d.ts +2 -0
  77. package/dist/cjs/heatmap/send.js +3 -5
  78. package/dist/cjs/heatmap/track.d.ts +1 -1
  79. package/dist/cjs/heatmap/track.js +87 -16
  80. package/dist/cjs/index.d.ts +16 -63
  81. package/dist/cjs/index.js +144 -95
  82. package/dist/cjs/lifecycle.d.ts +21 -3
  83. package/dist/cjs/lifecycle.js +353 -89
  84. package/dist/cjs/remoteconfig/country.d.ts +4 -0
  85. package/dist/cjs/remoteconfig/country.js +73 -0
  86. package/dist/cjs/remoteconfig/custom.d.ts +7 -7
  87. package/dist/cjs/remoteconfig/custom.js +31 -51
  88. package/dist/cjs/remoteconfig/evaluate.d.ts +3 -3
  89. package/dist/cjs/remoteconfig/evaluate.js +56 -43
  90. package/dist/cjs/remoteconfig/fetch.d.ts +16 -9
  91. package/dist/cjs/remoteconfig/fetch.js +120 -39
  92. package/dist/cjs/remoteconfig/index.d.ts +19 -8
  93. package/dist/cjs/remoteconfig/index.js +81 -39
  94. package/dist/cjs/remoteconfig/store.d.ts +15 -7
  95. package/dist/cjs/remoteconfig/store.js +68 -35
  96. package/dist/cjs/remoteconfig/tz-countries.d.ts +8 -0
  97. package/dist/cjs/remoteconfig/tz-countries.js +13 -0
  98. package/dist/{esm/core → cjs/remotelog}/callsite.d.ts +11 -4
  99. package/dist/cjs/{core → remotelog}/callsite.js +30 -7
  100. package/dist/cjs/remotelog/gate.d.ts +2 -11
  101. package/dist/cjs/remotelog/gate.js +9 -35
  102. package/dist/cjs/remotelog/index.d.ts +4 -21
  103. package/dist/cjs/remotelog/logger.d.ts +11 -17
  104. package/dist/cjs/remotelog/logger.js +31 -59
  105. package/dist/cjs/remotelog/send.js +11 -11
  106. package/dist/cjs/remotelogger/index.d.ts +12 -0
  107. package/dist/cjs/remotelogger/index.js +18 -0
  108. package/dist/cjs/scheduler.d.ts +3 -1
  109. package/dist/cjs/scheduler.js +25 -22
  110. package/dist/cjs/types.d.ts +208 -90
  111. package/dist/cjs/user/index.js +16 -7
  112. package/dist/esm/core/attempts.js +1 -1
  113. package/dist/esm/core/batch.js +2 -2
  114. package/dist/esm/core/consent.d.ts +18 -4
  115. package/dist/esm/core/consent.js +32 -17
  116. package/dist/esm/core/constants.d.ts +57 -27
  117. package/dist/esm/core/constants.js +51 -33
  118. package/dist/esm/core/db.d.ts +12 -4
  119. package/dist/esm/core/db.js +164 -35
  120. package/dist/esm/core/debug.js +1 -1
  121. package/dist/esm/core/env.d.ts +0 -3
  122. package/dist/esm/core/env.js +2 -9
  123. package/dist/esm/core/framework-id.d.ts +1 -1
  124. package/dist/esm/core/framework-id.js +3 -3
  125. package/dist/esm/core/guard.d.ts +9 -0
  126. package/dist/esm/core/guard.js +27 -14
  127. package/dist/esm/core/hooks.d.ts +7 -4
  128. package/dist/esm/core/hooks.js +3 -3
  129. package/dist/esm/core/locks.d.ts +9 -0
  130. package/dist/esm/core/locks.js +20 -0
  131. package/dist/esm/core/logger.d.ts +3 -4
  132. package/dist/esm/core/logger.js +4 -40
  133. package/dist/esm/core/state.d.ts +9 -6
  134. package/dist/esm/core/state.js +3 -5
  135. package/dist/esm/core/storage.d.ts +20 -5
  136. package/dist/esm/core/storage.js +113 -21
  137. package/dist/esm/core/stylesheet.d.ts +8 -0
  138. package/dist/esm/core/stylesheet.js +27 -0
  139. package/dist/esm/core/transport.d.ts +2 -0
  140. package/dist/esm/core/transport.js +30 -19
  141. package/dist/esm/core/utils.js +1 -1
  142. package/dist/esm/core/validate.js +2 -2
  143. package/dist/esm/device/appversion.d.ts +10 -6
  144. package/dist/esm/device/appversion.js +37 -4
  145. package/dist/esm/device/index.d.ts +28 -2
  146. package/dist/esm/device/index.js +313 -49
  147. package/dist/esm/engagement/api-rules.d.ts +32 -67
  148. package/dist/esm/engagement/api-rules.js +143 -155
  149. package/dist/esm/engagement/auto-api.js +3 -3
  150. package/dist/esm/engagement/auto-screen.d.ts +2 -0
  151. package/dist/esm/engagement/auto-screen.js +67 -4
  152. package/dist/esm/engagement/defined-events.js +1 -1
  153. package/dist/esm/engagement/send.js +12 -3
  154. package/dist/esm/engagement/session.d.ts +29 -3
  155. package/dist/esm/engagement/session.js +251 -30
  156. package/dist/esm/engagement/track.d.ts +4 -4
  157. package/dist/esm/engagement/track.js +65 -37
  158. package/dist/esm/errors/send.js +2 -2
  159. package/dist/esm/errors/track.d.ts +2 -1
  160. package/dist/esm/errors/track.js +49 -7
  161. package/dist/esm/feedback/controls.d.ts +12 -0
  162. package/dist/esm/feedback/controls.js +103 -26
  163. package/dist/esm/feedback/index.d.ts +8 -7
  164. package/dist/esm/feedback/index.js +34 -13
  165. package/dist/esm/feedback/logs.d.ts +13 -11
  166. package/dist/esm/feedback/logs.js +59 -30
  167. package/dist/esm/feedback/quartz.d.ts +18 -0
  168. package/dist/esm/feedback/quartz.js +99 -0
  169. package/dist/esm/feedback/send.d.ts +5 -2
  170. package/dist/esm/feedback/send.js +31 -31
  171. package/dist/esm/feedback/styles.d.ts +10 -0
  172. package/dist/esm/feedback/styles.js +4 -0
  173. package/dist/esm/feedback/template.d.ts +1 -1
  174. package/dist/esm/feedback/template.js +20 -12
  175. package/dist/esm/feedback/ui.d.ts +21 -6
  176. package/dist/esm/feedback/ui.js +283 -71
  177. package/dist/esm/heatmap/send.d.ts +2 -0
  178. package/dist/esm/heatmap/send.js +3 -5
  179. package/dist/esm/heatmap/track.d.ts +1 -1
  180. package/dist/esm/heatmap/track.js +87 -16
  181. package/dist/esm/index.d.ts +16 -63
  182. package/dist/esm/index.js +148 -83
  183. package/dist/esm/lifecycle.d.ts +21 -3
  184. package/dist/esm/lifecycle.js +359 -98
  185. package/dist/esm/remoteconfig/country.d.ts +4 -0
  186. package/dist/esm/remoteconfig/country.js +70 -0
  187. package/dist/esm/remoteconfig/custom.d.ts +7 -7
  188. package/dist/esm/remoteconfig/custom.js +32 -52
  189. package/dist/esm/remoteconfig/evaluate.d.ts +3 -3
  190. package/dist/esm/remoteconfig/evaluate.js +57 -44
  191. package/dist/esm/remoteconfig/fetch.d.ts +16 -9
  192. package/dist/esm/remoteconfig/fetch.js +120 -39
  193. package/dist/esm/remoteconfig/index.d.ts +19 -8
  194. package/dist/esm/remoteconfig/index.js +82 -40
  195. package/dist/esm/remoteconfig/store.d.ts +15 -7
  196. package/dist/esm/remoteconfig/store.js +68 -36
  197. package/dist/esm/remoteconfig/tz-countries.d.ts +8 -0
  198. package/dist/esm/remoteconfig/tz-countries.js +11 -0
  199. package/dist/{cjs/core → esm/remotelog}/callsite.d.ts +11 -4
  200. package/dist/esm/{core → remotelog}/callsite.js +30 -8
  201. package/dist/esm/remotelog/gate.d.ts +2 -11
  202. package/dist/esm/remotelog/gate.js +10 -32
  203. package/dist/esm/remotelog/index.d.ts +4 -21
  204. package/dist/esm/remotelog/logger.d.ts +11 -17
  205. package/dist/esm/remotelog/logger.js +33 -61
  206. package/dist/esm/remotelog/send.js +13 -13
  207. package/dist/esm/remotelogger/index.d.ts +12 -0
  208. package/dist/esm/remotelogger/index.js +13 -0
  209. package/dist/esm/scheduler.d.ts +3 -1
  210. package/dist/esm/scheduler.js +26 -24
  211. package/dist/esm/types.d.ts +208 -90
  212. package/dist/esm/user/index.js +18 -8
  213. package/dist/feedback.esm.min.js +2 -2
  214. package/dist/feedback.esm.min.js.map +1 -1
  215. package/dist/remoteconfig.esm.min.js +3 -0
  216. package/dist/remoteconfig.esm.min.js.map +1 -0
  217. package/dist/remotelogger.esm.min.js +3 -0
  218. package/dist/remotelogger.esm.min.js.map +1 -0
  219. package/package.json +16 -17
  220. package/dist/chunks/batch-BU_mTpm1.min.js +0 -3
  221. package/dist/chunks/batch-BU_mTpm1.min.js.map +0 -1
  222. package/dist/chunks/logs-Bea5zUW_.min.js +0 -3
  223. package/dist/chunks/logs-Bea5zUW_.min.js.map +0 -1
  224. package/dist/cjs/auto-init.d.ts +0 -8
  225. package/dist/cjs/auto-init.js +0 -32
  226. package/dist/cjs/heatmap/index.d.ts +0 -16
  227. package/dist/cjs/heatmap/index.js +0 -22
  228. package/dist/cjs/remotelog/index.js +0 -55
  229. package/dist/esm/auto-init.d.ts +0 -8
  230. package/dist/esm/auto-init.js +0 -29
  231. package/dist/esm/heatmap/index.d.ts +0 -16
  232. package/dist/esm/heatmap/index.js +0 -17
  233. package/dist/esm/remotelog/index.js +0 -51
  234. package/dist/heatmap.esm.min.js +0 -3
  235. package/dist/heatmap.esm.min.js.map +0 -1
  236. package/dist/style.css +0 -1
@@ -1,19 +1,20 @@
1
- /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta | (c) Zoho Corporation Private Limited | see LICENSE */
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.2 | (c) Zoho Corporation Private Limited | see LICENSE */
2
2
  import { Console } from '../core/logger.js';
3
3
  import { user_defaults } from '../core/storage.js';
4
+ import { nowMs } from '../core/utils.js';
4
5
  import { resolveAll, resetEvaluationWarnings } from './evaluate.js';
5
6
 
6
7
  /**
7
8
  * What remote config keeps between visits.
8
9
  *
9
- * The rule set is stored, not just the resolved values, for two reasons. The server only resends
10
- * it when something changed — a fetch with a non-zero `flagtime` and no changes answers with no
11
- * `remoteconfig` block at all — so throwing it away would mean asking for it again with
12
- * flagtime 0 on every visit. And the resolved values depend on the device: an app version or a
13
- * customer group that changed since the last visit has to re-resolve against the same rules.
10
+ * The rule set is stored, not just the resolved values: the values depend on the device, so an
11
+ * app version or a customer group that changed has to re-resolve against the same rules, and a
12
+ * visit that cannot reach the server still has the last visit's values to read.
14
13
  *
15
- * `flagtime` is the whole protocol here: it is the moment this SDK last had a rule set, and
16
- * sending it back is how the server decides whether anything needs saying.
14
+ * `flagtime` is the whole protocol here. The first getupdates of a page load sends 0 and gets the
15
+ * whole rule set, which replaces what is stored. Each later one sends the time the last answered
16
+ * request went out, and gets only what was added or changed since: those parameters and
17
+ * conditions are merged into the stored set, and one that did not change is kept as it was.
17
18
  */
18
19
  const STORE_KEY = 'remoteconfig'; // no i18n
19
20
  var values = {};
@@ -22,55 +23,86 @@ function read() {
22
23
  var saved = user_defaults.item(STORE_KEY);
23
24
  return saved && typeof saved === 'object' ? saved : null;
24
25
  }
25
- /** The flagtime to send: 0 until we hold a rule set, which asks the server for everything. */
26
+ /** When the last answered getupdates went out; 0 when nothing is stored. */
26
27
  function flagtime() {
27
28
  var saved = read();
28
29
  return saved && typeof saved.flagtime === 'number' ? saved.flagtime : 0;
29
30
  }
30
- /**
31
- * The newest `version[].date` in a rule set, which is what the next fetch sends as flagtime.
32
- *
33
- * The array is a publication history and is not promised to be in order, so it is the highest
34
- * date that matters rather than the first or last entry.
35
- */
36
- function publishedAt(rules) {
37
- var versions = Array.isArray(rules.version) ? rules.version : [];
38
- var newest = 0;
39
- versions.forEach(function (one) {
40
- var at = Number(one.date);
41
- if (isFinite(at) && at > newest) {
42
- newest = at;
43
- }
44
- });
45
- return newest;
46
- }
47
31
  /** Re-resolves the stored rules against this device, without fetching. */
48
32
  function reresolve() {
49
33
  var saved = read();
50
34
  values = saved && saved.rules ? resolveAll(saved.rules) : {};
51
35
  loaded = true;
52
36
  }
53
- /** Stores a rule set the server just sent, and resolves it. */
54
- function store(rules, at) {
37
+ /**
38
+ * Stores a whole rule set, the answer to flagtime 0, in place of what was stored, and resolves
39
+ * it. `askedAt` is when the request went out: the next one asks for what changed since then.
40
+ */
41
+ function store(rules, askedAt) {
55
42
  resetEvaluationWarnings();
56
- var record = { flagtime: publishedAt(rules) || at, rules: rules, fetchedat: at };
43
+ var record = { flagtime: askedAt, rules: rules, fetchedat: nowMs() };
57
44
  user_defaults.add(STORE_KEY, record);
58
45
  values = resolveAll(rules);
59
46
  loaded = true;
60
- Console.log('AppticsRemoteConfig: ' + Object.keys(values).length + ' parameters, published ' + record.flagtime); // no i18n
47
+ Console.log('AppticsRemoteConfig: ' + Object.keys(values).length + ' parameters, as of ' + askedAt); // no i18n
48
+ }
49
+ /**
50
+ * `changed` laid over `stored`, matched by `key`: an entry the server resent replaces the one
51
+ * with the same key, in its place; a new one goes on the end; the rest stay as they were.
52
+ */
53
+ function mergeList(stored, changed, key) {
54
+ var out = Array.isArray(stored) ? stored.slice() : [];
55
+ if (!Array.isArray(changed)) {
56
+ return out;
57
+ }
58
+ changed.forEach(function (entry) {
59
+ if (!entry || typeof entry !== 'object') {
60
+ return;
61
+ }
62
+ var id = key(entry);
63
+ var at = id === '' ? -1 : out.findIndex(function (one) { return key(one) === id; });
64
+ if (at >= 0) {
65
+ out[at] = entry;
66
+ }
67
+ else {
68
+ out.push(entry);
69
+ }
70
+ });
71
+ return out;
72
+ }
73
+ /** An entry's id, or its name when it has none, as the key to match a resent entry by. */
74
+ function idOr(idKey, nameKey) {
75
+ return function (entry) {
76
+ var id = entry[idKey] !== undefined && entry[idKey] !== null ? entry[idKey] : entry[nameKey];
77
+ return id === undefined || id === null ? '' : String(id); // no i18n
78
+ };
79
+ }
80
+ /**
81
+ * Merges what a later getupdates sent, everything added or changed since its flagtime, into the
82
+ * stored rule set, and resolves the result. With nothing stored, it is the whole set.
83
+ */
84
+ function merge(changes, askedAt) {
85
+ var saved = read();
86
+ var base = saved && saved.rules && typeof saved.rules === 'object' ? saved.rules : {};
87
+ var rules = Object.assign({}, base, changes);
88
+ rules.all_parameter = mergeList(base.all_parameter, changes.all_parameter, idOr('paramid', 'paramname')); // no i18n
89
+ rules.all_condition = mergeList(base.all_condition, changes.all_condition, idOr('conditionid', 'conditionname')); // no i18n
90
+ rules.version = mergeList(base.version, changes.version, idOr('versionid', 'date')); // no i18n
91
+ store(rules, askedAt);
61
92
  }
62
93
  /**
63
- * Records a fetch that brought no rule set.
94
+ * Records a later fetch that brought no changes.
64
95
  *
65
- * That is the normal answer when nothing has changed, and it is not a failure: what is stored
66
- * stays, and only the fetch time moves.
96
+ * That is the normal answer, and it is not a failure: what is stored stays, and the next request
97
+ * asks for what changed since this one went out.
67
98
  */
68
- function storeUnchanged(at) {
99
+ function storeUnchanged(askedAt) {
69
100
  var saved = read();
70
101
  if (saved === null) {
71
102
  return;
72
103
  }
73
- saved.fetchedat = at;
104
+ saved.flagtime = askedAt;
105
+ saved.fetchedat = nowMs();
74
106
  user_defaults.add(STORE_KEY, saved);
75
107
  }
76
108
  /** Forgets the rule set and its values, so the next fetch asks with flagtime 0. */
@@ -88,4 +120,4 @@ function all() {
88
120
  return values;
89
121
  }
90
122
 
91
- export { all, clearRemoteConfig, flagtime, reresolve, store, storeUnchanged };
123
+ export { all, clearRemoteConfig, flagtime, merge, reresolve, store, storeUnchanged };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The country of every IANA time zone, by its ISO 3166 code: generated by
3
+ * scripts/tz-countries.mjs from tzdata 2026d-rearguard (zone.tab, and the old names its links keep).
4
+ * Do not edit by hand.
5
+ *
6
+ * Packed as "CC:Area/City,City|Area/City;CC:...": a country, then its zones grouped by area.
7
+ */
8
+ export declare const TZ_COUNTRIES = "AD:Europe/Andorra;AE:Asia/Dubai;AF:Asia/Kabul;AG:America/Antigua;AI:America/Anguilla;AL:Europe/Tirane;AM:Asia/Yerevan;AO:Africa/Luanda;AQ:Antarctica/Casey,Davis,DumontDUrville,Mawson,McMurdo,Palmer,Rothera,Syowa,Troll,Vostok;AR:America/Argentina/Buenos_Aires,Argentina/Catamarca,Argentina/ComodRivadavia,Argentina/Cordoba,Argentina/Jujuy,Argentina/La_Rioja,Argentina/Mendoza,Argentina/Rio_Gallegos,Argentina/Salta,Argentina/San_Juan,Argentina/San_Luis,Argentina/Tucuman,Argentina/Ushuaia,Buenos_Aires,Catamarca,Cordoba,Jujuy,Mendoza,Rosario;AS:Pacific/Pago_Pago,Samoa|US/Samoa;AT:Europe/Vienna;AU:Antarctica/Macquarie|Australia/ACT,Adelaide,Brisbane,Broken_Hill,Canberra,Currie,Darwin,Eucla,Hobart,LHI,Lindeman,Lord_Howe,Melbourne,NSW,North,Perth,Queensland,South,Sydney,Tasmania,Victoria,West,Yancowinna;AW:America/Aruba;AX:Europe/Mariehamn;AZ:Asia/Baku;BA:Europe/Sarajevo;BB:America/Barbados;BD:Asia/Dacca,Dhaka;BE:CET,MET|Europe/Brussels;BF:Africa/Ouagadougou;BG:Europe/Sofia;BH:Asia/Bahrain;BI:Africa/Bujumbura;BJ:Africa/Porto-Novo;BL:America/St_Barthelemy;BM:Atlantic/Bermuda;BN:Asia/Brunei;BO:America/La_Paz;BQ:America/Kralendijk;BR:America/Araguaina,Bahia,Belem,Boa_Vista,Campo_Grande,Cuiaba,Eirunepe,Fortaleza,Maceio,Manaus,Noronha,Porto_Acre,Porto_Velho,Recife,Rio_Branco,Santarem,Sao_Paulo|Brazil/Acre,DeNoronha,East,West;BS:America/Nassau;BT:Asia/Thimbu,Thimphu;BW:Africa/Gaborone;BY:Europe/Minsk;BZ:America/Belize;CA:America/Atikokan,Blanc-Sablon,Cambridge_Bay,Creston,Dawson,Dawson_Creek,Edmonton,Fort_Nelson,Glace_Bay,Goose_Bay,Halifax,Inuvik,Iqaluit,Moncton,Montreal,Nipigon,Pangnirtung,Rainy_River,Rankin_Inlet,Regina,Resolute,St_Johns,Swift_Current,Thunder_Bay,Toronto,Vancouver,Whitehorse,Winnipeg,Yellowknife|Canada/Atlantic,Central,Eastern,Mountain,Newfoundland,Pacific,Saskatchewan,Yukon;CC:Indian/Cocos;CD:Africa/Kinshasa,Lubumbashi;CF:Africa/Bangui;CG:Africa/Brazzaville;CH:Europe/Zurich;CI:Africa/Abidjan,Timbuktu|Iceland;CK:Pacific/Rarotonga;CL:America/Coyhaique,Punta_Arenas,Santiago|Chile/Continental,EasterIsland|Pacific/Easter;CM:Africa/Douala;CN:Asia/Chongqing,Chungking,Harbin,Kashgar,Shanghai,Urumqi|PRC;CO:America/Bogota;CR:America/Costa_Rica;CU:America/Havana|Cuba;CV:Atlantic/Cape_Verde;CW:America/Curacao;CX:Indian/Christmas;CY:Asia/Famagusta,Nicosia|Europe/Nicosia;CZ:Europe/Prague;DE:Atlantic/Jan_Mayen|Europe/Berlin,Busingen;DJ:Africa/Djibouti;DK:Europe/Copenhagen;DM:America/Dominica;DO:America/Santo_Domingo;DZ:Africa/Algiers;EC:America/Guayaquil|Pacific/Galapagos;EE:Europe/Tallinn;EG:Africa/Cairo|Egypt;EH:Africa/El_Aaiun;ER:Africa/Asmara;ES:Africa/Ceuta|Atlantic/Canary|Europe/Madrid;ET:Africa/Addis_Ababa;FI:Europe/Helsinki;FJ:Pacific/Fiji;FK:Atlantic/Stanley;FM:Pacific/Chuuk,Kosrae,Pohnpei;FO:Atlantic/Faeroe,Faroe;FR:Europe/Paris;GA:Africa/Libreville;GB:Europe/Belfast,London|GB,GB-Eire;GD:America/Grenada;GE:Asia/Tbilisi;GF:America/Cayenne;GG:Europe/Guernsey;GH:Africa/Accra;GI:Europe/Gibraltar;GL:America/Danmarkshavn,Godthab,Nuuk,Scoresbysund,Thule;GM:Africa/Banjul;GN:Africa/Conakry;GP:America/Guadeloupe;GQ:Africa/Malabo;GR:EET|Europe/Athens;GS:Atlantic/South_Georgia;GT:America/Guatemala;GU:Pacific/Guam;GW:Africa/Bissau;GY:America/Guyana;HK:Asia/Hong_Kong|Hongkong;HN:America/Tegucigalpa;HR:Europe/Zagreb;HT:America/Port-au-Prince;HU:Europe/Budapest;ID:Asia/Jakarta,Jayapura,Makassar,Pontianak,Ujung_Pandang;IE:Eire|Europe/Dublin;IL:Asia/Jerusalem,Tel_Aviv|Israel;IM:Europe/Isle_of_Man;IN:Asia/Calcutta,Kolkata;IO:Indian/Chagos;IQ:Asia/Baghdad;IR:Asia/Tehran|Iran;IS:Atlantic/Reykjavik;IT:Europe/Rome;JE:Europe/Jersey;JM:America/Jamaica|Jamaica;JO:Asia/Amman;JP:Asia/Tokyo|Japan;KE:Africa/Asmera,Nairobi;KG:Asia/Bishkek;KH:Asia/Phnom_Penh;KI:Pacific/Enderbury,Kanton,Kiritimati,Tarawa;KM:Indian/Comoro;KN:America/St_Kitts;KP:Asia/Pyongyang;KR:Asia/Seoul|ROK;KW:Asia/Kuwait;KY:America/Cayman;KZ:Asia/Almaty,Aqtau,Aqtobe,Atyrau,Oral,Qostanay,Qyzylorda;LA:Asia/Vientiane;LB:Asia/Beirut;LC:America/St_Lucia;LI:Europe/Vaduz;LK:Asia/Colombo;LR:Africa/Monrovia;LS:Africa/Maseru;LT:Europe/Vilnius;LU:Europe/Luxembourg;LV:Europe/Riga;LY:Africa/Tripoli|Libya;MA:Africa/Casablanca;MC:Europe/Monaco;MD:Europe/Chisinau,Tiraspol;ME:Europe/Podgorica;MF:America/Marigot;MG:Indian/Antananarivo;MH:Kwajalein|Pacific/Kwajalein,Majuro;MK:Europe/Skopje;ML:Africa/Bamako;MM:Asia/Rangoon,Yangon;MN:Asia/Choibalsan,Hovd,Ulaanbaatar,Ulan_Bator;MO:Asia/Macao,Macau;MP:Pacific/Saipan;MQ:America/Martinique;MR:Africa/Nouakchott;MS:America/Montserrat;MT:Europe/Malta;MU:Indian/Mauritius;MV:Indian/Maldives;MW:Africa/Blantyre;MX:America/Bahia_Banderas,Cancun,Chihuahua,Ciudad_Juarez,Ensenada,Hermosillo,Matamoros,Mazatlan,Merida,Mexico_City,Monterrey,Ojinaga,Santa_Isabel,Tijuana|Mexico/BajaNorte,BajaSur,General;MY:Asia/Kuala_Lumpur,Kuching;MZ:Africa/Maputo;NA:Africa/Windhoek;NC:Pacific/Noumea;NE:Africa/Niamey;NF:Pacific/Norfolk;NG:Africa/Lagos;NI:America/Managua;NL:Europe/Amsterdam;NO:Europe/Oslo;NP:Asia/Kathmandu,Katmandu;NR:Pacific/Nauru;NU:Pacific/Niue;NZ:Antarctica/South_Pole|NZ,NZ-CHAT|Pacific/Auckland,Chatham;OM:Asia/Muscat;PA:America/Coral_Harbour,Panama|EST;PE:America/Lima;PF:Pacific/Gambier,Marquesas,Tahiti;PG:Pacific/Bougainville,Port_Moresby,Truk,Yap;PH:Asia/Manila;PK:Asia/Karachi;PL:Europe/Warsaw|Poland;PM:America/Miquelon;PN:Pacific/Pitcairn;PR:America/Puerto_Rico,Virgin;PS:Asia/Gaza,Hebron;PT:Atlantic/Azores,Madeira|Europe/Lisbon|Portugal,WET;PW:Pacific/Palau;PY:America/Asuncion;QA:Asia/Qatar;RE:Indian/Reunion;RO:Europe/Bucharest;RS:Europe/Belgrade;RU:Asia/Anadyr,Barnaul,Chita,Irkutsk,Kamchatka,Khandyga,Krasnoyarsk,Magadan,Novokuznetsk,Novosibirsk,Omsk,Sakhalin,Srednekolymsk,Tomsk,Ust-Nera,Vladivostok,Yakutsk,Yekaterinburg|Europe/Astrakhan,Kaliningrad,Kirov,Moscow,Samara,Saratov,Ulyanovsk,Volgograd|W-SU;RW:Africa/Kigali;SA:Asia/Riyadh;SB:Pacific/Guadalcanal,Ponape;SC:Indian/Mahe;SD:Africa/Khartoum;SE:Europe/Stockholm;SG:Asia/Singapore|Singapore;SH:Atlantic/St_Helena;SI:Europe/Ljubljana;SJ:Arctic/Longyearbyen;SK:Europe/Bratislava;SL:Africa/Freetown;SM:Europe/San_Marino;SN:Africa/Dakar;SO:Africa/Mogadishu;SR:America/Paramaribo;SS:Africa/Juba;ST:Africa/Sao_Tome;SV:America/El_Salvador;SX:America/Lower_Princes;SY:Asia/Damascus;SZ:Africa/Mbabane;TC:America/Grand_Turk;TD:Africa/Ndjamena;TF:Indian/Kerguelen;TG:Africa/Lome;TH:Asia/Bangkok;TJ:Asia/Dushanbe;TK:Pacific/Fakaofo;TL:Asia/Dili;TM:Asia/Ashgabat,Ashkhabad;TN:Africa/Tunis;TO:Pacific/Tongatapu;TR:Asia/Istanbul|Europe/Istanbul|Turkey;TT:America/Port_of_Spain;TV:Pacific/Funafuti;TW:Asia/Taipei|ROC;TZ:Africa/Dar_es_Salaam;UA:Europe/Kiev,Kyiv,Simferopol,Uzhgorod,Zaporozhye;UG:Africa/Kampala;UM:Pacific/Midway,Wake;US:America/Adak,Anchorage,Atka,Boise,Chicago,Denver,Detroit,Fort_Wayne,Indiana/Indianapolis,Indiana/Knox,Indiana/Marengo,Indiana/Petersburg,Indiana/Tell_City,Indiana/Vevay,Indiana/Vincennes,Indiana/Winamac,Indianapolis,Juneau,Kentucky/Louisville,Kentucky/Monticello,Knox_IN,Los_Angeles,Louisville,Menominee,Metlakatla,New_York,Nome,North_Dakota/Beulah,North_Dakota/Center,North_Dakota/New_Salem,Phoenix,Shiprock,Sitka,Yakutat|HST,MST,Navajo|Pacific/Honolulu,Johnston|US/Alaska,Aleutian,Arizona,Central,East-Indiana,Eastern,Hawaii,Indiana-Starke,Michigan,Mountain,Pacific;UY:America/Montevideo;UZ:Asia/Samarkand,Tashkent;VA:Europe/Vatican;VC:America/St_Vincent;VE:America/Caracas;VG:America/Tortola;VI:America/St_Thomas;VN:Asia/Ho_Chi_Minh,Saigon;VU:Pacific/Efate;WF:Pacific/Wallis;WS:Pacific/Apia;YE:Asia/Aden;YT:Indian/Mayotte;ZA:Africa/Johannesburg;ZM:Africa/Lusaka;ZW:Africa/Harare";
@@ -0,0 +1,11 @@
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.2 | (c) Zoho Corporation Private Limited | see LICENSE */
2
+ /**
3
+ * The country of every IANA time zone, by its ISO 3166 code: generated by
4
+ * scripts/tz-countries.mjs from tzdata 2026d-rearguard (zone.tab, and the old names its links keep).
5
+ * Do not edit by hand.
6
+ *
7
+ * Packed as "CC:Area/City,City|Area/City;CC:...": a country, then its zones grouped by area.
8
+ */
9
+ const TZ_COUNTRIES = 'AD:Europe/Andorra;AE:Asia/Dubai;AF:Asia/Kabul;AG:America/Antigua;AI:America/Anguilla;AL:Europe/Tirane;AM:Asia/Yerevan;AO:Africa/Luanda;AQ:Antarctica/Casey,Davis,DumontDUrville,Mawson,McMurdo,Palmer,Rothera,Syowa,Troll,Vostok;AR:America/Argentina/Buenos_Aires,Argentina/Catamarca,Argentina/ComodRivadavia,Argentina/Cordoba,Argentina/Jujuy,Argentina/La_Rioja,Argentina/Mendoza,Argentina/Rio_Gallegos,Argentina/Salta,Argentina/San_Juan,Argentina/San_Luis,Argentina/Tucuman,Argentina/Ushuaia,Buenos_Aires,Catamarca,Cordoba,Jujuy,Mendoza,Rosario;AS:Pacific/Pago_Pago,Samoa|US/Samoa;AT:Europe/Vienna;AU:Antarctica/Macquarie|Australia/ACT,Adelaide,Brisbane,Broken_Hill,Canberra,Currie,Darwin,Eucla,Hobart,LHI,Lindeman,Lord_Howe,Melbourne,NSW,North,Perth,Queensland,South,Sydney,Tasmania,Victoria,West,Yancowinna;AW:America/Aruba;AX:Europe/Mariehamn;AZ:Asia/Baku;BA:Europe/Sarajevo;BB:America/Barbados;BD:Asia/Dacca,Dhaka;BE:CET,MET|Europe/Brussels;BF:Africa/Ouagadougou;BG:Europe/Sofia;BH:Asia/Bahrain;BI:Africa/Bujumbura;BJ:Africa/Porto-Novo;BL:America/St_Barthelemy;BM:Atlantic/Bermuda;BN:Asia/Brunei;BO:America/La_Paz;BQ:America/Kralendijk;BR:America/Araguaina,Bahia,Belem,Boa_Vista,Campo_Grande,Cuiaba,Eirunepe,Fortaleza,Maceio,Manaus,Noronha,Porto_Acre,Porto_Velho,Recife,Rio_Branco,Santarem,Sao_Paulo|Brazil/Acre,DeNoronha,East,West;BS:America/Nassau;BT:Asia/Thimbu,Thimphu;BW:Africa/Gaborone;BY:Europe/Minsk;BZ:America/Belize;CA:America/Atikokan,Blanc-Sablon,Cambridge_Bay,Creston,Dawson,Dawson_Creek,Edmonton,Fort_Nelson,Glace_Bay,Goose_Bay,Halifax,Inuvik,Iqaluit,Moncton,Montreal,Nipigon,Pangnirtung,Rainy_River,Rankin_Inlet,Regina,Resolute,St_Johns,Swift_Current,Thunder_Bay,Toronto,Vancouver,Whitehorse,Winnipeg,Yellowknife|Canada/Atlantic,Central,Eastern,Mountain,Newfoundland,Pacific,Saskatchewan,Yukon;CC:Indian/Cocos;CD:Africa/Kinshasa,Lubumbashi;CF:Africa/Bangui;CG:Africa/Brazzaville;CH:Europe/Zurich;CI:Africa/Abidjan,Timbuktu|Iceland;CK:Pacific/Rarotonga;CL:America/Coyhaique,Punta_Arenas,Santiago|Chile/Continental,EasterIsland|Pacific/Easter;CM:Africa/Douala;CN:Asia/Chongqing,Chungking,Harbin,Kashgar,Shanghai,Urumqi|PRC;CO:America/Bogota;CR:America/Costa_Rica;CU:America/Havana|Cuba;CV:Atlantic/Cape_Verde;CW:America/Curacao;CX:Indian/Christmas;CY:Asia/Famagusta,Nicosia|Europe/Nicosia;CZ:Europe/Prague;DE:Atlantic/Jan_Mayen|Europe/Berlin,Busingen;DJ:Africa/Djibouti;DK:Europe/Copenhagen;DM:America/Dominica;DO:America/Santo_Domingo;DZ:Africa/Algiers;EC:America/Guayaquil|Pacific/Galapagos;EE:Europe/Tallinn;EG:Africa/Cairo|Egypt;EH:Africa/El_Aaiun;ER:Africa/Asmara;ES:Africa/Ceuta|Atlantic/Canary|Europe/Madrid;ET:Africa/Addis_Ababa;FI:Europe/Helsinki;FJ:Pacific/Fiji;FK:Atlantic/Stanley;FM:Pacific/Chuuk,Kosrae,Pohnpei;FO:Atlantic/Faeroe,Faroe;FR:Europe/Paris;GA:Africa/Libreville;GB:Europe/Belfast,London|GB,GB-Eire;GD:America/Grenada;GE:Asia/Tbilisi;GF:America/Cayenne;GG:Europe/Guernsey;GH:Africa/Accra;GI:Europe/Gibraltar;GL:America/Danmarkshavn,Godthab,Nuuk,Scoresbysund,Thule;GM:Africa/Banjul;GN:Africa/Conakry;GP:America/Guadeloupe;GQ:Africa/Malabo;GR:EET|Europe/Athens;GS:Atlantic/South_Georgia;GT:America/Guatemala;GU:Pacific/Guam;GW:Africa/Bissau;GY:America/Guyana;HK:Asia/Hong_Kong|Hongkong;HN:America/Tegucigalpa;HR:Europe/Zagreb;HT:America/Port-au-Prince;HU:Europe/Budapest;ID:Asia/Jakarta,Jayapura,Makassar,Pontianak,Ujung_Pandang;IE:Eire|Europe/Dublin;IL:Asia/Jerusalem,Tel_Aviv|Israel;IM:Europe/Isle_of_Man;IN:Asia/Calcutta,Kolkata;IO:Indian/Chagos;IQ:Asia/Baghdad;IR:Asia/Tehran|Iran;IS:Atlantic/Reykjavik;IT:Europe/Rome;JE:Europe/Jersey;JM:America/Jamaica|Jamaica;JO:Asia/Amman;JP:Asia/Tokyo|Japan;KE:Africa/Asmera,Nairobi;KG:Asia/Bishkek;KH:Asia/Phnom_Penh;KI:Pacific/Enderbury,Kanton,Kiritimati,Tarawa;KM:Indian/Comoro;KN:America/St_Kitts;KP:Asia/Pyongyang;KR:Asia/Seoul|ROK;KW:Asia/Kuwait;KY:America/Cayman;KZ:Asia/Almaty,Aqtau,Aqtobe,Atyrau,Oral,Qostanay,Qyzylorda;LA:Asia/Vientiane;LB:Asia/Beirut;LC:America/St_Lucia;LI:Europe/Vaduz;LK:Asia/Colombo;LR:Africa/Monrovia;LS:Africa/Maseru;LT:Europe/Vilnius;LU:Europe/Luxembourg;LV:Europe/Riga;LY:Africa/Tripoli|Libya;MA:Africa/Casablanca;MC:Europe/Monaco;MD:Europe/Chisinau,Tiraspol;ME:Europe/Podgorica;MF:America/Marigot;MG:Indian/Antananarivo;MH:Kwajalein|Pacific/Kwajalein,Majuro;MK:Europe/Skopje;ML:Africa/Bamako;MM:Asia/Rangoon,Yangon;MN:Asia/Choibalsan,Hovd,Ulaanbaatar,Ulan_Bator;MO:Asia/Macao,Macau;MP:Pacific/Saipan;MQ:America/Martinique;MR:Africa/Nouakchott;MS:America/Montserrat;MT:Europe/Malta;MU:Indian/Mauritius;MV:Indian/Maldives;MW:Africa/Blantyre;MX:America/Bahia_Banderas,Cancun,Chihuahua,Ciudad_Juarez,Ensenada,Hermosillo,Matamoros,Mazatlan,Merida,Mexico_City,Monterrey,Ojinaga,Santa_Isabel,Tijuana|Mexico/BajaNorte,BajaSur,General;MY:Asia/Kuala_Lumpur,Kuching;MZ:Africa/Maputo;NA:Africa/Windhoek;NC:Pacific/Noumea;NE:Africa/Niamey;NF:Pacific/Norfolk;NG:Africa/Lagos;NI:America/Managua;NL:Europe/Amsterdam;NO:Europe/Oslo;NP:Asia/Kathmandu,Katmandu;NR:Pacific/Nauru;NU:Pacific/Niue;NZ:Antarctica/South_Pole|NZ,NZ-CHAT|Pacific/Auckland,Chatham;OM:Asia/Muscat;PA:America/Coral_Harbour,Panama|EST;PE:America/Lima;PF:Pacific/Gambier,Marquesas,Tahiti;PG:Pacific/Bougainville,Port_Moresby,Truk,Yap;PH:Asia/Manila;PK:Asia/Karachi;PL:Europe/Warsaw|Poland;PM:America/Miquelon;PN:Pacific/Pitcairn;PR:America/Puerto_Rico,Virgin;PS:Asia/Gaza,Hebron;PT:Atlantic/Azores,Madeira|Europe/Lisbon|Portugal,WET;PW:Pacific/Palau;PY:America/Asuncion;QA:Asia/Qatar;RE:Indian/Reunion;RO:Europe/Bucharest;RS:Europe/Belgrade;RU:Asia/Anadyr,Barnaul,Chita,Irkutsk,Kamchatka,Khandyga,Krasnoyarsk,Magadan,Novokuznetsk,Novosibirsk,Omsk,Sakhalin,Srednekolymsk,Tomsk,Ust-Nera,Vladivostok,Yakutsk,Yekaterinburg|Europe/Astrakhan,Kaliningrad,Kirov,Moscow,Samara,Saratov,Ulyanovsk,Volgograd|W-SU;RW:Africa/Kigali;SA:Asia/Riyadh;SB:Pacific/Guadalcanal,Ponape;SC:Indian/Mahe;SD:Africa/Khartoum;SE:Europe/Stockholm;SG:Asia/Singapore|Singapore;SH:Atlantic/St_Helena;SI:Europe/Ljubljana;SJ:Arctic/Longyearbyen;SK:Europe/Bratislava;SL:Africa/Freetown;SM:Europe/San_Marino;SN:Africa/Dakar;SO:Africa/Mogadishu;SR:America/Paramaribo;SS:Africa/Juba;ST:Africa/Sao_Tome;SV:America/El_Salvador;SX:America/Lower_Princes;SY:Asia/Damascus;SZ:Africa/Mbabane;TC:America/Grand_Turk;TD:Africa/Ndjamena;TF:Indian/Kerguelen;TG:Africa/Lome;TH:Asia/Bangkok;TJ:Asia/Dushanbe;TK:Pacific/Fakaofo;TL:Asia/Dili;TM:Asia/Ashgabat,Ashkhabad;TN:Africa/Tunis;TO:Pacific/Tongatapu;TR:Asia/Istanbul|Europe/Istanbul|Turkey;TT:America/Port_of_Spain;TV:Pacific/Funafuti;TW:Asia/Taipei|ROC;TZ:Africa/Dar_es_Salaam;UA:Europe/Kiev,Kyiv,Simferopol,Uzhgorod,Zaporozhye;UG:Africa/Kampala;UM:Pacific/Midway,Wake;US:America/Adak,Anchorage,Atka,Boise,Chicago,Denver,Detroit,Fort_Wayne,Indiana/Indianapolis,Indiana/Knox,Indiana/Marengo,Indiana/Petersburg,Indiana/Tell_City,Indiana/Vevay,Indiana/Vincennes,Indiana/Winamac,Indianapolis,Juneau,Kentucky/Louisville,Kentucky/Monticello,Knox_IN,Los_Angeles,Louisville,Menominee,Metlakatla,New_York,Nome,North_Dakota/Beulah,North_Dakota/Center,North_Dakota/New_Salem,Phoenix,Shiprock,Sitka,Yakutat|HST,MST,Navajo|Pacific/Honolulu,Johnston|US/Alaska,Aleutian,Arizona,Central,East-Indiana,Eastern,Hawaii,Indiana-Starke,Michigan,Mountain,Pacific;UY:America/Montevideo;UZ:Asia/Samarkand,Tashkent;VA:Europe/Vatican;VC:America/St_Vincent;VE:America/Caracas;VG:America/Tortola;VI:America/St_Thomas;VN:Asia/Ho_Chi_Minh,Saigon;VU:Pacific/Efate;WF:Pacific/Wallis;WS:Pacific/Apia;YE:Asia/Aden;YT:Indian/Mayotte;ZA:Africa/Johannesburg;ZM:Africa/Lusaka;ZW:Africa/Harare'; // no i18n
10
+
11
+ export { TZ_COUNTRIES };
@@ -1,10 +1,11 @@
1
1
  /**
2
- * Where a log line was raised, for logSDK's `filename` and `linenumber`.
2
+ * Where in the app an AppticsLogger line was written, for logSDK's `filename`, `linenumber` and
3
+ * `function`: the Remote Logger page shows each line with them.
3
4
  *
4
5
  * There is no caller introspection in a browser, so the only way to answer "which line was this"
5
- * is to throw an Error nobody catches and read its stack. That is cheap enough for a channel that
6
- * only carries the SDK's own failures, but it is never on the app's path: everything here is
7
- * wrapped so a stack we cannot parse costs a line its call site and nothing more.
6
+ * is to make an Error and read its stack, skipping the SDK's own frames. That costs a little on
7
+ * every line the app logs, and nothing on any other call. Everything here is wrapped so a stack
8
+ * that cannot be parsed costs a line its call site and nothing more: the line is still logged.
8
9
  */
9
10
  export interface CallSite {
10
11
  /** The script's basename, not its url: logSDK caps filename at 100 characters. */
@@ -15,6 +16,12 @@ export interface CallSite {
15
16
  fn?: string;
16
17
  }
17
18
  export declare const NO_CALL_SITE: CallSite;
19
+ /**
20
+ * A call typed in the browser's developer console: there is no file, line or function to report,
21
+ * only the console's own placeholder for its input, so the line says plainly that it came from
22
+ * nowhere in the app. file_name and the function field both accept `-`.
23
+ */
24
+ export declare const CONSOLE_CALL_SITE: CallSite;
18
25
  /**
19
26
  * The frame `skip` frames down a stack, counting only the ones that name a file — V8 heads its
20
27
  * stacks with an `Error` line and Firefox does not, so counting raw lines would read a different
@@ -1,13 +1,30 @@
1
- /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta | (c) Zoho Corporation Private Limited | see LICENSE */
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.2 | (c) Zoho Corporation Private Limited | see LICENSE */
2
2
  /**
3
- * Where a log line was raised, for logSDK's `filename` and `linenumber`.
3
+ * Where in the app an AppticsLogger line was written, for logSDK's `filename`, `linenumber` and
4
+ * `function`: the Remote Logger page shows each line with them.
4
5
  *
5
6
  * There is no caller introspection in a browser, so the only way to answer "which line was this"
6
- * is to throw an Error nobody catches and read its stack. That is cheap enough for a channel that
7
- * only carries the SDK's own failures, but it is never on the app's path: everything here is
8
- * wrapped so a stack we cannot parse costs a line its call site and nothing more.
7
+ * is to make an Error and read its stack, skipping the SDK's own frames. That costs a little on
8
+ * every line the app logs, and nothing on any other call. Everything here is wrapped so a stack
9
+ * that cannot be parsed costs a line its call site and nothing more: the line is still logged.
9
10
  */
10
11
  const NO_CALL_SITE = { filename: '', linenumber: 0, fn: '' };
12
+ /**
13
+ * A call typed in the browser's developer console: there is no file, line or function to report,
14
+ * only the console's own placeholder for its input, so the line says plainly that it came from
15
+ * nowhere in the app. file_name and the function field both accept `-`.
16
+ */
17
+ const CONSOLE_CALL_SITE = { filename: '-', linenumber: 0, fn: '-' };
18
+ /**
19
+ * The frame of code run from the developer console, in each browser:
20
+ * V8 (Chrome, Edge): ` at <anonymous>:1:15` (the file is <anonymous>)
21
+ * Firefox: `@debugger eval code:1:15`
22
+ * Safari: `global code` or `eval code`, with no location at all
23
+ * V8 names a string run through eval or new Function <anonymous> too; it is no file either.
24
+ */
25
+ const CONSOLE_FILE_V8 = '<anonymous>'; // no i18n
26
+ const CONSOLE_FIREFOX = /debugger eval code/; // no i18n
27
+ const CONSOLE_SAFARI = /^(global|eval) code(@|$)/; // no i18n
11
28
  /** logSDK declares max-len="100" on filename. */
12
29
  const FILENAME_MAX = 100;
13
30
  /**
@@ -61,14 +78,19 @@ function callSiteFromStack(stack, skip) {
61
78
  var lines = stack.split('\n');
62
79
  var seen = 0;
63
80
  for (var i = 0; i < lines.length; i++) {
64
- var frame = parseFrame(lines[i] || '');
81
+ var raw = (lines[i] || '').trim(); // no i18n
82
+ var frame = parseFrame(raw);
65
83
  if (frame === null) {
84
+ // Safari's console frame has no location, so it is never a frame parseFrame reads
85
+ if (seen === skip && CONSOLE_SAFARI.test(raw)) {
86
+ return CONSOLE_CALL_SITE;
87
+ }
66
88
  continue;
67
89
  }
68
90
  if (seen++ < skip) {
69
91
  continue;
70
92
  }
71
- return frame;
93
+ return frame.filename === CONSOLE_FILE_V8 || CONSOLE_FIREFOX.test(raw) ? CONSOLE_CALL_SITE : frame;
72
94
  }
73
95
  return NO_CALL_SITE;
74
96
  }
@@ -86,4 +108,4 @@ function callSite(skip) {
86
108
  }
87
109
  }
88
110
 
89
- export { NO_CALL_SITE, callSite, callSiteFromStack };
111
+ export { CONSOLE_CALL_SITE, NO_CALL_SITE, callSite, callSiteFromStack };
@@ -1,11 +1,2 @@
1
- export declare function setAppLogger(on: boolean): void;
2
- export declare function appLoggerEnabled(): boolean;
3
- /** The SDK's own diagnostics may be recorded: `remote_log` is on and the logger is reachable. */
4
- export declare function remoteLogEnabled(): boolean;
5
- /** An app's own log line may be recorded: the app enabled the logger and it is reachable. */
6
- export declare function appLogEnabled(): boolean;
7
- /**
8
- * What is stored may be sent. Either writer is enough: app logging works with `remote_log`
9
- * off, since that switch covers only the SDK's own diagnostics.
10
- */
11
- export declare function remoteLogSendable(): boolean;
1
+ /** Whether a remote log line may be recorded and sent now. */
2
+ export declare function remoteLoggerReachable(): boolean;
@@ -1,24 +1,17 @@
1
- /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta | (c) Zoho Corporation Private Limited | see LICENSE */
2
- import { getConfig, _ZAP } from '../core/state.js';
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.2 | (c) Zoho Corporation Private Limited | see LICENSE */
2
+ import { _ZAP } from '../core/state.js';
3
3
  import { is_apptics_disabled } from '../core/env.js';
4
4
  import { shouldTrackOrSendData } from '../core/consent.js';
5
5
 
6
6
  /**
7
- * The one switch both halves of the remote logger ask: may this line be recorded, and may
8
- * what is stored be sent? It lives on its own so recording and sending don't import each other.
9
- */
10
- /** The app logger's switch: off until the app calls logger.enable(), as on Android and iOS. */
11
- let appLoggerOn = false;
12
- function setAppLogger(on) {
13
- appLoggerOn = on;
14
- }
15
- function appLoggerEnabled() {
16
- return appLoggerOn;
17
- }
18
- /**
19
- * What every remote-log line needs, whoever wrote it: a running SDK, a client we send anything
20
- * for, the server's remote logger switch, and consent.
7
+ * The one switch both halves of the remote logger ask: may this line be recorded, and may what is
8
+ * stored be sent? It lives on its own so recording and sending don't import each other.
9
+ *
10
+ * There is no switch of the app's own: a line the app writes with AppticsLogger is recorded,
11
+ * whenever the SDK is running, the server has the remote logger on for the app, and the visitor
12
+ * allows tracking.
21
13
  */
14
+ /** Whether a remote log line may be recorded and sent now. */
22
15
  function remoteLoggerReachable() {
23
16
  if (!_ZAP._token || is_apptics_disabled()) {
24
17
  return false;
@@ -29,20 +22,5 @@ function remoteLoggerReachable() {
29
22
  }
30
23
  return shouldTrackOrSendData();
31
24
  }
32
- /** The SDK's own diagnostics may be recorded: `remote_log` is on and the logger is reachable. */
33
- function remoteLogEnabled() {
34
- return getConfig('remote_log') && remoteLoggerReachable(); // no i18n
35
- }
36
- /** An app's own log line may be recorded: the app enabled the logger and it is reachable. */
37
- function appLogEnabled() {
38
- return appLoggerOn && remoteLoggerReachable();
39
- }
40
- /**
41
- * What is stored may be sent. Either writer is enough: app logging works with `remote_log`
42
- * off, since that switch covers only the SDK's own diagnostics.
43
- */
44
- function remoteLogSendable() {
45
- return (getConfig('remote_log') || appLoggerOn) && remoteLoggerReachable(); // no i18n
46
- }
47
25
 
48
- export { appLogEnabled, appLoggerEnabled, remoteLogEnabled, remoteLogSendable, setAppLogger };
26
+ export { remoteLoggerReachable };
@@ -1,25 +1,8 @@
1
1
  /**
2
- * Remote logger: the SDK's own diagnostics, sent to console/addlog.
2
+ * Remote logger delivery: the AppticsLogger lines (logger.ts) are stored in the remotelogs queue
3
+ * and sent from it to log/add by send.ts. gate.ts holds the switch both ask.
3
4
  *
4
- * This file is not the app-facing logging API — that is logger.ts, which shares this queue and
5
- * delivery but has its own switch. This file answers "this app reports no data — what is the SDK
6
- * actually doing on the user's machine?", so what it carries is the SDK's own failures, each
7
- * tagged with the module that was mid-flight (Session, Screen, Event, API, Properties).
8
- * App errors belong to exception/error, an app's remote log lines to logger.ts, and lines meant
9
- * for a feedback report to feedback/logs.ts.
10
- *
11
- * This file records lines, send.ts delivers them, and gate.ts holds the switch both ask.
12
- * Nothing here is exported to apps: the SDK writes these lines itself, through logFailure()
13
- * in core/logger.ts.
14
- */
15
- import { AP_LOG_MODULE } from '../core/constants.js';
16
- import { type CallSite } from '../core/callsite.js';
17
- /** One of console/addlog's `module` values. */
18
- export type LogModule = (typeof AP_LOG_MODULE)[keyof typeof AP_LOG_MODULE];
19
- /**
20
- * Records one line about `module` for console/addlog. Never throws and never blocks the caller:
21
- * a diagnostics channel that breaks the flow it reports on would be worse than no channel.
5
+ * The SDK writes nothing of its own here: its failures go to the browser console (core/logger.ts,
6
+ * in debug mode), and only the lines an app logs reach the Remote Logger page.
22
7
  */
23
- export declare function remoteLog(module: LogModule, message: unknown, site?: CallSite): void;
24
- export { remoteLogEnabled } from './gate.js';
25
8
  export { forgetStoredLogs, sendStoredLogs } from './send.js';
@@ -7,22 +7,16 @@ export declare const LOG_LEVEL: Readonly<{
7
7
  ERROR: 5;
8
8
  }>;
9
9
  export interface AppticsLogger {
10
- /** Starts recording log lines. Off until called. */
11
- enable(): void;
12
- /** Stops recording log lines. */
13
- disable(): void;
14
- /** Whether log lines are being recorded. */
15
- isEnabled(): boolean;
16
- /** Verbose, level 1. The tag leads the message as `[tag]`. */
17
- v(tag: string, message: unknown, ...details: unknown[]): void;
18
- /** Debug, level 2. */
19
- d(tag: string, message: unknown, ...details: unknown[]): void;
20
- /** Info, level 3. */
21
- i(tag: string, message: unknown, ...details: unknown[]): void;
22
- /** Warning, level 4. */
23
- w(tag: string, message: unknown, ...details: unknown[]): void;
24
- /** Error, level 5. */
25
- e(tag: string, message: unknown, ...details: unknown[]): void;
10
+ /** Verbose, level 1 (Android's v). `properties` (an object, as JSON; an Error, as its stack) is appended to the message. */
11
+ verbose(message: unknown, properties?: unknown): void;
12
+ /** Debug, level 2 (Android's d). */
13
+ debug(message: unknown, properties?: unknown): void;
14
+ /** Info, level 3 (Android's i). */
15
+ info(message: unknown, properties?: unknown): void;
16
+ /** Warning, level 4 (Android's w). */
17
+ warn(message: unknown, properties?: unknown): void;
18
+ /** Error, level 5 (Android's e). */
19
+ error(message: unknown, properties?: unknown): void;
26
20
  }
27
- /** Android's AppticsLogger: enable, disable, isEnabled and v / d / i / w / e(tag, message). */
21
+ /** AppticsLogger: verbose / debug / info / warn / error(message, properties?). */
28
22
  export declare const AppticsLogger: AppticsLogger;
@@ -1,28 +1,24 @@
1
- /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta | (c) Zoho Corporation Private Limited | see LICENSE */
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.2 | (c) Zoho Corporation Private Limited | see LICENSE */
2
2
  import { LOG_FUNCTION_MAX } from '../core/constants.js';
3
- import { callSite } from '../core/callsite.js';
4
- import { consolelog_transactions } from '../core/storage.js';
3
+ import { callSite } from './callsite.js';
4
+ import { remotelog_transactions } from '../core/storage.js';
5
5
  import { guard } from '../core/guard.js';
6
6
  import { nowMs } from '../core/utils.js';
7
- import { getConfig } from '../core/state.js';
8
- import { appLoggerEnabled, setAppLogger, appLogEnabled } from './gate.js';
7
+ import { remoteLoggerReachable } from './gate.js';
9
8
  import { scheduleSend } from './send.js';
10
9
 
11
10
  /**
12
- * AppticsLogger, as on Android: lines the app writes, shown on the console's Remote Logger page.
11
+ * AppticsLogger: lines the app writes, shown on the console's Remote Logger page.
13
12
  *
14
- * AppticsLogger.enable();
15
- * AppticsLogger.i('Checkout', 'Payment started');
16
- * AppticsLogger.e('Checkout', 'Payment failed', err);
13
+ * AppticsLogger.info('Payment started');
14
+ * AppticsLogger.error('Payment failed', err);
17
15
  *
18
- * It mirrors the native SDKs so the page reads the same whatever sent the line: off until
19
- * enable() (AppticsLogger.enable() on Android, APLog.setShouldLog on iOS), and five levels in
20
- * the iOS order — verbose, debug, info, warn, error — sent as 1 to 5, which is the scale the
21
- * Remote Logger page reads back.
16
+ * Nothing is logged on its own: only the lines the app writes, at five levels in the native SDKs'
17
+ * order (verbose, debug, info, warn, error, sent as 1 to 5, the scale the Remote Logger page reads
18
+ * back). A line is recorded as it is written, with no switch to turn on first, whenever the server
19
+ * has the remote logger on for the app and the visitor allows tracking.
22
20
  *
23
- * Lines share the SDK diagnostics' queue and its log/add delivery, so they are stored before
24
- * they are sent and survive a failed send and a reload. They are a separate switch, though:
25
- * `remote_log: false` silences the SDK's own failures, not the app's logging.
21
+ * Lines are stored before they are sent (send.ts), so they survive a failed send and a reload.
26
22
  */
27
23
  /** The level numbers log/add takes and the Remote Logger page names, in the native SDKs' order. */
28
24
  const LOG_LEVEL = Object.freeze({ VERBOSE: 1, DEBUG: 2, INFO: 3, WARN: 4, ERROR: 5 });
@@ -61,11 +57,12 @@ function describe(value) {
61
57
  * it — which is why the time and call site are taken by the caller, not here.
62
58
  */
63
59
  function record(level, message, details, at, site) {
64
- if (!appLogEnabled()) {
60
+ if (!remoteLoggerReachable()) {
65
61
  return;
66
62
  }
67
63
  var text = [message].concat(details).map(describe).join(' '); // no i18n
68
- consolelog_transactions.add({
64
+ remotelog_transactions.add({
65
+ type: 'remotelog', // no i18n
69
66
  module: functionName(site),
70
67
  level: level,
71
68
  happenedat: at,
@@ -77,60 +74,35 @@ function record(level, message, details, at, site) {
77
74
  scheduleSend();
78
75
  }
79
76
  const recordLine = guard('AppticsLogger', record); // no i18n
80
- /** The browser console method each level prints with under `show_logs`, as Logcat shows them. */
81
- const CONSOLE_METHOD = Object.freeze({
82
- 1: 'debug', 2: 'debug', 3: 'info', 4: 'warn', 5: 'error', // no i18n
83
- });
84
77
  /**
85
- * `show_logs`: the line in the browser console too, as Android's showLogs prints to Logcat. For
86
- * the developer, so it prints whether or not the remote logger is enabled or allowed to record,
87
- * and the arguments go over untouched so the console can still expand an object or an Error.
78
+ * A level's method, `verbose/debug/info/warn/error(message, properties?)` (Android's v/d/i/w/e,
79
+ * without the tag, which the Remote Logger page does not use). The function, file and line are
80
+ * the caller's.
88
81
  */
89
- function show(level, args) {
90
- if (getConfig('show_logs') !== true) {
91
- return;
92
- }
93
- var method = CONSOLE_METHOD[level] || 'log'; // no i18n
94
- if (typeof console !== 'undefined' && typeof console[method] === 'function') { // no i18n
95
- console[method].apply(console, args);
96
- }
97
- }
98
- /**
99
- * A level's Android-style method, `v/d/i/w/e(tag, message, ...details)`. The tag leads the
100
- * message as `[tag]`; the function, file and line are still the caller's, as with the long names.
101
- */
102
- function tagged(level) {
103
- return function (tag, message, ...details) {
82
+ function atLevel(level) {
83
+ return function log(message, properties) {
104
84
  try {
105
- var label = tag === undefined || tag === null ? '' : String(tag).trim(); // no i18n
106
- var parts = label === '' ? [message].concat(details) : ['[' + label + ']', message].concat(details); // no i18n
107
- show(level, parts);
85
+ void properties;
86
+ // everything after the message is appended to it: properties, and anything else a caller
87
+ // passed (an Error as well, say), as before
88
+ var details = Array.prototype.slice.call(arguments, 1);
108
89
  // skip 1: this function's own frame, so the site is the app's line that logged
109
- recordLine(level, parts[0], parts.slice(1), nowMs(), callSite(1));
90
+ recordLine(level, message, details, nowMs(), callSite(1));
110
91
  }
111
92
  catch (err) {
112
93
  // logging must never be the thing that breaks the app
113
94
  }
114
95
  };
115
96
  }
116
- /** Turns the app logger on, or off with `false`. Off by default. */
117
- function enable(on) {
118
- setAppLogger(on !== false);
119
- }
120
- /** Turns the app logger off, as AppticsLogger.disable() does; the same as enable(false). */
121
- function disable() {
122
- setAppLogger(false);
123
- }
124
- /** Android's AppticsLogger: enable, disable, isEnabled and v / d / i / w / e(tag, message). */
97
+ /** AppticsLogger: verbose / debug / info / warn / error(message, properties?). */
125
98
  const AppticsLogger = {
126
- enable: guard('AppticsLogger.enable', function () { enable(true); }), // no i18n
127
- disable: guard('AppticsLogger.disable', disable), // no i18n
128
- isEnabled: guard('AppticsLogger.isEnabled', appLoggerEnabled), // no i18n
129
- v: tagged(LOG_LEVEL.VERBOSE),
130
- d: tagged(LOG_LEVEL.DEBUG),
131
- i: tagged(LOG_LEVEL.INFO),
132
- w: tagged(LOG_LEVEL.WARN),
133
- e: tagged(LOG_LEVEL.ERROR),
99
+ // not wrapped in a guard of their own: the call site is read a fixed number of frames up, and
100
+ // a frame more would report the SDK's own line instead of the app's
101
+ verbose: atLevel(LOG_LEVEL.VERBOSE),
102
+ debug: atLevel(LOG_LEVEL.DEBUG),
103
+ info: atLevel(LOG_LEVEL.INFO),
104
+ warn: atLevel(LOG_LEVEL.WARN),
105
+ error: atLevel(LOG_LEVEL.ERROR),
134
106
  };
135
107
 
136
108
  export { AppticsLogger, LOG_LEVEL };