@cxpinsight/react-native 0.3.0 → 0.5.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 (62) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +70 -0
  3. package/lib/CXPinsight.d.ts +33 -0
  4. package/lib/CXPinsight.d.ts.map +1 -1
  5. package/lib/CXPinsight.js +115 -3
  6. package/lib/CXPinsight.js.map +1 -1
  7. package/lib/CXPinsightProvider.d.ts.map +1 -1
  8. package/lib/CXPinsightProvider.js +40 -10
  9. package/lib/CXPinsightProvider.js.map +1 -1
  10. package/lib/core/attribution.d.ts +54 -0
  11. package/lib/core/attribution.d.ts.map +1 -0
  12. package/lib/core/attribution.js +112 -0
  13. package/lib/core/attribution.js.map +1 -0
  14. package/lib/core/autoTapCapture.d.ts +15 -0
  15. package/lib/core/autoTapCapture.d.ts.map +1 -0
  16. package/lib/core/autoTapCapture.js +242 -0
  17. package/lib/core/autoTapCapture.js.map +1 -0
  18. package/lib/core/experiments.d.ts +59 -0
  19. package/lib/core/experiments.d.ts.map +1 -0
  20. package/lib/core/experiments.js +201 -0
  21. package/lib/core/experiments.js.map +1 -0
  22. package/lib/core/networkCapture.d.ts +7 -1
  23. package/lib/core/networkCapture.d.ts.map +1 -1
  24. package/lib/core/networkCapture.js +13 -1
  25. package/lib/core/networkCapture.js.map +1 -1
  26. package/lib/core/triggerEngine.d.ts +5 -3
  27. package/lib/core/triggerEngine.d.ts.map +1 -1
  28. package/lib/core/triggerEngine.js +19 -5
  29. package/lib/core/triggerEngine.js.map +1 -1
  30. package/lib/instrumented/Pressable.js +4 -0
  31. package/lib/instrumented/Pressable.js.map +1 -1
  32. package/lib/instrumented/ScrollView.js +4 -0
  33. package/lib/instrumented/ScrollView.js.map +1 -1
  34. package/lib/instrumented/TextInput.js +4 -0
  35. package/lib/instrumented/TextInput.js.map +1 -1
  36. package/lib/instrumented/TouchableOpacity.js +4 -0
  37. package/lib/instrumented/TouchableOpacity.js.map +1 -1
  38. package/lib/setup/index.d.ts +0 -1
  39. package/lib/setup/index.d.ts.map +1 -1
  40. package/lib/setup/index.js +4 -6
  41. package/lib/setup/index.js.map +1 -1
  42. package/lib/survey/definitionCache.d.ts +15 -0
  43. package/lib/survey/definitionCache.d.ts.map +1 -0
  44. package/lib/survey/definitionCache.js +80 -0
  45. package/lib/survey/definitionCache.js.map +1 -0
  46. package/lib/survey/expressionEval.d.ts +13 -9
  47. package/lib/survey/expressionEval.d.ts.map +1 -1
  48. package/lib/survey/expressionEval.js +16 -289
  49. package/lib/survey/expressionEval.js.map +1 -1
  50. package/lib/survey/interpolate.d.ts.map +1 -1
  51. package/lib/survey/interpolate.js +9 -27
  52. package/lib/survey/interpolate.js.map +1 -1
  53. package/lib/survey/validate.js +10 -0
  54. package/lib/survey/validate.js.map +1 -1
  55. package/lib/types.d.ts +2 -1
  56. package/lib/types.d.ts.map +1 -1
  57. package/lib/types.js.map +1 -1
  58. package/package.json +5 -2
  59. package/lib/setup/TouchPatcher.d.ts +0 -28
  60. package/lib/setup/TouchPatcher.d.ts.map +0 -1
  61. package/lib/setup/TouchPatcher.js +0 -188
  62. package/lib/setup/TouchPatcher.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.inferElementType = exports.matchesIdentifier = exports.identifierQuality = exports.extractLabel = exports.buildIdentifier = exports.setScannerDebugMode = exports.buildElementsFromTestIDs = exports.uploadScreenSnapshot = exports.scanReactTree = exports.scanNativeViewHierarchy = exports.clearSetupState = exports.restoreSetupState = exports.getDeviceId = exports.onSetupStateChange = exports.isSetupActive = exports.getSetupState = exports.endSetup = exports.claimSetup = exports.clearRegistry = exports.onRegistryChange = exports.getRegisteredElements = exports.registerElement = exports.useCXPElement = exports.unpatchCreateElement = exports.patchCreateElement = exports.stopObserving = exports.startObserving = exports.TouchObserver = exports.TapInterceptor = exports.SetupCodeEntry = exports.SetupOverlay = void 0;
3
+ exports.inferElementType = exports.matchesIdentifier = exports.identifierQuality = exports.extractLabel = exports.buildIdentifier = exports.setScannerDebugMode = exports.buildElementsFromTestIDs = exports.uploadScreenSnapshot = exports.scanReactTree = exports.scanNativeViewHierarchy = exports.clearSetupState = exports.restoreSetupState = exports.getDeviceId = exports.onSetupStateChange = exports.isSetupActive = exports.getSetupState = exports.endSetup = exports.claimSetup = exports.clearRegistry = exports.onRegistryChange = exports.getRegisteredElements = exports.registerElement = exports.useCXPElement = exports.TouchObserver = exports.TapInterceptor = exports.SetupCodeEntry = exports.SetupOverlay = void 0;
4
4
  var SetupOverlay_1 = require("./SetupOverlay");
5
5
  Object.defineProperty(exports, "SetupOverlay", { enumerable: true, get: function () { return SetupOverlay_1.SetupOverlay; } });
6
6
  var SetupCodeEntry_1 = require("./SetupCodeEntry");
@@ -9,11 +9,9 @@ var TapInterceptor_1 = require("./TapInterceptor");
9
9
  Object.defineProperty(exports, "TapInterceptor", { enumerable: true, get: function () { return TapInterceptor_1.TapInterceptor; } });
10
10
  var TouchObserver_1 = require("./TouchObserver");
11
11
  Object.defineProperty(exports, "TouchObserver", { enumerable: true, get: function () { return TouchObserver_1.TouchObserver; } });
12
- var TouchPatcher_1 = require("./TouchPatcher");
13
- Object.defineProperty(exports, "startObserving", { enumerable: true, get: function () { return TouchPatcher_1.startObserving; } });
14
- Object.defineProperty(exports, "stopObserving", { enumerable: true, get: function () { return TouchPatcher_1.stopObserving; } });
15
- Object.defineProperty(exports, "patchCreateElement", { enumerable: true, get: function () { return TouchPatcher_1.patchCreateElement; } });
16
- Object.defineProperty(exports, "unpatchCreateElement", { enumerable: true, get: function () { return TouchPatcher_1.unpatchCreateElement; } });
12
+ // TouchPatcher removed: it was never called, and it patched React.createElement,
13
+ // which the automatic JSX runtime bypasses. core/autoTapCapture.ts does this job
14
+ // against the runtime React Native actually uses.
17
15
  var useCXPElement_1 = require("./useCXPElement");
18
16
  Object.defineProperty(exports, "useCXPElement", { enumerable: true, get: function () { return useCXPElement_1.useCXPElement; } });
19
17
  var ElementRegistry_1 = require("./ElementRegistry");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,+CAAyG;AAAhG,8GAAA,cAAc,OAAA;AAAE,6GAAA,aAAa,OAAA;AAAE,kHAAA,kBAAkB,OAAA;AAAE,oHAAA,oBAAoB,OAAA;AAChF,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,qDAA4G;AAAnG,kHAAA,eAAe,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAAE,gHAAA,aAAa,OAAA;AAChF,qDAS2B;AARzB,6GAAA,UAAU,OAAA;AACV,2GAAA,QAAQ,OAAA;AACR,gHAAA,aAAa,OAAA;AACb,gHAAA,aAAa,OAAA;AACb,qHAAA,kBAAkB,OAAA;AAClB,8GAAA,WAAW,OAAA;AACX,oHAAA,iBAAiB,OAAA;AACjB,kHAAA,eAAe,OAAA;AAGjB,+DAMgC;AAL9B,+HAAA,uBAAuB,OAAA;AACvB,qHAAA,aAAa,OAAA;AACb,4HAAA,oBAAoB,OAAA;AACpB,gIAAA,wBAAwB,OAAA;AACxB,2HAAA,YAAY,OAAuB;AAErC,yDAM6B;AAL3B,oHAAA,eAAe,OAAA;AACf,iHAAA,YAAY,OAAA;AACZ,sHAAA,iBAAiB,OAAA;AACjB,sHAAA,iBAAiB,OAAA;AACjB,qHAAA,gBAAgB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,iFAAiF;AACjF,iFAAiF;AACjF,kDAAkD;AAClD,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,qDAA4G;AAAnG,kHAAA,eAAe,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAAE,gHAAA,aAAa,OAAA;AAChF,qDAS2B;AARzB,6GAAA,UAAU,OAAA;AACV,2GAAA,QAAQ,OAAA;AACR,gHAAA,aAAa,OAAA;AACb,gHAAA,aAAa,OAAA;AACb,qHAAA,kBAAkB,OAAA;AAClB,8GAAA,WAAW,OAAA;AACX,oHAAA,iBAAiB,OAAA;AACjB,kHAAA,eAAe,OAAA;AAGjB,+DAMgC;AAL9B,+HAAA,uBAAuB,OAAA;AACvB,qHAAA,aAAa,OAAA;AACb,4HAAA,oBAAoB,OAAA;AACpB,gIAAA,wBAAwB,OAAA;AACxB,2HAAA,YAAY,OAAuB;AAErC,yDAM6B;AAL3B,oHAAA,eAAe,OAAA;AACf,iHAAA,YAAY,OAAA;AACZ,sHAAA,iBAAiB,OAAA;AACjB,sHAAA,iBAAiB,OAAA;AACjB,qHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * How stale a cached definition may be before it is refused.
3
+ *
4
+ * Not unlimited. A definition cached months ago can be missing questions that
5
+ * were added since, and answers collected against it are recorded against a
6
+ * survey that no longer looks like that — which is harder to notice, and worse,
7
+ * than a survey that failed to appear.
8
+ */
9
+ export declare const MAX_AGE_MS: number;
10
+ export declare function cacheDefinition(surveyId: string, definition: Record<string, unknown>): Promise<void>;
11
+ /** A cached definition, or null when absent or too old. */
12
+ export declare function getCachedDefinition(surveyId: string, now?: number): Promise<Record<string, unknown> | null>;
13
+ /** Used by reset(): a cached definition outlives the identity that fetched it. */
14
+ export declare function clearCachedDefinitions(): Promise<void>;
15
+ //# sourceMappingURL=definitionCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitionCache.d.ts","sourceRoot":"","sources":["../../src/survey/definitionCache.ts"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,QAA0B,CAAC;AAOlD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,2DAA2D;AAC3D,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAKzC;AAED,kFAAkF;AAClF,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG5D"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MAX_AGE_MS = void 0;
37
+ exports.cacheDefinition = cacheDefinition;
38
+ exports.getCachedDefinition = getCachedDefinition;
39
+ exports.clearCachedDefinitions = clearCachedDefinitions;
40
+ /**
41
+ * Cached survey definitions, so a trigger that fires offline can still show.
42
+ *
43
+ * A native app is offline routinely — a lift, a plane, a bad cell — and the
44
+ * survey definition arrives over the network at the moment the trigger fires.
45
+ * Without a cache, an invitation that comes due offline simply does not appear.
46
+ *
47
+ * Used ONLY when the fetch fails. A successful fetch always wins, so a survey
48
+ * edited in the dashboard reaches respondents on their next online launch
49
+ * rather than being pinned to whatever was cached.
50
+ */
51
+ const storage = __importStar(require("../core/storage"));
52
+ const PREFIX = '@cxpinsight:surveydef:';
53
+ /**
54
+ * How stale a cached definition may be before it is refused.
55
+ *
56
+ * Not unlimited. A definition cached months ago can be missing questions that
57
+ * were added since, and answers collected against it are recorded against a
58
+ * survey that no longer looks like that — which is harder to notice, and worse,
59
+ * than a survey that failed to appear.
60
+ */
61
+ exports.MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
62
+ async function cacheDefinition(surveyId, definition) {
63
+ await storage.set(PREFIX + surveyId, { cachedAt: Date.now(), definition });
64
+ }
65
+ /** A cached definition, or null when absent or too old. */
66
+ async function getCachedDefinition(surveyId, now = Date.now()) {
67
+ const entry = await storage.get(PREFIX + surveyId);
68
+ if (!entry?.definition)
69
+ return null;
70
+ if (now - entry.cachedAt > exports.MAX_AGE_MS)
71
+ return null;
72
+ return entry.definition;
73
+ }
74
+ /** Used by reset(): a cached definition outlives the identity that fetched it. */
75
+ async function clearCachedDefinitions() {
76
+ const keys = await storage.getKeysWithPrefix(PREFIX);
77
+ if (keys.length)
78
+ await storage.multiRemove(keys);
79
+ }
80
+ //# sourceMappingURL=definitionCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitionCache.js","sourceRoot":"","sources":["../../src/survey/definitionCache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;GAUG;AACH,MAAY,OAAO,4CAAwB;AAE3C,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAExC;;;;;;;GAOG;AACU,QAAA,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAO3C,KAAK,0BACV,QAAgB,EAChB,UAAmC;IAEnC,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,UAAU,EAAW,CAAC,CAAC;AACtF,CAAC;AAED,2DAA2D;AACpD,KAAK,8BACV,QAAgB,EAChB,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAQ,MAAM,GAAG,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,QAAA,UAAU;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,KAAK,CAAC,UAAU,CAAC;AAC1B,CAAC;AAED,kFAAkF;AAC3E,KAAK;IACV,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC"}
@@ -1,10 +1,14 @@
1
- type AnswersMap = Record<string, unknown>;
2
- type VariablesMap = Record<string, unknown>;
3
- export interface EvalContext {
4
- variables: VariablesMap;
5
- answers: AnswersMap;
6
- }
7
- export declare function evaluateExpression(source: string, ctx: EvalContext): unknown;
8
- export declare function evaluateCondition(source: string | undefined, ctx: EvalContext): boolean;
9
- export {};
1
+ /**
2
+ * Expression evaluation now lives in @cxpinsight/survey-spec.
3
+ *
4
+ * This file was a fork of the React renderer's copy. It had already fixed a
5
+ * tokenizer bug that the original still carried — every showWhen using <=, >=,
6
+ * ==, <>, && or || silently hid its question on link surveys — and nothing
7
+ * propagated that fix back, because there was nothing connecting the two copies.
8
+ *
9
+ * A respondent's experience must not depend on how they arrived, so the
10
+ * behaviour lives in one place. tools/survey-conformance proves it stays there.
11
+ */
12
+ export { evaluateExpression, evaluateCondition, isParseable, } from '@cxpinsight/survey-spec';
13
+ export type { AnswersMap, VariablesMap, EvalContext } from '@cxpinsight/survey-spec';
10
14
  //# sourceMappingURL=expressionEval.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"expressionEval.d.ts","sourceRoot":"","sources":["../../src/survey/expressionEval.ts"],"names":[],"mappings":"AAsBA,KAAK,UAAU,GAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAI,UAAU,CAAC;CACvB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAY5E;AAUD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAIvF"}
1
+ {"version":3,"file":"expressionEval.d.ts","sourceRoot":"","sources":["../../src/survey/expressionEval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,GACZ,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,292 +1,19 @@
1
1
  "use strict";
2
- // Mobile SDK port of the web renderer's expressionEval — spec §7 §22.
3
- // See apps/frontend/src/components/survey/renderer/lib/expressionEval.ts
4
- // for the authoritative implementation; this file is a byte-mostly copy
5
- // with the type imports swapped for local ones so the RN SDK doesn't
6
- // take a build-time dep on the web renderer package.
7
- //
8
- // KEEP THESE IN LOCKSTEP. When you change the grammar, change both.
9
- // Divergence between web and mobile evaluators produces surveys that
10
- // branch differently on the two runtimes — very hard to debug.
11
- //
12
- // Supported subset (matches web):
13
- // Comparators: = != < > <= >= == <>
14
- // Boolean: and or not && || !
15
- // Arithmetic: + - * /
16
- // Refs: {q_id} the respondent's answer to q_id
17
- // {{variable}} resolved variable value
18
- // {{q_id.answer}} answer via variable-style ref
19
- // 'string' / "string"
20
- // 42 / -3.14
21
- // true / false / null
22
- // contains array/string membership
23
2
  Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.evaluateExpression = evaluateExpression;
25
- exports.evaluateCondition = evaluateCondition;
26
- function evaluateExpression(source, ctx) {
27
- if (typeof source !== 'string')
28
- return undefined;
29
- const src = source.trim();
30
- if (!src)
31
- return undefined;
32
- try {
33
- const tokens = tokenize(src);
34
- const [value, consumed] = parseExpression(tokens, 0, ctx);
35
- if (consumed !== tokens.length)
36
- return undefined;
37
- return value;
38
- }
39
- catch {
40
- return undefined;
41
- }
42
- }
43
- // showWhen/enabledWhen coerce to boolean. No condition = true (visible).
44
- // NOTE: this comment used to claim a parse error returns true (fail-open) and
45
- // that this "matches web semantics". The conformance harness
46
- // (tools/survey-conformance) disproves both halves: evaluateExpression returns
47
- // undefined on a parse error, truthy(undefined) is false, so this fails CLOSED
48
- // and hides the question — while the web SDK's new Function() path throws, is
49
- // caught, and returns true. Which behaviour is correct is a spec decision, but
50
- // the comment should not assert a parity that does not exist.
51
- function evaluateCondition(source, ctx) {
52
- if (!source)
53
- return true;
54
- const result = evaluateExpression(source, ctx);
55
- return truthy(result);
56
- }
57
- function tokenize(src) {
58
- const tokens = [];
59
- let i = 0;
60
- const len = src.length;
61
- while (i < len) {
62
- const c = src[i];
63
- if (c === ' ' || c === '\t' || c === '\n' || c === '\r') {
64
- i++;
65
- continue;
66
- }
67
- if (c === "'" || c === '"') {
68
- const quote = c;
69
- let out = '';
70
- i++;
71
- while (i < len && src[i] !== quote) {
72
- if (src[i] === '\\' && i + 1 < len) {
73
- out += src[i + 1];
74
- i += 2;
75
- }
76
- else {
77
- out += src[i];
78
- i++;
79
- }
80
- }
81
- i++;
82
- tokens.push({ kind: 'str', value: out });
83
- continue;
84
- }
85
- if ((c >= '0' && c <= '9') || (c === '-' && src[i + 1] >= '0' && src[i + 1] <= '9' && !prevExpectsBinary(tokens))) {
86
- let j = i;
87
- if (src[j] === '-')
88
- j++;
89
- while (j < len && ((src[j] >= '0' && src[j] <= '9') || src[j] === '.'))
90
- j++;
91
- tokens.push({ kind: 'num', value: parseFloat(src.slice(i, j)) });
92
- i = j;
93
- continue;
94
- }
95
- if (c === '{' && src[i + 1] === '{') {
96
- const end = src.indexOf('}}', i + 2);
97
- if (end < 0)
98
- throw new Error('unterminated {{');
99
- const inner = src.slice(i + 2, end).trim();
100
- const dot = inner.indexOf('.');
101
- if (dot > 0) {
102
- tokens.push({ kind: 'variable_ref', name: inner.slice(0, dot).trim(), suffix: inner.slice(dot + 1).trim() });
103
- }
104
- else {
105
- tokens.push({ kind: 'variable_ref', name: inner });
106
- }
107
- i = end + 2;
108
- continue;
109
- }
110
- if (c === '{') {
111
- const end = src.indexOf('}', i + 1);
112
- if (end < 0)
113
- throw new Error('unterminated {');
114
- tokens.push({ kind: 'answer_ref', name: src.slice(i + 1, end).trim() });
115
- i = end + 1;
116
- continue;
117
- }
118
- if (c === '(') {
119
- tokens.push({ kind: 'lparen' });
120
- i++;
121
- continue;
122
- }
123
- if (c === ')') {
124
- tokens.push({ kind: 'rparen' });
125
- i++;
126
- continue;
127
- }
128
- let matchedMulti = false;
129
- for (const op of ['<=', '>=', '!=', '<>', '&&', '||', '==']) {
130
- if (src.slice(i, i + op.length) === op) {
131
- tokens.push({ kind: 'op', value: op === '==' ? '=' : op });
132
- i += op.length;
133
- matchedMulti = true;
134
- break;
135
- }
136
- }
137
- if (matchedMulti)
138
- continue;
139
- if ('=<>+-*/!'.includes(c)) {
140
- tokens.push({ kind: 'op', value: c });
141
- i++;
142
- continue;
143
- }
144
- const kw = src.slice(i).match(/^[a-zA-Z_][a-zA-Z_0-9]*/);
145
- if (kw) {
146
- const word = kw[0];
147
- i += word.length;
148
- const lower = word.toLowerCase();
149
- if (lower === 'true')
150
- tokens.push({ kind: 'bool', value: true });
151
- else if (lower === 'false')
152
- tokens.push({ kind: 'bool', value: false });
153
- else if (lower === 'null')
154
- tokens.push({ kind: 'null' });
155
- else if (lower === 'and')
156
- tokens.push({ kind: 'op', value: '&&' });
157
- else if (lower === 'or')
158
- tokens.push({ kind: 'op', value: '||' });
159
- else if (lower === 'not')
160
- tokens.push({ kind: 'op', value: '!' });
161
- else if (lower === 'contains')
162
- tokens.push({ kind: 'op', value: 'contains' });
163
- else
164
- throw new Error('unknown identifier "' + word + '" — refs must be wrapped in {}');
165
- continue;
166
- }
167
- throw new Error('unexpected character "' + c + '" at position ' + i);
168
- }
169
- return tokens;
170
- }
171
- function prevExpectsBinary(tokens) {
172
- const prev = tokens[tokens.length - 1];
173
- if (!prev)
174
- return false;
175
- return prev.kind === 'num' || prev.kind === 'str' || prev.kind === 'bool'
176
- || prev.kind === 'answer_ref' || prev.kind === 'variable_ref'
177
- || prev.kind === 'rparen';
178
- }
179
- const PREC = {
180
- '||': 1, '&&': 2,
181
- '=': 3, '!=': 3, '<>': 3, 'contains': 3,
182
- '<': 4, '>': 4, '<=': 4, '>=': 4,
183
- '+': 5, '-': 5,
184
- '*': 6, '/': 6,
185
- };
186
- function parseExpression(tokens, pos, ctx, minPrec = 1) {
187
- let [lhs, next] = parseUnary(tokens, pos, ctx);
188
- while (next < tokens.length) {
189
- const t = tokens[next];
190
- if (t.kind !== 'op')
191
- break;
192
- const prec = PREC[t.value];
193
- if (prec === undefined || prec < minPrec)
194
- break;
195
- const op = t.value;
196
- const [rhs, after] = parseExpression(tokens, next + 1, ctx, prec + 1);
197
- lhs = applyBinary(op, lhs, rhs);
198
- next = after;
199
- }
200
- return [lhs, next];
201
- }
202
- function parseUnary(tokens, pos, ctx) {
203
- const t = tokens[pos];
204
- if (!t)
205
- throw new Error('unexpected end of expression');
206
- if (t.kind === 'op' && t.value === '!') {
207
- const [inner, after] = parseUnary(tokens, pos + 1, ctx);
208
- return [!truthy(inner), after];
209
- }
210
- if (t.kind === 'op' && t.value === '-') {
211
- const [inner, after] = parseUnary(tokens, pos + 1, ctx);
212
- return [-Number(inner), after];
213
- }
214
- return parsePrimary(tokens, pos, ctx);
215
- }
216
- function parsePrimary(tokens, pos, ctx) {
217
- const t = tokens[pos];
218
- if (!t)
219
- throw new Error('unexpected end of expression');
220
- switch (t.kind) {
221
- case 'num': return [t.value, pos + 1];
222
- case 'str': return [t.value, pos + 1];
223
- case 'bool': return [t.value, pos + 1];
224
- case 'null': return [null, pos + 1];
225
- case 'answer_ref': return [ctx.answers[t.name], pos + 1];
226
- case 'variable_ref': {
227
- // Resolution rules for {{name.suffix}}:
228
- // • {{q1.answer}} → ctx.answers.q1 (legacy special-case)
229
- // • {{customer_name}} → ctx.variables.customer_name
230
- // • {{device.theme}} → walk dotted path into ctx.variables.device
231
- // • {{a.b.c.d}} → walk into ctx.variables.a.b.c.d
232
- // A dotted suffix that hits a non-object mid-walk returns undefined,
233
- // which then compares falsy in showWhen. Lets SDKs expose structured
234
- // runtime signals (device, session, …) under variables.* without
235
- // adding new token kinds. Kept in lockstep with the web evaluator at
236
- // apps/frontend/src/components/survey/renderer/lib/expressionEval.ts.
237
- if (t.suffix === 'answer')
238
- return [ctx.answers[t.name], pos + 1];
239
- const root = ctx.variables[t.name];
240
- if (!t.suffix)
241
- return [root, pos + 1];
242
- let cursor = root;
243
- for (const seg of t.suffix.split('.')) {
244
- if (cursor == null || typeof cursor !== 'object') {
245
- cursor = undefined;
246
- break;
247
- }
248
- cursor = cursor[seg];
249
- }
250
- return [cursor, pos + 1];
251
- }
252
- case 'lparen': {
253
- const [inner, after] = parseExpression(tokens, pos + 1, ctx, 1);
254
- if (tokens[after]?.kind !== 'rparen')
255
- throw new Error('missing closing paren');
256
- return [inner, after + 1];
257
- }
258
- default: throw new Error('unexpected token: ' + JSON.stringify(t));
259
- }
260
- }
261
- function applyBinary(op, lhs, rhs) {
262
- switch (op) {
263
- case '=': return String(lhs) === String(rhs);
264
- case '!=':
265
- case '<>': return String(lhs) !== String(rhs);
266
- case '<': return Number(lhs) < Number(rhs);
267
- case '>': return Number(lhs) > Number(rhs);
268
- case '<=': return Number(lhs) <= Number(rhs);
269
- case '>=': return Number(lhs) >= Number(rhs);
270
- case '&&': return truthy(lhs) && truthy(rhs);
271
- case '||': return truthy(lhs) || truthy(rhs);
272
- case '+': return typeof lhs === 'string' || typeof rhs === 'string'
273
- ? String(lhs) + String(rhs)
274
- : Number(lhs) + Number(rhs);
275
- case '-': return Number(lhs) - Number(rhs);
276
- case '*': return Number(lhs) * Number(rhs);
277
- case '/': return Number(lhs) / Number(rhs);
278
- case 'contains':
279
- if (Array.isArray(lhs))
280
- return lhs.includes(rhs);
281
- return String(lhs ?? '').includes(String(rhs));
282
- default: return undefined;
283
- }
284
- }
285
- function truthy(v) {
286
- if (v === false || v === null || v === undefined || v === 0 || v === '')
287
- return false;
288
- if (Array.isArray(v))
289
- return v.length > 0;
290
- return true;
291
- }
3
+ exports.isParseable = exports.evaluateCondition = exports.evaluateExpression = void 0;
4
+ /**
5
+ * Expression evaluation now lives in @cxpinsight/survey-spec.
6
+ *
7
+ * This file was a fork of the React renderer's copy. It had already fixed a
8
+ * tokenizer bug that the original still carried — every showWhen using <=, >=,
9
+ * ==, <>, && or || silently hid its question on link surveys — and nothing
10
+ * propagated that fix back, because there was nothing connecting the two copies.
11
+ *
12
+ * A respondent's experience must not depend on how they arrived, so the
13
+ * behaviour lives in one place. tools/survey-conformance proves it stays there.
14
+ */
15
+ var survey_spec_1 = require("@cxpinsight/survey-spec");
16
+ Object.defineProperty(exports, "evaluateExpression", { enumerable: true, get: function () { return survey_spec_1.evaluateExpression; } });
17
+ Object.defineProperty(exports, "evaluateCondition", { enumerable: true, get: function () { return survey_spec_1.evaluateCondition; } });
18
+ Object.defineProperty(exports, "isParseable", { enumerable: true, get: function () { return survey_spec_1.isParseable; } });
292
19
  //# sourceMappingURL=expressionEval.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"expressionEval.js","sourceRoot":"","sources":["../../src/survey/expressionEval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expressionEval.js","sourceRoot":"","sources":["../../src/survey/expressionEval.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,uDAIiC;AAH/B,iHAAA,kBAAkB,OAAA;AAClB,gHAAA,iBAAiB,OAAA;AACjB,0GAAA,WAAW,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"interpolate.d.ts","sourceRoot":"","sources":["../../src/survey/interpolate.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,EAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAO1F"}
1
+ {"version":3,"file":"interpolate.d.ts","sourceRoot":"","sources":["../../src/survey/interpolate.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,EAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAO1F"}
@@ -1,23 +1,8 @@
1
1
  "use strict";
2
- // Mobile SDK port of the web renderer's interpolate — spec §22.
3
- // Kept lockstep with apps/frontend/src/components/survey/renderer/lib/interpolate.ts
4
- // but stripped down: React Native has no dangerouslySetInnerHTML sink,
5
- // so the HTML-escape variant isn't needed. All mobile substitutions
6
- // land in plain <Text> nodes; RN escapes text content automatically.
7
- //
8
- // Supported forms (matches web):
9
- // {{name}} — variable lookup
10
- // {{q_id.answer}} — answer via variable-style ref
11
- // \{{name}} — literal {{name}}, escape not consumed
12
- //
13
- // Unresolved refs render as empty string per spec §22.2 — NEVER the
14
- // literal `{{name}}` (that reads as broken UI to the respondent).
15
- //
16
- // Variables map on mobile is currently empty (Phase 4.5 variables
17
- // resolver is a follow-up); {{q_id.answer}} refs work today via the
18
- // answers map that showWhen/hideWhen already reads.
19
2
  Object.defineProperty(exports, "__esModule", { value: true });
20
3
  exports.interpolatePlain = interpolatePlain;
4
+ // Mobile SDK port of the web renderer's interpolate — spec §22.
5
+ const survey_spec_1 = require("@cxpinsight/survey-spec");
21
6
  const REF_RE = /(\\)?\{\{\s*([a-zA-Z_][a-zA-Z_0-9]*)(?:\.([a-zA-Z_][a-zA-Z_0-9]*))?\s*\}\}/g;
22
7
  function interpolatePlain(text, ctx) {
23
8
  if (!text)
@@ -32,16 +17,13 @@ function interpolatePlain(text, ctx) {
32
17
  function resolveRef(name, suffix, ctx) {
33
18
  if (suffix === 'answer')
34
19
  return ctx.answers[name];
35
- // Namespaced attribute-context ref, e.g. {{user.plan}} / {{device.os}} —
36
- // resolve the flat dotted key from the variable pool (auto-seeded from the
37
- // Attribute Context). Additive: only hits when that exact key exists, so
38
- // existing {{name}} and {{q_id.answer}} refs are unaffected.
39
- if (suffix) {
40
- const dotted = ctx.variables[`${name}.${suffix}`];
41
- if (dotted !== undefined)
42
- return dotted;
43
- }
44
- return ctx.variables[name];
20
+ // One rule, shared with the expression evaluator (@cxpinsight/survey-spec).
21
+ // This used to try a flat dotted key and, when that missed, fall back to
22
+ // ctx.variables[name] which for a nested bag is the NAMESPACE OBJECT. So
23
+ // "Hi {{user.name}}" rendered the entire user object as JSON, every field of
24
+ // it, on screen to the respondent. Conditions had always walked the path;
25
+ // only text did not.
26
+ return (0, survey_spec_1.resolveVariable)(ctx.variables, name, suffix);
45
27
  }
46
28
  function displayString(v) {
47
29
  if (v === undefined || v === null)
@@ -1 +1 @@
1
- {"version":3,"file":"interpolate.js","sourceRoot":"","sources":["../../src/survey/interpolate.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,qFAAqF;AACrF,uEAAuE;AACvE,oEAAoE;AACpE,qEAAqE;AACrE,EAAE;AACF,iCAAiC;AACjC,uCAAuC;AACvC,qDAAqD;AACrD,6DAA6D;AAC7D,EAAE;AACF,oEAAoE;AACpE,kEAAkE;AAClE,EAAE;AACF,kEAAkE;AAClE,oEAAoE;AACpE,oDAAoD;;;AAOpD,MAAM,MAAM,GAAG,6EAA6E,CAAC;AAE7F,0BAAiC,IAAwB,EAAE,GAAuB;IAChF,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC1D,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,MAA0B,EAAE,GAAuB;IACnF,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,yEAAyE;IACzE,2EAA2E;IAC3E,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"interpolate.js","sourceRoot":"","sources":["../../src/survey/interpolate.ts"],"names":[],"mappings":";;;AAAA,gEAAgE;AAChE,yDAA0D;AAuB1D,MAAM,MAAM,GAAG,6EAA6E,CAAC;AAE7F,0BAAiC,IAAwB,EAAE,GAAuB;IAChF,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC1D,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,MAA0B,EAAE,GAAuB;IACnF,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,4EAA4E;IAC5E,yEAAyE;IACzE,2EAA2E;IAC3E,6EAA6E;IAC7E,0EAA0E;IAC1E,qBAAqB;IACrB,OAAO,IAAA,6BAAe,EAAC,GAAG,CAAC,SAAoC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
@@ -78,6 +78,16 @@ function validateTextish(question, value) {
78
78
  if (maxLength !== undefined && trimmed.length > maxLength) {
79
79
  return `Please keep this under ${maxLength} characters`;
80
80
  }
81
+ // minLength was only honoured through the rules[] array, never as a direct
82
+ // question property — so a question with minLength set in the builder was
83
+ // enforced on links and silently ignored here. Same survey, different rules,
84
+ // depending on how the respondent arrived.
85
+ const minLength = typeof question.minLength === 'number'
86
+ ? question.minLength
87
+ : undefined;
88
+ if (minLength !== undefined && trimmed.length < minLength) {
89
+ return `Please enter at least ${minLength} characters`;
90
+ }
81
91
  return null;
82
92
  }
83
93
  function validateCheckbox(question, value) {
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/survey/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/survey/validate.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts CHANGED
@@ -15,6 +15,7 @@ export interface CXPinsightConfig {
15
15
  debugIp?: string;
16
16
  captureNetwork?: boolean;
17
17
  requireConsent?: boolean;
18
+ autoCaptureTaps?: boolean;
18
19
  theme?: string;
19
20
  primaryColor?: string;
20
21
  brandingPalette?: {
@@ -105,7 +106,7 @@ export interface FunnelStepOptions {
105
106
  export interface ExperimentOptions {
106
107
  experimentName?: string;
107
108
  variantName?: string;
108
- assignmentMethod?: 'random' | 'targeted' | 'manual';
109
+ assignmentMethod?: 'auto' | 'random' | 'targeted' | 'manual';
109
110
  [key: string]: unknown;
110
111
  }
111
112
  /** Conversion tracking options */