@wireai/activation 0.12.0 → 0.12.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 (53) hide show
  1. package/AGENTS.md +13 -10
  2. package/CHANGELOG.md +130 -0
  3. package/INTEGRATION_PROMPT.md +14 -3
  4. package/README.md +40 -2
  5. package/dist/analytics/index.d.mts +5 -4
  6. package/dist/analytics/index.d.ts +5 -4
  7. package/dist/analytics/index.js +39 -24
  8. package/dist/analytics/index.js.map +1 -1
  9. package/dist/analytics/index.mjs +39 -24
  10. package/dist/analytics/index.mjs.map +1 -1
  11. package/dist/coachmarks/index.d.mts +16 -0
  12. package/dist/coachmarks/index.d.ts +16 -0
  13. package/dist/coachmarks/index.js +19 -13
  14. package/dist/coachmarks/index.js.map +1 -1
  15. package/dist/coachmarks/index.mjs +19 -13
  16. package/dist/coachmarks/index.mjs.map +1 -1
  17. package/dist/{currentSession-DsSDHqor.d.mts → currentSession-BlCeDP0f.d.mts} +59 -5
  18. package/dist/{currentSession-D6RiVtc8.d.ts → currentSession-BxEB37xt.d.ts} +59 -5
  19. package/dist/index.d.mts +10 -20
  20. package/dist/index.d.ts +10 -20
  21. package/dist/index.js +301 -187
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +300 -188
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/questionnaire/index.js +41 -19
  26. package/dist/questionnaire/index.js.map +1 -1
  27. package/dist/questionnaire/index.mjs +41 -19
  28. package/dist/questionnaire/index.mjs.map +1 -1
  29. package/dist/reviews/index.js +41 -19
  30. package/dist/reviews/index.js.map +1 -1
  31. package/dist/reviews/index.mjs +41 -19
  32. package/dist/reviews/index.mjs.map +1 -1
  33. package/dist/showcase/index.js +15 -6
  34. package/dist/showcase/index.js.map +1 -1
  35. package/dist/showcase/index.mjs +15 -6
  36. package/dist/showcase/index.mjs.map +1 -1
  37. package/llms.txt +2 -0
  38. package/package.json +1 -1
  39. package/src/WireOnboarding.tsx +140 -5
  40. package/src/activation/wireActivation.ts +8 -1
  41. package/src/analytics/analyticsFacade.ts +15 -11
  42. package/src/analytics/reportClientEvent.ts +11 -7
  43. package/src/coachmarks/runtime.ts +53 -17
  44. package/src/config/wireConfigFromEnv.ts +46 -2
  45. package/src/context/deviceId.ts +82 -18
  46. package/src/index.ts +9 -1
  47. package/src/questionnaire/runtime.ts +1 -0
  48. package/src/questionnaire/useQuestionnaireGate.ts +8 -3
  49. package/src/reviews/runtime.ts +68 -7
  50. package/src/reviews/useReviewGate.ts +8 -3
  51. package/src/session-analytics/useLifecycleEvents.ts +57 -27
  52. package/src/session-analytics/useSessionStart.ts +37 -1
  53. package/src/types.ts +41 -4
@@ -412,17 +412,17 @@ var buildEventsRequest = (target, events) => {
412
412
  }
413
413
  };
414
414
  var warnOnSkippedEvents = (res) => {
415
+ if (typeof __DEV__ === "undefined" || !__DEV__) return;
416
+ if (typeof console === "undefined" || !console.warn) return;
415
417
  try {
416
418
  const json = res == null ? void 0 : res.json;
417
419
  if (typeof json !== "function") return;
418
420
  void Promise.resolve(json.call(res)).then((body) => {
419
421
  const skipped = body == null ? void 0 : body.skipped;
420
422
  if (typeof skipped !== "number" || skipped <= 0) return;
421
- if (typeof __DEV__ !== "undefined" && __DEV__ && typeof console !== "undefined" && console.warn) {
422
- console.warn(
423
- `[wireai] the server ACCEPTED the /v1/events POST but DISCARDED ${skipped} event(s) (skipped in the response body) \u2014 they are gone, not retried. The usual cause is an event with a missing or empty session_id.`
424
- );
425
- }
423
+ console.warn(
424
+ `[wireai] the server ACCEPTED the /v1/events POST but DISCARDED ${skipped} event(s) (skipped in the response body) \u2014 they are gone, not retried. The usual cause is an event with a missing or empty session_id.`
425
+ );
426
426
  }).catch(() => {
427
427
  });
428
428
  } catch {
@@ -1117,6 +1117,31 @@ var autoDeviceKeyRegistry = () => {
1117
1117
  deviceKeyGlobal[AUTO_DEVICE_KEY_SLOT] = created;
1118
1118
  return created;
1119
1119
  };
1120
+ var startHydration = (registry, appId, storage, minted) => {
1121
+ if (!registry.pending) registry.pending = /* @__PURE__ */ new Map();
1122
+ const existing = registry.pending.get(appId);
1123
+ if (existing) return existing;
1124
+ const slot = deviceIdStorageKey(appId);
1125
+ const settled = () => {
1126
+ var _a2;
1127
+ return (_a2 = registry.keys.get(appId)) != null ? _a2 : minted;
1128
+ };
1129
+ let run;
1130
+ try {
1131
+ run = Promise.resolve(storage.getItem(slot)).then((saved) => {
1132
+ const persisted = typeof saved === "string" && saved.trim() ? saved.trim() : void 0;
1133
+ if (persisted) {
1134
+ registry.keys.set(appId, persisted);
1135
+ return persisted;
1136
+ }
1137
+ return Promise.resolve(storage.setItem(slot, minted)).then(settled, settled);
1138
+ }).catch(settled);
1139
+ } catch {
1140
+ run = Promise.resolve(settled());
1141
+ }
1142
+ registry.pending.set(appId, run);
1143
+ return run;
1144
+ };
1120
1145
  var resolveAutoDeviceKey = (opts = {}) => {
1121
1146
  var _a2, _b;
1122
1147
  const registry = autoDeviceKeyRegistry();
@@ -1129,25 +1154,16 @@ var resolveAutoDeviceKey = (opts = {}) => {
1129
1154
  const storage = opts.storage;
1130
1155
  if (storage && !registry.hydrating.has(appId)) {
1131
1156
  registry.hydrating.add(appId);
1132
- const slot = deviceIdStorageKey(appId);
1133
- const minted = id;
1134
- try {
1135
- void Promise.resolve(storage.getItem(slot)).then((saved) => {
1136
- const persisted = typeof saved === "string" && saved.trim() ? saved.trim() : void 0;
1137
- if (persisted) registry.keys.set(appId, persisted);
1138
- else void Promise.resolve(storage.setItem(slot, minted)).catch(() => {
1139
- });
1140
- }).catch(() => {
1141
- });
1142
- } catch {
1143
- }
1157
+ void startHydration(registry, appId, storage, id);
1144
1158
  }
1145
1159
  return (_b = registry.keys.get(appId)) != null ? _b : id;
1146
1160
  };
1147
1161
  var resetAutoDeviceKeys = () => {
1162
+ var _a2;
1148
1163
  const registry = autoDeviceKeyRegistry();
1149
1164
  registry.keys.clear();
1150
1165
  registry.hydrating.clear();
1166
+ (_a2 = registry.pending) == null ? void 0 : _a2.clear();
1151
1167
  };
1152
1168
 
1153
1169
  // src/analytics/analyticsFacade.ts
@@ -1157,11 +1173,10 @@ var warnInDev2 = (message) => {
1157
1173
  }
1158
1174
  };
1159
1175
  var createAnalytics = (config, options = {}) => {
1160
- var _a2, _b, _c, _d;
1161
- const instanceSessionId = (_a2 = config.sessionId) != null ? _a2 : makeSessionId();
1176
+ var _a2, _b, _c;
1162
1177
  const resolveSessionId = () => {
1163
- var _a3, _b2;
1164
- return (_b2 = (_a3 = config.sessionId) != null ? _a3 : getCurrentSessionId()) != null ? _b2 : instanceSessionId;
1178
+ var _a3;
1179
+ return (_a3 = config.sessionId) != null ? _a3 : ensureCurrentSessionId();
1165
1180
  };
1166
1181
  if (config.sessionId) {
1167
1182
  warnInDev2(
@@ -1169,8 +1184,8 @@ var createAnalytics = (config, options = {}) => {
1169
1184
  );
1170
1185
  }
1171
1186
  const detectedAppVersion = detectAppVersion();
1172
- let userContext = { ...(_b = config.userContext) != null ? _b : {} };
1173
- const hostDeviceKeyAtInit = typeof ((_c = config.userContext) == null ? void 0 : _c.deviceKey) === "string" && config.userContext.deviceKey.trim() ? config.userContext.deviceKey.trim() : void 0;
1187
+ let userContext = { ...(_a2 = config.userContext) != null ? _a2 : {} };
1188
+ const hostDeviceKeyAtInit = typeof ((_b = config.userContext) == null ? void 0 : _b.deviceKey) === "string" && config.userContext.deviceKey.trim() ? config.userContext.deviceKey.trim() : void 0;
1174
1189
  const autoDeviceKeyOptions = {
1175
1190
  appId: config.appId,
1176
1191
  // A host-supplied deviceKey opts out of minting AND persisting (unchanged contract).
@@ -1193,7 +1208,7 @@ var createAnalytics = (config, options = {}) => {
1193
1208
  envelope,
1194
1209
  ...options
1195
1210
  });
1196
- let boundUserId = sanitizeUserId((_d = config.userContext) == null ? void 0 : _d.userId);
1211
+ let boundUserId = sanitizeUserId((_c = config.userContext) == null ? void 0 : _c.userId);
1197
1212
  const storageKey = analyticsUserIdStorageKey(config.appId);
1198
1213
  if (config.storage) {
1199
1214
  void config.storage.getItem(storageKey).then((saved) => {