@thoughtspot/visual-embed-sdk 1.52.0 → 1.52.2-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/package.json +19 -4
- package/cjs/src/contracts/contracts.spec.d.ts +2 -0
- package/cjs/src/contracts/contracts.spec.d.ts.map +1 -0
- package/cjs/src/contracts/contracts.spec.js +345 -0
- package/cjs/src/contracts/contracts.spec.js.map +1 -0
- package/cjs/src/contracts/embed-event-payloads.d.ts +73 -0
- package/cjs/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/cjs/src/contracts/embed-event-payloads.js +3 -0
- package/cjs/src/contracts/embed-event-payloads.js.map +1 -0
- package/cjs/src/contracts/host-event-contracts.d.ts +416 -0
- package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/cjs/src/contracts/host-event-contracts.js +3 -0
- package/cjs/src/contracts/host-event-contracts.js.map +1 -0
- package/cjs/src/contracts/index.d.ts +22 -0
- package/cjs/src/contracts/index.d.ts.map +1 -0
- package/cjs/src/contracts/index.js +33 -0
- package/cjs/src/contracts/index.js.map +1 -0
- package/cjs/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/cjs/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/cjs/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
- package/cjs/src/contracts/ui-passthrough-contracts.js.map +1 -0
- package/cjs/src/embed/app.d.ts +21 -143
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +21 -121
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +80 -26
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.js +1 -1
- package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
- package/cjs/src/embed/auto-frame-renderer.spec.js +24 -13
- package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/cjs/src/embed/bodyless-conversation.js +1 -1
- package/cjs/src/embed/bodyless-conversation.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +1 -0
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +4 -4
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +35 -24
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/embedConfig.spec.js +2 -1
- package/cjs/src/embed/embedConfig.spec.js.map +1 -1
- package/cjs/src/embed/events.spec.js +12 -2
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +5 -4
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +34 -23
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +50 -44
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts +10 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.js +52 -6
- package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.spec.js +151 -0
- package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +13 -164
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +72 -135
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +213 -29
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/search-bar.js +1 -1
- package/cjs/src/embed/search-bar.js.map +1 -1
- package/cjs/src/embed/search.d.ts +14 -0
- package/cjs/src/embed/search.d.ts.map +1 -1
- package/cjs/src/embed/search.js +5 -2
- package/cjs/src/embed/search.js.map +1 -1
- package/cjs/src/embed/search.spec.js +85 -0
- package/cjs/src/embed/search.spec.js.map +1 -1
- package/cjs/src/embed/spotter-utils.d.ts +8 -1
- package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-utils.js +14 -1
- package/cjs/src/embed/spotter-utils.js.map +1 -1
- package/cjs/src/embed/spotter-utils.spec.js +26 -0
- package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +20 -22
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +171 -66
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +486 -38
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.js +1 -1
- package/cjs/src/errors.js.map +1 -1
- package/cjs/src/full-height.d.ts +137 -0
- package/cjs/src/full-height.d.ts.map +1 -0
- package/cjs/src/full-height.js +272 -0
- package/cjs/src/full-height.js.map +1 -0
- package/cjs/src/full-height.spec.d.ts +2 -0
- package/cjs/src/full-height.spec.d.ts.map +1 -0
- package/cjs/src/full-height.spec.js +835 -0
- package/cjs/src/full-height.spec.js.map +1 -0
- package/cjs/src/index.d.ts +5 -3
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +6 -4
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/react/all-types-export.d.ts +1 -1
- package/cjs/src/react/all-types-export.d.ts.map +1 -1
- package/cjs/src/react/all-types-export.js +2 -1
- package/cjs/src/react/all-types-export.js.map +1 -1
- package/cjs/src/react/all-types-export.parity.spec.js +55 -3
- package/cjs/src/react/all-types-export.parity.spec.js.map +1 -1
- package/cjs/src/types.d.ts +584 -24
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +370 -22
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js +2 -1
- package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/cjs/src/utils/custom-actions.spec.js +4 -2
- package/cjs/src/utils/custom-actions.spec.js.map +1 -1
- package/cjs/src/utils/filterConverter.d.ts +106 -0
- package/cjs/src/utils/filterConverter.d.ts.map +1 -0
- package/cjs/src/utils/filterConverter.js +215 -0
- package/cjs/src/utils/filterConverter.js.map +1 -0
- package/cjs/src/utils/filterConverter.spec.d.ts +2 -0
- package/cjs/src/utils/filterConverter.spec.d.ts.map +1 -0
- package/cjs/src/utils/filterConverter.spec.js +709 -0
- package/cjs/src/utils/filterConverter.spec.js.map +1 -0
- package/cjs/src/utils/processData.spec.js +2 -1
- package/cjs/src/utils/processData.spec.js.map +1 -1
- package/cjs/src/utils/processTrigger.d.ts +3 -1
- package/cjs/src/utils/processTrigger.d.ts.map +1 -1
- package/cjs/src/utils/processTrigger.js +19 -51
- package/cjs/src/utils/processTrigger.js.map +1 -1
- package/cjs/src/utils/transport/iframe-transport.d.ts +55 -0
- package/cjs/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.js +108 -0
- package/cjs/src/utils/transport/iframe-transport.js.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/cjs/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/cjs/src/utils/transport/iframe-transport.spec.js +140 -0
- package/cjs/src/utils/transport/iframe-transport.spec.js.map +1 -0
- package/cjs/src/utils.d.ts +18 -0
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +39 -1
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +62 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-BMppCU63.js → index-CcBYlGo9.js} +1 -1
- package/dist/src/contracts/contracts.spec.d.ts +2 -0
- package/dist/src/contracts/contracts.spec.d.ts.map +1 -0
- package/dist/src/contracts/embed-event-payloads.d.ts +73 -0
- package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/dist/src/contracts/host-event-contracts.d.ts +416 -0
- package/dist/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/dist/src/contracts/index.d.ts +22 -0
- package/dist/src/contracts/index.d.ts.map +1 -0
- package/dist/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/dist/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/dist/src/embed/app.d.ts +21 -143
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +1 -0
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +5 -4
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts +10 -1
- package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +13 -164
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/search.d.ts +14 -0
- package/dist/src/embed/search.d.ts.map +1 -1
- package/dist/src/embed/spotter-utils.d.ts +8 -1
- package/dist/src/embed/spotter-utils.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +20 -22
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/full-height.d.ts +137 -0
- package/dist/src/full-height.d.ts.map +1 -0
- package/dist/src/full-height.spec.d.ts +2 -0
- package/dist/src/full-height.spec.d.ts.map +1 -0
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/react/all-types-export.d.ts +1 -1
- package/dist/src/react/all-types-export.d.ts.map +1 -1
- package/dist/src/types.d.ts +584 -24
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/filterConverter.d.ts +106 -0
- package/dist/src/utils/filterConverter.d.ts.map +1 -0
- package/dist/src/utils/filterConverter.spec.d.ts +2 -0
- package/dist/src/utils/filterConverter.spec.d.ts.map +1 -0
- package/dist/src/utils/processTrigger.d.ts +3 -1
- package/dist/src/utils/processTrigger.d.ts.map +1 -1
- package/dist/src/utils/transport/iframe-transport.d.ts +55 -0
- package/dist/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/dist/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/dist/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/dist/src/utils.d.ts +18 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +1144 -412
- package/dist/tsembed-react.js +1143 -411
- package/dist/tsembed.es.js +1357 -418
- package/dist/tsembed.js +1352 -412
- package/dist/visual-embed-sdk-react-full.d.ts +1514 -651
- package/dist/visual-embed-sdk-react.d.ts +1351 -632
- package/dist/visual-embed-sdk.d.ts +1508 -668
- package/lib/package.json +19 -4
- package/lib/src/contracts/contracts.spec.d.ts +2 -0
- package/lib/src/contracts/contracts.spec.d.ts.map +1 -0
- package/lib/src/contracts/contracts.spec.js +342 -0
- package/lib/src/contracts/contracts.spec.js.map +1 -0
- package/lib/src/contracts/embed-event-payloads.d.ts +73 -0
- package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -0
- package/lib/src/contracts/embed-event-payloads.js +2 -0
- package/lib/src/contracts/embed-event-payloads.js.map +1 -0
- package/lib/src/contracts/host-event-contracts.d.ts +416 -0
- package/lib/src/contracts/host-event-contracts.d.ts.map +1 -0
- package/lib/src/contracts/host-event-contracts.js +2 -0
- package/lib/src/contracts/host-event-contracts.js.map +1 -0
- package/lib/src/contracts/index.d.ts +22 -0
- package/lib/src/contracts/index.d.ts.map +1 -0
- package/lib/src/contracts/index.js +22 -0
- package/lib/src/contracts/index.js.map +1 -0
- package/lib/src/contracts/ui-passthrough-contracts.d.ts +277 -0
- package/lib/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
- package/lib/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
- package/lib/src/contracts/ui-passthrough-contracts.js.map +1 -0
- package/lib/src/embed/app.d.ts +21 -143
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +23 -123
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +80 -26
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.js +1 -1
- package/lib/src/embed/auto-frame-renderer.js.map +1 -1
- package/lib/src/embed/auto-frame-renderer.spec.js +24 -13
- package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
- package/lib/src/embed/bodyless-conversation.js +1 -1
- package/lib/src/embed/bodyless-conversation.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +1 -0
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +5 -5
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +35 -24
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/embedConfig.spec.js +2 -1
- package/lib/src/embed/embedConfig.spec.js.map +1 -1
- package/lib/src/embed/events.spec.js +12 -2
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +5 -4
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +19 -8
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +15 -9
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts +10 -1
- package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/utils.js +48 -3
- package/lib/src/embed/hostEventClient/utils.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.spec.js +152 -1
- package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +13 -164
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +73 -136
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +213 -29
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/search-bar.js +1 -1
- package/lib/src/embed/search-bar.js.map +1 -1
- package/lib/src/embed/search.d.ts +14 -0
- package/lib/src/embed/search.d.ts.map +1 -1
- package/lib/src/embed/search.js +5 -2
- package/lib/src/embed/search.js.map +1 -1
- package/lib/src/embed/search.spec.js +85 -0
- package/lib/src/embed/search.spec.js.map +1 -1
- package/lib/src/embed/spotter-utils.d.ts +8 -1
- package/lib/src/embed/spotter-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-utils.js +12 -0
- package/lib/src/embed/spotter-utils.js.map +1 -1
- package/lib/src/embed/spotter-utils.spec.js +27 -1
- package/lib/src/embed/spotter-utils.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +20 -22
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +171 -66
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +484 -36
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.js +1 -1
- package/lib/src/errors.js.map +1 -1
- package/lib/src/full-height.d.ts +137 -0
- package/lib/src/full-height.d.ts.map +1 -0
- package/lib/src/full-height.js +268 -0
- package/lib/src/full-height.js.map +1 -0
- package/lib/src/full-height.spec.d.ts +2 -0
- package/lib/src/full-height.spec.d.ts.map +1 -0
- package/lib/src/full-height.spec.js +833 -0
- package/lib/src/full-height.spec.js.map +1 -0
- package/lib/src/index.d.ts +5 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +3 -2
- package/lib/src/index.js.map +1 -1
- package/lib/src/react/all-types-export.d.ts +1 -1
- package/lib/src/react/all-types-export.d.ts.map +1 -1
- package/lib/src/react/all-types-export.js +1 -1
- package/lib/src/react/all-types-export.js.map +1 -1
- package/lib/src/react/all-types-export.parity.spec.js +55 -3
- package/lib/src/react/all-types-export.parity.spec.js.map +1 -1
- package/lib/src/types.d.ts +584 -24
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +370 -22
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js +2 -1
- package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
- package/lib/src/utils/custom-actions.spec.js +4 -2
- package/lib/src/utils/custom-actions.spec.js.map +1 -1
- package/lib/src/utils/filterConverter.d.ts +106 -0
- package/lib/src/utils/filterConverter.d.ts.map +1 -0
- package/lib/src/utils/filterConverter.js +210 -0
- package/lib/src/utils/filterConverter.js.map +1 -0
- package/lib/src/utils/filterConverter.spec.d.ts +2 -0
- package/lib/src/utils/filterConverter.spec.d.ts.map +1 -0
- package/lib/src/utils/filterConverter.spec.js +707 -0
- package/lib/src/utils/filterConverter.spec.js.map +1 -0
- package/lib/src/utils/processData.spec.js +2 -1
- package/lib/src/utils/processData.spec.js.map +1 -1
- package/lib/src/utils/processTrigger.d.ts +3 -1
- package/lib/src/utils/processTrigger.d.ts.map +1 -1
- package/lib/src/utils/processTrigger.js +19 -51
- package/lib/src/utils/processTrigger.js.map +1 -1
- package/lib/src/utils/transport/iframe-transport.d.ts +55 -0
- package/lib/src/utils/transport/iframe-transport.d.ts.map +1 -0
- package/lib/src/utils/transport/iframe-transport.js +101 -0
- package/lib/src/utils/transport/iframe-transport.js.map +1 -0
- package/lib/src/utils/transport/iframe-transport.spec.d.ts +2 -0
- package/lib/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
- package/lib/src/utils/transport/iframe-transport.spec.js +138 -0
- package/lib/src/utils/transport/iframe-transport.spec.js.map +1 -0
- package/lib/src/utils.d.ts +18 -0
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +37 -0
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +63 -1
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +1508 -668
- package/package.json +19 -4
- package/src/contracts/contracts.spec.ts +392 -0
- package/src/contracts/embed-event-payloads.ts +83 -0
- package/src/contracts/host-event-contracts.ts +500 -0
- package/src/contracts/index.ts +53 -0
- package/src/contracts/ui-passthrough-contracts.ts +301 -0
- package/src/embed/app.spec.ts +101 -34
- package/src/embed/app.ts +42 -268
- package/src/embed/auto-frame-renderer.spec.ts +24 -13
- package/src/embed/auto-frame-renderer.ts +1 -1
- package/src/embed/bodyless-conversation.ts +1 -1
- package/src/embed/conversation.spec.ts +38 -27
- package/src/embed/conversation.ts +5 -5
- package/src/embed/embedConfig.spec.ts +2 -1
- package/src/embed/events.spec.ts +14 -2
- package/src/embed/hostEventClient/host-event-client.spec.ts +16 -10
- package/src/embed/hostEventClient/host-event-client.ts +31 -10
- package/src/embed/hostEventClient/utils.spec.ts +176 -1
- package/src/embed/hostEventClient/utils.ts +53 -3
- package/src/embed/liveboard.spec.ts +261 -41
- package/src/embed/liveboard.ts +85 -300
- package/src/embed/search-bar.tsx +1 -1
- package/src/embed/search.spec.ts +103 -0
- package/src/embed/search.ts +21 -1
- package/src/embed/spotter-utils.spec.ts +29 -0
- package/src/embed/spotter-utils.ts +16 -0
- package/src/embed/ts-embed.spec.ts +650 -36
- package/src/embed/ts-embed.ts +205 -76
- package/src/errors.ts +1 -1
- package/src/full-height.spec.ts +1008 -0
- package/src/full-height.ts +361 -0
- package/src/index.ts +103 -5
- package/src/react/all-types-export.parity.spec.ts +63 -3
- package/src/react/all-types-export.ts +49 -0
- package/src/types.ts +584 -22
- package/src/utils/authService/tokenizedAuthService.spec.ts +2 -1
- package/src/utils/custom-actions.spec.ts +4 -2
- package/src/utils/filterConverter.spec.ts +801 -0
- package/src/utils/filterConverter.ts +304 -0
- package/src/utils/processData.spec.ts +2 -1
- package/src/utils/processTrigger.ts +28 -58
- package/src/utils/transport/iframe-transport.spec.ts +177 -0
- package/src/utils/transport/iframe-transport.ts +122 -0
- package/src/utils.spec.ts +71 -0
- package/src/utils.ts +38 -0
- package/cjs/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/cjs/src/embed/hostEventClient/contracts.js.map +0 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +0 -231
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +0 -1
- package/lib/src/embed/hostEventClient/contracts.js.map +0 -1
- package/src/embed/hostEventClient/contracts.ts +0 -262
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Param, BaseViewConfig, RuntimeFilter, RuntimeParameter, ErrorDetailsTypes, EmbedErrorCodes, DefaultAppInitData, VisualizationOverrides, SpotterFileUploadFileTypes } from '../types';
|
|
2
2
|
import { TsEmbed } from './ts-embed';
|
|
3
|
-
import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData, buildStarterPromptsAppInitData } from './spotter-utils';
|
|
3
|
+
import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData, buildStarterPromptsAppInitData, buildSpotterAnalystAppInitData } from './spotter-utils';
|
|
4
4
|
import { getQueryParamString, getFilterQuery, getRuntimeParameters, setParamIfDefined } from '../utils';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -801,6 +801,7 @@ export interface SpotterAppInitData extends DefaultAppInitData {
|
|
|
801
801
|
spotterShareConversationConfig?: SpotterShareConversationConfig;
|
|
802
802
|
visualOverridesParams?: VisualizationOverrides | null;
|
|
803
803
|
starterPrompts?: StarterPromptsConfig;
|
|
804
|
+
spotterAnalystConfig?: SpotterAnalystConfig;
|
|
804
805
|
};
|
|
805
806
|
}
|
|
806
807
|
|
|
@@ -850,7 +851,8 @@ export class SpotterEmbed extends TsEmbed {
|
|
|
850
851
|
this.handleError.bind(this),
|
|
851
852
|
);
|
|
852
853
|
const shareInitData = buildSpotterShareConversationAppInitData(sidebarInitData, this.viewConfig);
|
|
853
|
-
|
|
854
|
+
const starterPromptsInitData = buildStarterPromptsAppInitData(shareInitData, this.viewConfig);
|
|
855
|
+
return buildSpotterAnalystAppInitData(starterPromptsInitData, this.viewConfig);
|
|
854
856
|
}
|
|
855
857
|
|
|
856
858
|
protected getEmbedParamsObject() {
|
|
@@ -871,7 +873,6 @@ export class SpotterEmbed extends TsEmbed {
|
|
|
871
873
|
defaultQueryMode,
|
|
872
874
|
enableStopAnswerGenerationEmbed,
|
|
873
875
|
spotterChatConfig,
|
|
874
|
-
spotterAnalystConfig,
|
|
875
876
|
} = this.viewConfig;
|
|
876
877
|
|
|
877
878
|
const queryParams = this.getBaseQueryParams();
|
|
@@ -887,7 +888,6 @@ export class SpotterEmbed extends TsEmbed {
|
|
|
887
888
|
setParamIfDefined(queryParams, Param.ShowSpotterRadiance, showSpotterRadiance, true);
|
|
888
889
|
setParamIfDefined(queryParams, Param.DefaultQueryMode, defaultQueryMode);
|
|
889
890
|
setParamIfDefined(queryParams, Param.EnableStopAnswerGenerationEmbed, enableStopAnswerGenerationEmbed, true);
|
|
890
|
-
setParamIfDefined(queryParams, Param.AnalystId, spotterAnalystConfig?.analystId);
|
|
891
891
|
|
|
892
892
|
// Handle spotterChatConfig params
|
|
893
893
|
if (spotterChatConfig) {
|
|
@@ -931,7 +931,7 @@ export class SpotterEmbed extends TsEmbed {
|
|
|
931
931
|
const path = sharedConversationId
|
|
932
932
|
? `insights/conv-assist/s/${encodeURIComponent(sharedConversationId)}`
|
|
933
933
|
: 'insights/conv-assist';
|
|
934
|
-
const queryParams = this.
|
|
934
|
+
const queryParams = this.getUrlQueryParamsObject();
|
|
935
935
|
|
|
936
936
|
let query = '';
|
|
937
937
|
const queryParamsString = getQueryParamString(queryParams, true);
|
|
@@ -3,7 +3,8 @@ import { storeValueInWindow, resetValueFromWindow } from '../utils';
|
|
|
3
3
|
|
|
4
4
|
describe('embedConfig', () => {
|
|
5
5
|
beforeEach(() => {
|
|
6
|
-
// Ensure the SDK window namespace exists before resetting individual
|
|
6
|
+
// Ensure the SDK window namespace exists before resetting individual
|
|
7
|
+
// keys
|
|
7
8
|
storeValueInWindow('embedConfig', undefined);
|
|
8
9
|
resetValueFromWindow('embedConfig');
|
|
9
10
|
});
|
package/src/embed/events.spec.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
LiveboardEmbed,
|
|
10
10
|
AppEmbed,
|
|
11
11
|
HostEvent,
|
|
12
|
+
MessageCallback,
|
|
12
13
|
} from '../index';
|
|
13
14
|
import {
|
|
14
15
|
EVENT_WAIT_TIME,
|
|
@@ -139,7 +140,7 @@ describe('test communication between host app and ThoughtSpot', () => {
|
|
|
139
140
|
searchEmbed.render();
|
|
140
141
|
setTimeout(() => {
|
|
141
142
|
searchEmbed.trigger(HostEvent.Search, {
|
|
142
|
-
|
|
143
|
+
searchQuery: PAYLOAD,
|
|
143
144
|
});
|
|
144
145
|
}, EVENT_WAIT_TIME);
|
|
145
146
|
executeAfterWait(() => {
|
|
@@ -147,12 +148,23 @@ describe('test communication between host app and ThoughtSpot', () => {
|
|
|
147
148
|
|
|
148
149
|
iframe.contentWindow.addEventListener('message', (e) => {
|
|
149
150
|
expect(e.data.type).toBe(HostEvent.Search);
|
|
150
|
-
expect(e.data.data.
|
|
151
|
+
expect(e.data.data.searchQuery).toBe(PAYLOAD);
|
|
151
152
|
done();
|
|
152
153
|
});
|
|
153
154
|
});
|
|
154
155
|
});
|
|
155
156
|
|
|
157
|
+
test('accepts a MessageCallback-typed handler for typed and untyped events', () => {
|
|
158
|
+
// Guardrail: on()/off() must accept the public MessageCallback type, or
|
|
159
|
+
// existing customer handlers stop compiling (checked non-strict here).
|
|
160
|
+
const legacy: MessageCallback = jest.fn();
|
|
161
|
+
const searchEmbed = new SearchEmbed(getRootEl(), {});
|
|
162
|
+
searchEmbed.on(EmbedEvent.CustomAction, legacy); // typed event
|
|
163
|
+
searchEmbed.on(EmbedEvent.Data, legacy); // untyped event
|
|
164
|
+
searchEmbed.off(EmbedEvent.Data, legacy);
|
|
165
|
+
expect(legacy).not.toHaveBeenCalled();
|
|
166
|
+
});
|
|
167
|
+
|
|
156
168
|
test('should execute multiple event handlers if registered', async () => {
|
|
157
169
|
const handlerOne = jest.fn();
|
|
158
170
|
const handlerTwo = jest.fn();
|
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
UIPassthroughEvent,
|
|
7
7
|
UIPassthroughRequest,
|
|
8
8
|
UIPassthroughArrayResponse,
|
|
9
|
-
|
|
10
|
-
} from '
|
|
9
|
+
} from '../../contracts/ui-passthrough-contracts';
|
|
10
|
+
import { HostEventRequest } from '../../contracts/host-event-contracts';
|
|
11
11
|
import { HostEventClient } from './host-event-client';
|
|
12
12
|
|
|
13
13
|
jest.mock('../../utils/processTrigger');
|
|
@@ -979,11 +979,14 @@ describe('HostEventClient', () => {
|
|
|
979
979
|
const { client } = createHostEventClient();
|
|
980
980
|
mockProcessTrigger.mockReset();
|
|
981
981
|
|
|
982
|
-
// Flow per triggerHostEvent call when GetAvailableUIPassthroughs
|
|
983
|
-
//
|
|
984
|
-
//
|
|
985
|
-
//
|
|
986
|
-
//
|
|
982
|
+
// Flow per triggerHostEvent call when GetAvailableUIPassthroughs
|
|
983
|
+
// rejects: 1. getAvailableUIPassthroughKeys →
|
|
984
|
+
// processTrigger(UIPassthrough, GetAvailableUIPassthroughs) →
|
|
985
|
+
// rejects → returns [] 2. keys=[] so getDataWithPassthroughFallback
|
|
986
|
+
// is called → triggerUIPassthroughApi(GetAnswerSession) →
|
|
987
|
+
// processTrigger(UIPassthrough) → null → hostEventFallback called
|
|
988
|
+
// 3. hostEventFallback → processTrigger(GetAnswerSession) → legacy
|
|
989
|
+
// result
|
|
987
990
|
|
|
988
991
|
// First triggerHostEvent: 3 calls
|
|
989
992
|
mockProcessTrigger.mockRejectedValueOnce(new Error('network error')); // call 1
|
|
@@ -992,14 +995,16 @@ describe('HostEventClient', () => {
|
|
|
992
995
|
|
|
993
996
|
await client.triggerHostEvent(HostEvent.GetAnswerSession, { vizId: '1' });
|
|
994
997
|
|
|
995
|
-
// Second triggerHostEvent: cache was NOT set, so
|
|
998
|
+
// Second triggerHostEvent: cache was NOT set, so
|
|
999
|
+
// GetAvailableUIPassthroughs is retried: 3 more calls
|
|
996
1000
|
mockProcessTrigger.mockRejectedValueOnce(new Error('network error')); // call 4
|
|
997
1001
|
mockProcessTrigger.mockResolvedValueOnce(null); // call 5
|
|
998
1002
|
mockProcessTrigger.mockResolvedValueOnce({ session: 'leg2' }); // call 6
|
|
999
1003
|
|
|
1000
1004
|
await client.triggerHostEvent(HostEvent.GetAnswerSession, { vizId: '2' });
|
|
1001
1005
|
|
|
1002
|
-
// 6 total calls: GetAvailableUIPassthroughs was called TWICE
|
|
1006
|
+
// 6 total calls: GetAvailableUIPassthroughs was called TWICE
|
|
1007
|
+
// (cache not set after catch)
|
|
1003
1008
|
expect(mockProcessTrigger).toHaveBeenCalledTimes(6);
|
|
1004
1009
|
const availableCallsCount = mockProcessTrigger.mock.calls.filter(
|
|
1005
1010
|
(call) => call[3]?.type === UIPassthroughEvent.GetAvailableUIPassthroughs,
|
|
@@ -1175,7 +1180,8 @@ describe('HostEventClient', () => {
|
|
|
1175
1180
|
{ numberOfTabs: number; orderedTabIds: string[] }
|
|
1176
1181
|
> = true;
|
|
1177
1182
|
const probeUnknownField = (r: TabsResponse) =>
|
|
1178
|
-
// @ts-expect-error — field not on the GetTabs contract (was
|
|
1183
|
+
// @ts-expect-error — field not on the GetTabs contract (was
|
|
1184
|
+
// silent when `any`)
|
|
1179
1185
|
r.tabCount;
|
|
1180
1186
|
void probeUnknownField;
|
|
1181
1187
|
|
|
@@ -3,6 +3,7 @@ import { processTrigger as processTriggerService } from '../../utils/processTrig
|
|
|
3
3
|
import { getEmbedConfig } from '../embedConfig';
|
|
4
4
|
import {
|
|
5
5
|
isValidUpdateFiltersPayload,
|
|
6
|
+
resolveUpdateFiltersAliases,
|
|
6
7
|
isValidUpdateParametersPayload,
|
|
7
8
|
isValidDrillDownPayload,
|
|
8
9
|
throwUpdateFiltersValidationError,
|
|
@@ -12,18 +13,23 @@ import {
|
|
|
12
13
|
import {
|
|
13
14
|
UIPassthroughArrayResponse,
|
|
14
15
|
UIPassthroughEvent,
|
|
15
|
-
HostEventRequest,
|
|
16
|
-
HostEventResponse,
|
|
17
16
|
UIPassthroughRequest,
|
|
18
17
|
UIPassthroughResponse,
|
|
18
|
+
} from '../../contracts/ui-passthrough-contracts';
|
|
19
|
+
// Contract resolution from the shared contracts module — see
|
|
20
|
+
// src/contracts/host-event-contracts.ts (single source of truth).
|
|
21
|
+
import {
|
|
22
|
+
HostEventRequest,
|
|
23
|
+
HostEventResponse,
|
|
19
24
|
TriggerPayload,
|
|
20
25
|
TriggerResponse,
|
|
21
|
-
} from '
|
|
26
|
+
} from '../../contracts/host-event-contracts';
|
|
22
27
|
|
|
23
28
|
/**
|
|
24
29
|
* Maps HostEvent to its corresponding UIPassthroughEvent.
|
|
25
30
|
* Includes both custom-handler events (Pin, SaveAnswer, UpdateFilters, DrillDown)
|
|
26
|
-
* and getter events (GetAnswerSession, GetFilters, etc.) that use
|
|
31
|
+
* and getter events (GetAnswerSession, GetFilters, etc.) that use
|
|
32
|
+
* getDataWithPassthroughFallback.
|
|
27
33
|
*/
|
|
28
34
|
const PASSTHROUGH_MAP: Partial<Record<HostEvent, UIPassthroughEvent>> = {
|
|
29
35
|
// Custom handlers (setters with special logic)
|
|
@@ -244,7 +250,20 @@ export class HostEventClient {
|
|
|
244
250
|
throwUpdateFiltersValidationError();
|
|
245
251
|
}
|
|
246
252
|
|
|
247
|
-
|
|
253
|
+
// The shared contract accepts both current (columnName/operator) and
|
|
254
|
+
// legacy (column/oper) filter field names, but only the legacy pair is
|
|
255
|
+
// understood downstream, so the payload is rewritten before it is
|
|
256
|
+
// forwarded — otherwise a columnName/operator filter passes validation
|
|
257
|
+
// here and is then silently ignored by the app. The cast bridges the
|
|
258
|
+
// UIPassthrough FilterUpdate type, which still declares only the legacy
|
|
259
|
+
// names.
|
|
260
|
+
const resolvedPayload = resolveUpdateFiltersAliases(payload);
|
|
261
|
+
|
|
262
|
+
return this.handleHostEventWithParam(
|
|
263
|
+
UIPassthroughEvent.UpdateFilters,
|
|
264
|
+
resolvedPayload as UIPassthroughRequest<UIPassthroughEvent.UpdateFilters>,
|
|
265
|
+
context as ContextType,
|
|
266
|
+
);
|
|
248
267
|
}
|
|
249
268
|
|
|
250
269
|
protected handleUpdateParametersEvent(
|
|
@@ -255,7 +274,8 @@ export class HostEventClient {
|
|
|
255
274
|
throwUpdateParametersValidationError();
|
|
256
275
|
}
|
|
257
276
|
|
|
258
|
-
// UpdateParameters has no UI passthrough contract; dispatch over the
|
|
277
|
+
// UpdateParameters has no UI passthrough contract; dispatch over the
|
|
278
|
+
// legacy channel
|
|
259
279
|
return this.hostEventFallback(HostEvent.UpdateParameters, payload, context);
|
|
260
280
|
}
|
|
261
281
|
|
|
@@ -272,8 +292,8 @@ export class HostEventClient {
|
|
|
272
292
|
|
|
273
293
|
/**
|
|
274
294
|
* Dispatches a host event using the appropriate channel:
|
|
275
|
-
* 1. If the embedded app supports UI passthrough for this event, use it (custom
|
|
276
|
-
* 2. Otherwise fall back to the legacy host event channel.
|
|
295
|
+
* 1. If the embedded app supports UI passthrough for this event, use it (custom
|
|
296
|
+
* handler or getter). 2. Otherwise fall back to the legacy host event channel.
|
|
277
297
|
*
|
|
278
298
|
* @param hostEvent - The host event to trigger
|
|
279
299
|
* @param payload - Optional payload for the event
|
|
@@ -287,11 +307,12 @@ export class HostEventClient {
|
|
|
287
307
|
hostEvent: HostEventT,
|
|
288
308
|
payload?: TriggerPayload<PayloadT, HostEventT>,
|
|
289
309
|
context?: ContextT,
|
|
290
|
-
): Promise<TriggerResponse<PayloadT, HostEventT,
|
|
310
|
+
): Promise<TriggerResponse<PayloadT, HostEventT, ContextT>> {
|
|
291
311
|
const customHandler = this.customHandlers[hostEvent];
|
|
292
312
|
const passthroughEvent = PASSTHROUGH_MAP[hostEvent];
|
|
293
313
|
|
|
294
|
-
// If embedded app supports passthrough but not this event, use legacy
|
|
314
|
+
// If embedded app supports passthrough but not this event, use legacy
|
|
315
|
+
// channel
|
|
295
316
|
const keys = passthroughEvent ? await this.getAvailableUIPassthroughKeys(context as ContextType) : [];
|
|
296
317
|
if (passthroughEvent && keys.length > 0 && !keys.includes(passthroughEvent)) {
|
|
297
318
|
return this.hostEventFallback(hostEvent, payload, context) as any;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isValidUpdateFiltersPayload,
|
|
3
|
+
resolveUpdateFiltersAliases,
|
|
3
4
|
isValidUpdateParametersPayload,
|
|
4
5
|
isValidDrillDownPayload,
|
|
5
6
|
createValidationError,
|
|
@@ -7,6 +8,7 @@ import {
|
|
|
7
8
|
throwUpdateParametersValidationError,
|
|
8
9
|
throwDrillDownValidationError,
|
|
9
10
|
} from './utils';
|
|
11
|
+
import { HostFilterUpdate as FilterUpdate } from '../../contracts/host-event-contracts';
|
|
10
12
|
import { ERROR_MESSAGE } from '../../errors';
|
|
11
13
|
import { EmbedEvent } from '../../types';
|
|
12
14
|
import { embedEventStatus } from '../../utils';
|
|
@@ -426,4 +428,177 @@ describe('hostEventClient utils', () => {
|
|
|
426
428
|
.toThrow(ERROR_MESSAGE.DRILLDOWN_INVALID_PAYLOAD);
|
|
427
429
|
});
|
|
428
430
|
});
|
|
429
|
-
|
|
431
|
+
// =========================
|
|
432
|
+
// FilterUpdate type shape
|
|
433
|
+
// =========================
|
|
434
|
+
// The @ts-expect-error assertions below are enforced by tsc: an unused one
|
|
435
|
+
// is itself an error, so re-loosening the type fails the build.
|
|
436
|
+
describe('FilterUpdate type', () => {
|
|
437
|
+
it('accepts the documented columnName/operator spelling', () => {
|
|
438
|
+
const filter: FilterUpdate = { columnName: 'region', operator: 'EQ', values: ['west'] };
|
|
439
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
it('still accepts the deprecated column/oper aliases', () => {
|
|
443
|
+
const filter: FilterUpdate = { column: 'region', oper: 'EQ', values: ['west'] };
|
|
444
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
it('accepts a mix of documented and deprecated spellings', () => {
|
|
448
|
+
const filter: FilterUpdate = { columnName: 'region', oper: 'EQ', values: ['west'] };
|
|
449
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
it('accepts a worksheet-qualified column name', () => {
|
|
453
|
+
const filter: FilterUpdate = {
|
|
454
|
+
columnName: '(Sample) Retail - Apparel::city',
|
|
455
|
+
operator: 'IN',
|
|
456
|
+
values: ['atlanta'],
|
|
457
|
+
};
|
|
458
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
it('rejects a filter with no column at compile time and at runtime', () => {
|
|
462
|
+
// @ts-expect-error one of columnName/column is required
|
|
463
|
+
const filter: FilterUpdate = { operator: 'EQ', values: ['west'] };
|
|
464
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(false);
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
it('rejects a filter with no operator at compile time and at runtime', () => {
|
|
468
|
+
// @ts-expect-error one of operator/oper is required
|
|
469
|
+
const filter: FilterUpdate = { columnName: 'region', values: ['west'] };
|
|
470
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(false);
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
it('rejects both column spellings at compile time', () => {
|
|
474
|
+
// @ts-expect-error columnName and column are mutually exclusive
|
|
475
|
+
const filter: FilterUpdate = {
|
|
476
|
+
columnName: 'region', column: 'region', operator: 'EQ', values: ['west'],
|
|
477
|
+
};
|
|
478
|
+
// The runtime validator is laxer than the type - it reads whichever
|
|
479
|
+
// spelling is present - so this still passes at runtime. The point
|
|
480
|
+
// of the type is to stop the ambiguity reaching it.
|
|
481
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
it('rejects both operator spellings at compile time', () => {
|
|
485
|
+
// @ts-expect-error operator and oper are mutually exclusive
|
|
486
|
+
const filter: FilterUpdate = {
|
|
487
|
+
columnName: 'region', operator: 'EQ', oper: 'EQ', values: ['west'],
|
|
488
|
+
};
|
|
489
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
// The fields SCAL-325540 added to the host-event contract have to keep
|
|
493
|
+
// working alongside the exclusive alias pairs - the union must widen
|
|
494
|
+
// the column and operator halves only, and leave the rest of the
|
|
495
|
+
// filter shape alone.
|
|
496
|
+
it('accepts the fields added by the host-event contract', () => {
|
|
497
|
+
const filter: FilterUpdate = {
|
|
498
|
+
columnName: 'date',
|
|
499
|
+
columnId: 'col-guid',
|
|
500
|
+
operator: 'EQ',
|
|
501
|
+
values: ['2023-07-31'],
|
|
502
|
+
type: 'EXACT_DATE',
|
|
503
|
+
datePeriod: 'DAY',
|
|
504
|
+
negate: true,
|
|
505
|
+
applicability: { level: 'TAB', targetId: 'tab-guid' },
|
|
506
|
+
};
|
|
507
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
it('accepts non-string values alongside the documented spelling', () => {
|
|
511
|
+
const filter: FilterUpdate = {
|
|
512
|
+
columnName: 'quantity', operator: 'GE', values: [5, true],
|
|
513
|
+
};
|
|
514
|
+
expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
it('accepts the request-level scoping fields', () => {
|
|
518
|
+
const payload = {
|
|
519
|
+
filters: [{ columnName: 'region', operator: 'IN', values: ['west'] }],
|
|
520
|
+
visualizationId: 'viz-guid',
|
|
521
|
+
liveboardId: 'lb-guid',
|
|
522
|
+
};
|
|
523
|
+
expect(isValidUpdateFiltersPayload(payload)).toBe(true);
|
|
524
|
+
});
|
|
525
|
+
});
|
|
526
|
+
describe('resolveUpdateFiltersAliases', () => {
|
|
527
|
+
it('rewrites columnName/operator to column/oper on a single filter', () => {
|
|
528
|
+
const out = resolveUpdateFiltersAliases({
|
|
529
|
+
filter: { columnName: 'region', operator: 'EQ', values: ['west'] },
|
|
530
|
+
} as any);
|
|
531
|
+
|
|
532
|
+
expect(out.filter).toEqual({ column: 'region', oper: 'EQ', values: ['west'] });
|
|
533
|
+
expect(out.filter).not.toHaveProperty('columnName');
|
|
534
|
+
expect(out.filter).not.toHaveProperty('operator');
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
it('rewrites every entry in a filters array', () => {
|
|
538
|
+
const out = resolveUpdateFiltersAliases({
|
|
539
|
+
filters: [
|
|
540
|
+
{ columnName: 'region', operator: 'EQ', values: ['west'] },
|
|
541
|
+
{ columnName: 'item type', operator: 'IN', values: ['bags'] },
|
|
542
|
+
],
|
|
543
|
+
} as any);
|
|
544
|
+
|
|
545
|
+
expect(out.filters).toEqual([
|
|
546
|
+
{ column: 'region', oper: 'EQ', values: ['west'] },
|
|
547
|
+
{ column: 'item type', oper: 'IN', values: ['bags'] },
|
|
548
|
+
]);
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
it('leaves a payload that already uses column/oper untouched', () => {
|
|
552
|
+
const payload = { filter: { column: 'region', oper: 'EQ', values: ['west'] } } as any;
|
|
553
|
+
|
|
554
|
+
expect(resolveUpdateFiltersAliases(payload)).toEqual(payload);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
it('prefers columnName/operator when both spellings are present', () => {
|
|
558
|
+
const out = resolveUpdateFiltersAliases({
|
|
559
|
+
filter: {
|
|
560
|
+
column: 'from-column', columnName: 'from-columnName',
|
|
561
|
+
oper: 'EQ', operator: 'IN',
|
|
562
|
+
values: ['x'],
|
|
563
|
+
},
|
|
564
|
+
} as any);
|
|
565
|
+
|
|
566
|
+
// The value survives under the wire name, but it is the documented
|
|
567
|
+
// spelling's value that survives.
|
|
568
|
+
expect(out.filter).toEqual({ column: 'from-columnName', oper: 'IN', values: ['x'] });
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
it('preserves the other filter fields, including applicability', () => {
|
|
572
|
+
const out = resolveUpdateFiltersAliases({
|
|
573
|
+
filter: {
|
|
574
|
+
columnName: 'date',
|
|
575
|
+
operator: 'EQ',
|
|
576
|
+
values: [1700000000],
|
|
577
|
+
type: 'EXACT_DATE',
|
|
578
|
+
applicability: { level: 'TAB', targetId: 'tab-guid' },
|
|
579
|
+
},
|
|
580
|
+
} as any);
|
|
581
|
+
|
|
582
|
+
expect(out.filter).toEqual({
|
|
583
|
+
column: 'date',
|
|
584
|
+
oper: 'EQ',
|
|
585
|
+
values: [1700000000],
|
|
586
|
+
type: 'EXACT_DATE',
|
|
587
|
+
applicability: { level: 'TAB', targetId: 'tab-guid' },
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
it('produces a payload that still passes validation', () => {
|
|
592
|
+
const out = resolveUpdateFiltersAliases({
|
|
593
|
+
filters: [{ columnName: 'region', operator: 'EQ', values: ['west'] }],
|
|
594
|
+
} as any);
|
|
595
|
+
|
|
596
|
+
expect(isValidUpdateFiltersPayload(out as any)).toBe(true);
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
it('is a no-op on a non-object payload', () => {
|
|
600
|
+
expect(resolveUpdateFiltersAliases(undefined as any)).toBeUndefined();
|
|
601
|
+
expect(resolveUpdateFiltersAliases(null as any)).toBeNull();
|
|
602
|
+
});
|
|
603
|
+
});
|
|
604
|
+
});
|
|
@@ -4,12 +4,14 @@ import isString from 'lodash/isString';
|
|
|
4
4
|
import isUndefined from 'lodash/isUndefined';
|
|
5
5
|
import { EmbedErrorCodes, EmbedEvent, ErrorDetailsTypes, HostEvent } from '../../types';
|
|
6
6
|
import { ERROR_MESSAGE } from '../../errors';
|
|
7
|
-
import { ApplicabilityLevel
|
|
7
|
+
import { ApplicabilityLevel } from '../../contracts/ui-passthrough-contracts';
|
|
8
|
+
import { HostEventRequest } from '../../contracts/host-event-contracts';
|
|
8
9
|
import { embedEventStatus } from '../../utils';
|
|
9
10
|
|
|
10
11
|
const isValidApplicability = (a?: { level?: string; targetId?: string }) => {
|
|
11
12
|
if (isUndefined(a)) return true;
|
|
12
|
-
// targetId is not required at LIVEBOARD level, since the filter applies to
|
|
13
|
+
// targetId is not required at LIVEBOARD level, since the filter applies to
|
|
14
|
+
// the whole Liveboard
|
|
13
15
|
return isPlainObject(a)
|
|
14
16
|
&& Object.values(ApplicabilityLevel).includes(a.level as ApplicabilityLevel)
|
|
15
17
|
&& (a.level === ApplicabilityLevel.Liveboard || (isString(a.targetId) && a.targetId.trim().length > 0));
|
|
@@ -43,8 +45,56 @@ export function isValidUpdateFiltersPayload(
|
|
|
43
45
|
return !!(hasValidFilter || hasValidFilters);
|
|
44
46
|
}
|
|
45
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Rewrites one filter's `columnName`/`operator` to `column`/`oper`.
|
|
50
|
+
*
|
|
51
|
+
* Callers may use either spelling: `columnName`/`operator` match
|
|
52
|
+
* {@link RuntimeFilter} and the `EmbedEvent.FilterChanged` payload, so a
|
|
53
|
+
* converted payload can be replayed as-is. But the payload is forwarded to the
|
|
54
|
+
* embedded app unchanged, and only `column`/`oper` are known to be understood
|
|
55
|
+
* there - so the alias must be swapped here, or it would pass validation and
|
|
56
|
+
* then be silently ignored.
|
|
57
|
+
*
|
|
58
|
+
* If a caller supplies both spellings of a field - which TypeScript rejects,
|
|
59
|
+
* but JavaScript callers can still do - the documented `columnName`/`operator`
|
|
60
|
+
* wins. Deferring to the deprecated spelling would quietly discard the value
|
|
61
|
+
* the rest of the SDK tells people to use.
|
|
62
|
+
* @param filter One entry from the UpdateFilters payload.
|
|
63
|
+
*/
|
|
64
|
+
function resolveFilterAliases<T extends { column?: string; columnName?: string; oper?: string; operator?: string }>(
|
|
65
|
+
filter: T,
|
|
66
|
+
): T {
|
|
67
|
+
if (!isPlainObject(filter)) return filter;
|
|
68
|
+
|
|
69
|
+
const column = filter.columnName ?? filter.column;
|
|
70
|
+
const oper = filter.operator ?? filter.oper;
|
|
71
|
+
const { columnName, operator, ...rest } = filter;
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
...rest,
|
|
75
|
+
...(isUndefined(column) ? {} : { column }),
|
|
76
|
+
...(isUndefined(oper) ? {} : { oper }),
|
|
77
|
+
} as T;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Rewrites every filter in an UpdateFilters payload to use `column`/`oper`,
|
|
82
|
+
* whichever spelling the caller supplied. Call after validation.
|
|
83
|
+
* @param payload The UpdateFilters host event payload.
|
|
84
|
+
*/
|
|
85
|
+
export function resolveUpdateFiltersAliases<T extends { filter?: any; filters?: any[] }>(payload: T): T {
|
|
86
|
+
if (!isPlainObject(payload)) return payload;
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
...payload,
|
|
90
|
+
...(payload.filter ? { filter: resolveFilterAliases(payload.filter) } : {}),
|
|
91
|
+
...(Array.isArray(payload.filters) ? { filters: payload.filters.map(resolveFilterAliases) } : {}),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
46
95
|
export function isValidUpdateParametersPayload(payload: unknown): boolean {
|
|
47
|
-
// Only validates the applicability of each parameter (null treated as
|
|
96
|
+
// Only validates the applicability of each parameter (null treated as
|
|
97
|
+
// absent); the rest is forwarded as-is for backward compatibility.
|
|
48
98
|
if (!Array.isArray(payload)) return true;
|
|
49
99
|
return payload.every((p) => {
|
|
50
100
|
if (!isPlainObject(p)) return true;
|