@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
|
@@ -2,7 +2,7 @@ import { resetValueFromWindow } from '../utils';
|
|
|
2
2
|
import { ERROR_MESSAGE } from '../errors';
|
|
3
3
|
import { resetCachedAuthToken } from '../authToken';
|
|
4
4
|
import { AuthType, init, EmbedEvent, SearchEmbed, PinboardEmbed, AppEmbed, LiveboardEmbed, AnswerService, SpotterEmbed, } from '../index';
|
|
5
|
-
import { Action, HomeLeftNavItem, RuntimeFilterOp, HomepageModule, HostEvent, ContextMenuTriggerOptions, CustomActionTarget, CustomActionsPosition, ErrorDetailsTypes, EmbedErrorCodes, EmbedErrorSeverity, } from '../types';
|
|
5
|
+
import { Action, HomeLeftNavItem, RuntimeFilterOp, HomepageModule, HostEvent, Param, ContextMenuTriggerOptions, CustomActionTarget, CustomActionsPosition, ErrorDetailsTypes, EmbedErrorCodes, EmbedErrorSeverity, } from '../types';
|
|
6
6
|
import { executeAfterWait, getDocumentBody, getIFrameEl, getIFrameSrc, getRootEl, postMessageToParent, defaultParamsForPinboardEmbed, waitFor, expectUrlMatchesWithParams, expectUrlToHaveParamsWithValues, mockMessageChannel, createRootEleForEmbed, fixedEncodeURI, } from '../test/test-utils';
|
|
7
7
|
import * as config from '../config';
|
|
8
8
|
import * as embedConfig from './embedConfig';
|
|
@@ -16,7 +16,7 @@ import { logger } from '../utils/logger';
|
|
|
16
16
|
import { version } from '../../package.json';
|
|
17
17
|
import { HiddenActionItemByDefaultForSearchEmbed } from './search';
|
|
18
18
|
import { processTrigger } from '../utils/processTrigger';
|
|
19
|
-
import { UIPassthroughEvent } from '
|
|
19
|
+
import { UIPassthroughEvent } from '../contracts/ui-passthrough-contracts';
|
|
20
20
|
import * as sessionInfoService from '../utils/sessionInfoService';
|
|
21
21
|
import * as authToken from '../authToken';
|
|
22
22
|
import * as apiIntercept from '../api-intercept';
|
|
@@ -164,6 +164,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
164
164
|
liveboardEmbed.render();
|
|
165
165
|
mockProcessTrigger.mockResolvedValue({ session: 'test' });
|
|
166
166
|
await executeAfterWait(async () => {
|
|
167
|
+
// `false` is a deliberately off-contract payload here — this
|
|
168
|
+
// asserts raw passthrough to processTrigger, not a real Save
|
|
169
|
+
// payload — so it is cast past the typed `data` parameter.
|
|
167
170
|
await liveboardEmbed.trigger(HostEvent.Save, false);
|
|
168
171
|
expect(mockProcessTrigger).toHaveBeenCalledWith(getIFrameEl(), HostEvent.Save, 'http://tshost', false, undefined);
|
|
169
172
|
});
|
|
@@ -2439,8 +2442,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2439
2442
|
libEmbed.destroy();
|
|
2440
2443
|
// Reverts to the exact value the container had before.
|
|
2441
2444
|
expect(customContainer.style.position).toBe('static');
|
|
2442
|
-
// The custom container reference is dropped (back to the
|
|
2443
|
-
// body) so a destroyed embed does not pin the (possibly
|
|
2445
|
+
// The custom container reference is dropped (back to the
|
|
2446
|
+
// default body) so a destroyed embed does not pin the (possibly
|
|
2444
2447
|
// detached) element in memory.
|
|
2445
2448
|
expect(libEmbed.preRenderContainerEl).toBe(document.body);
|
|
2446
2449
|
customContainer.remove();
|
|
@@ -2481,8 +2484,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2481
2484
|
await libEmbed.preRender();
|
|
2482
2485
|
expect(libEmbed.preRenderContainerEl).toBe(document.body);
|
|
2483
2486
|
libEmbed.destroy();
|
|
2484
|
-
// The body sentinel must never be treated as a custom
|
|
2485
|
-
// no position override to apply and none to restore.
|
|
2487
|
+
// The body sentinel must never be treated as a custom
|
|
2488
|
+
// container: no position override to apply and none to restore.
|
|
2486
2489
|
expect(document.body.style.position).toBe(originalBodyPosition);
|
|
2487
2490
|
expect(document.body.dataset.tsEmbedOriginalPosition).toBeUndefined();
|
|
2488
2491
|
});
|
|
@@ -2593,10 +2596,11 @@ describe('Unit test case for ts embed', () => {
|
|
|
2593
2596
|
newContainer.style.position = 'static';
|
|
2594
2597
|
document.body.appendChild(newContainer);
|
|
2595
2598
|
libEmbed.syncPreRenderStyle();
|
|
2596
|
-
// applyPreRenderContainerPositioning() reads
|
|
2597
|
-
// instead of taking the container as an
|
|
2598
|
-
// to assign the field before calling
|
|
2599
|
-
// lands on the detached node and
|
|
2599
|
+
// applyPreRenderContainerPositioning() reads
|
|
2600
|
+
// preRenderContainerEl instead of taking the container as an
|
|
2601
|
+
// argument, so reconcile has to assign the field before calling
|
|
2602
|
+
// it — otherwise the override lands on the detached node and
|
|
2603
|
+
// the fresh one stays static.
|
|
2600
2604
|
expect(libEmbed.preRenderContainerEl).toBe(newContainer);
|
|
2601
2605
|
expect(newContainer.style.position).toBe('relative');
|
|
2602
2606
|
expect(newContainer.dataset.tsEmbedOriginalPosition).toBe('static');
|
|
@@ -2701,7 +2705,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2701
2705
|
});
|
|
2702
2706
|
await firstEmbed.preRender();
|
|
2703
2707
|
await waitFor(() => !!getIFrameEl());
|
|
2704
|
-
// Reset position to static so the connecting embed also
|
|
2708
|
+
// Reset position to static so the connecting embed also
|
|
2709
|
+
// triggers the guard.
|
|
2705
2710
|
customContainer.style.position = 'static';
|
|
2706
2711
|
delete customContainer.dataset['preRenderContainerOriginalPosition'];
|
|
2707
2712
|
const connectingEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
@@ -2782,8 +2787,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2782
2787
|
});
|
|
2783
2788
|
await firstEmbed.preRender();
|
|
2784
2789
|
await waitFor(() => !!getIFrameEl());
|
|
2785
|
-
// Same config on both components — the value is redundant
|
|
2786
|
-
// not wrong, so nagging about it would be noise.
|
|
2790
|
+
// Same config on both components — the value is redundant
|
|
2791
|
+
// but not wrong, so nagging about it would be noise.
|
|
2787
2792
|
const connectingEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
2788
2793
|
preRenderId: 'connect-same-element',
|
|
2789
2794
|
liveboardId: 'myLiveboardId',
|
|
@@ -2809,8 +2814,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
2809
2814
|
});
|
|
2810
2815
|
await firstEmbed.preRender();
|
|
2811
2816
|
await waitFor(() => !!getIFrameEl());
|
|
2812
|
-
// A selector that resolves to the owner's element is the
|
|
2813
|
-
// container, so the comparison must be by resolved
|
|
2817
|
+
// A selector that resolves to the owner's element is the
|
|
2818
|
+
// same container, so the comparison must be by resolved
|
|
2819
|
+
// node.
|
|
2814
2820
|
const connectingEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
2815
2821
|
preRenderId: 'connect-same-selector',
|
|
2816
2822
|
liveboardId: 'myLiveboardId',
|
|
@@ -2860,8 +2866,8 @@ describe('Unit test case for ts embed', () => {
|
|
|
2860
2866
|
await firstEmbed.preRender();
|
|
2861
2867
|
await waitFor(() => !!getIFrameEl());
|
|
2862
2868
|
// Simulate a wrapper with no live embed behind it: the
|
|
2863
|
-
// __tsEmbed stamp used to locate the owner is gone, so
|
|
2864
|
-
// is no container to inherit.
|
|
2869
|
+
// __tsEmbed stamp used to locate the owner is gone, so
|
|
2870
|
+
// there is no container to inherit.
|
|
2865
2871
|
const wrapper = document.getElementById(firstEmbed.getPreRenderIds().wrapper);
|
|
2866
2872
|
delete wrapper.__tsEmbed;
|
|
2867
2873
|
const connectingEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
@@ -3565,7 +3571,9 @@ describe('Unit test case for ts embed', () => {
|
|
|
3565
3571
|
});
|
|
3566
3572
|
test('should return getPreRenderObj and log if same object', () => {
|
|
3567
3573
|
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3568
|
-
|
|
3574
|
+
// debug, not info: the wrapper points at the embed being shown, so
|
|
3575
|
+
// this is now the common case rather than a rare diagnostic.
|
|
3576
|
+
const loggerSpy = jest.spyOn(logger, 'debug');
|
|
3569
3577
|
// getPreRenderObj reads the embed reference from preRenderWrapper
|
|
3570
3578
|
searchEmbed.preRenderWrapper = {
|
|
3571
3579
|
[searchEmbed['embedNodeKey']]: searchEmbed,
|
|
@@ -4267,16 +4275,6 @@ describe('Additional Coverage Tests', () => {
|
|
|
4267
4275
|
expect(getIFrameEl().style.height).toBe('500px');
|
|
4268
4276
|
});
|
|
4269
4277
|
});
|
|
4270
|
-
test('should test getIframeCenter calculation', async () => {
|
|
4271
|
-
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
4272
|
-
await searchEmbed.render();
|
|
4273
|
-
await executeAfterWait(() => {
|
|
4274
|
-
const center = searchEmbed['getIframeCenter']();
|
|
4275
|
-
expect(center).toHaveProperty('iframeCenter');
|
|
4276
|
-
expect(center).toHaveProperty('iframeHeight');
|
|
4277
|
-
expect(center).toHaveProperty('viewPortHeight');
|
|
4278
|
-
});
|
|
4279
|
-
});
|
|
4280
4278
|
test('should handle preRender with replaceExistingPreRender=true', async () => {
|
|
4281
4279
|
createRootEleForEmbed();
|
|
4282
4280
|
const embed1 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
@@ -4347,11 +4345,13 @@ describe('Trigger method edge cases', () => {
|
|
|
4347
4345
|
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
4348
4346
|
const handleErrorSpy = jest.spyOn(searchEmbed, 'handleError').mockImplementation(() => { });
|
|
4349
4347
|
await searchEmbed.render();
|
|
4350
|
-
// First processTrigger call is getAvailableUIPassthroughKeys for
|
|
4348
|
+
// First processTrigger call is getAvailableUIPassthroughKeys for
|
|
4349
|
+
// DrillDown
|
|
4351
4350
|
mockProcessTrigger.mockResolvedValueOnce([
|
|
4352
4351
|
{ value: { keys: Object.values(UIPassthroughEvent) } },
|
|
4353
4352
|
]);
|
|
4354
|
-
// DrillDown with no points → throwDrillDownValidationError →
|
|
4353
|
+
// DrillDown with no points → throwDrillDownValidationError →
|
|
4354
|
+
// isValidationError=true
|
|
4355
4355
|
await expect(searchEmbed.trigger(HostEvent.DrillDown, {})).rejects.toThrow('DrillDown requires a valid points object');
|
|
4356
4356
|
expect(handleErrorSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
4357
4357
|
data: expect.objectContaining({ code: EmbedErrorCodes.HOST_EVENT_VALIDATION }),
|
|
@@ -4479,7 +4479,8 @@ describe('Fullscreen change handler behavior', () => {
|
|
|
4479
4479
|
init({
|
|
4480
4480
|
thoughtSpotHost: 'tshost',
|
|
4481
4481
|
authType: AuthType.None,
|
|
4482
|
-
// disableFullscreenPresentation not set → defaults to true via ??
|
|
4482
|
+
// disableFullscreenPresentation not set → defaults to true via ??
|
|
4483
|
+
// true
|
|
4483
4484
|
});
|
|
4484
4485
|
const embed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
4485
4486
|
const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
|
|
@@ -4497,7 +4498,8 @@ describe('Fullscreen change handler behavior', () => {
|
|
|
4497
4498
|
const loggerDebugSpy = jest.spyOn(logger, 'debug').mockImplementation(() => { });
|
|
4498
4499
|
const triggerSpy = jest.spyOn(embed, 'trigger').mockImplementation(() => Promise.resolve(null));
|
|
4499
4500
|
embed['setupFullscreenChangeHandler']();
|
|
4500
|
-
// Capture the registered handler directly instead of dispatching to
|
|
4501
|
+
// Capture the registered handler directly instead of dispatching to
|
|
4502
|
+
// document
|
|
4501
4503
|
const fullscreenCall = addEventListenerSpy.mock.calls.find((c) => c[0] === 'fullscreenchange');
|
|
4502
4504
|
expect(fullscreenCall).toBeTruthy();
|
|
4503
4505
|
const handler = fullscreenCall[1];
|
|
@@ -4576,7 +4578,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4576
4578
|
});
|
|
4577
4579
|
embed2.showPreRender();
|
|
4578
4580
|
await executeAfterWait(() => {
|
|
4579
|
-
|
|
4581
|
+
// Not LastCalledWith: LiveboardEmbed fires Navigate after this.
|
|
4582
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4580
4583
|
liveboardId: 'original-lb',
|
|
4581
4584
|
visibleVizs: ['viz-1'],
|
|
4582
4585
|
runtimeFilters: [
|
|
@@ -4619,7 +4622,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4619
4622
|
});
|
|
4620
4623
|
embed2.showPreRender();
|
|
4621
4624
|
await executeAfterWait(() => {
|
|
4622
|
-
|
|
4625
|
+
// Not LastCalledWith: LiveboardEmbed fires Navigate after this.
|
|
4626
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4623
4627
|
liveboardId: 'original-lb',
|
|
4624
4628
|
visibleVizs: ['viz-1', 'viz-2'],
|
|
4625
4629
|
runtimeFilters: [
|
|
@@ -4632,6 +4636,317 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4632
4636
|
}), undefined);
|
|
4633
4637
|
});
|
|
4634
4638
|
});
|
|
4639
|
+
test('should carry the new config filters in UpdateEmbedParams', async () => {
|
|
4640
|
+
await setupPreRenderTest('params-new-filters', { liveboardId: 'original-lb' });
|
|
4641
|
+
const runtimeFilters = [
|
|
4642
|
+
{
|
|
4643
|
+
columnName: 'Color',
|
|
4644
|
+
operator: RuntimeFilterOp.IN,
|
|
4645
|
+
values: ['red', 'blue'],
|
|
4646
|
+
},
|
|
4647
|
+
];
|
|
4648
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4649
|
+
preRenderId: 'params-new-filters',
|
|
4650
|
+
liveboardId: 'original-lb',
|
|
4651
|
+
runtimeFilters,
|
|
4652
|
+
});
|
|
4653
|
+
embed2.showPreRender();
|
|
4654
|
+
await executeAfterWait(() => {
|
|
4655
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4656
|
+
runtimeFilters,
|
|
4657
|
+
// The serialized form is the one the container reads.
|
|
4658
|
+
runtimeFilterParams: 'col1=Color&op1=IN&val1=red&val1=blue',
|
|
4659
|
+
}), undefined);
|
|
4660
|
+
// Everything rides in the params payload; nothing follows it.
|
|
4661
|
+
const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === HostEvent.UpdateRuntimeFilters);
|
|
4662
|
+
expect(runtimeFilterCalls).toHaveLength(0);
|
|
4663
|
+
});
|
|
4664
|
+
});
|
|
4665
|
+
test('should serialize the filters when they are not excluded from the URL', async () => {
|
|
4666
|
+
await setupPreRenderTest('params-url-filters', { liveboardId: 'original-lb' });
|
|
4667
|
+
// With the flag off, getDefaultAppInitData leaves runtimeFilterParams
|
|
4668
|
+
// null and a URL render carries the filters in the iframe's query
|
|
4669
|
+
// string. A show cycle has no URL, so the payload has to carry them.
|
|
4670
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4671
|
+
preRenderId: 'params-url-filters',
|
|
4672
|
+
liveboardId: 'original-lb',
|
|
4673
|
+
excludeRuntimeFiltersfromURL: false,
|
|
4674
|
+
runtimeFilters: [
|
|
4675
|
+
{
|
|
4676
|
+
columnName: 'Color',
|
|
4677
|
+
operator: RuntimeFilterOp.IN,
|
|
4678
|
+
values: ['red'],
|
|
4679
|
+
},
|
|
4680
|
+
],
|
|
4681
|
+
});
|
|
4682
|
+
embed2.showPreRender();
|
|
4683
|
+
await executeAfterWait(() => {
|
|
4684
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4685
|
+
runtimeFilterParams: 'col1=Color&op1=IN&val1=red',
|
|
4686
|
+
}), undefined);
|
|
4687
|
+
});
|
|
4688
|
+
});
|
|
4689
|
+
test('should trigger Navigate only after UpdateEmbedParams has settled', async () => {
|
|
4690
|
+
await setupPreRenderTest('navigate-after-params', {
|
|
4691
|
+
liveboardId: 'original-lb',
|
|
4692
|
+
runtimeFilters: [
|
|
4693
|
+
{
|
|
4694
|
+
columnName: 'Color',
|
|
4695
|
+
operator: RuntimeFilterOp.IN,
|
|
4696
|
+
values: ['red'],
|
|
4697
|
+
},
|
|
4698
|
+
],
|
|
4699
|
+
});
|
|
4700
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4701
|
+
preRenderId: 'navigate-after-params',
|
|
4702
|
+
liveboardId: 'updated-lb',
|
|
4703
|
+
});
|
|
4704
|
+
embed2.showPreRender();
|
|
4705
|
+
// Inside the settle window the params are already out
|
|
4706
|
+
// and Navigate is not.
|
|
4707
|
+
await executeAfterWait(() => {
|
|
4708
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4709
|
+
expect(eventTypes).toContain(HostEvent.UpdateEmbedParams);
|
|
4710
|
+
expect(eventTypes).not.toContain(HostEvent.Navigate);
|
|
4711
|
+
}, 50);
|
|
4712
|
+
await executeAfterWait(() => {
|
|
4713
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4714
|
+
// A Navigate that beat the params would make the container load
|
|
4715
|
+
// `updated-lb` while still holding `original-lb`'s runtime filters,
|
|
4716
|
+
// and drop the params that then arrive mid-load (SCAL-336321).
|
|
4717
|
+
expect(eventTypes).toContain(HostEvent.Navigate);
|
|
4718
|
+
expect(eventTypes.indexOf(HostEvent.UpdateEmbedParams)).toBeLessThan(eventTypes.indexOf(HostEvent.Navigate));
|
|
4719
|
+
}, 300);
|
|
4720
|
+
});
|
|
4721
|
+
test('should mark the params empty when the config declares no filters', async () => {
|
|
4722
|
+
await setupPreRenderTest('params-clear-filters', {
|
|
4723
|
+
liveboardId: 'original-lb',
|
|
4724
|
+
runtimeFilters: [
|
|
4725
|
+
{
|
|
4726
|
+
columnName: 'Color',
|
|
4727
|
+
operator: RuntimeFilterOp.IN,
|
|
4728
|
+
values: ['red', 'blue'],
|
|
4729
|
+
},
|
|
4730
|
+
],
|
|
4731
|
+
});
|
|
4732
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4733
|
+
preRenderId: 'params-clear-filters',
|
|
4734
|
+
liveboardId: 'original-lb',
|
|
4735
|
+
});
|
|
4736
|
+
embed2.showPreRender();
|
|
4737
|
+
await executeAfterWait(() => {
|
|
4738
|
+
// Not null and not '': the container only reads this field when it
|
|
4739
|
+
// is truthy, so either would leave the previous embed's filters in
|
|
4740
|
+
// place. A lone separator passes that gate and parses to {}.
|
|
4741
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
|
|
4742
|
+
const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === HostEvent.UpdateRuntimeFilters);
|
|
4743
|
+
expect(runtimeFilterCalls).toHaveLength(0);
|
|
4744
|
+
});
|
|
4745
|
+
});
|
|
4746
|
+
test('should mark the params empty for an explicitly empty filter array', async () => {
|
|
4747
|
+
await setupPreRenderTest('params-empty-array', {
|
|
4748
|
+
liveboardId: 'original-lb',
|
|
4749
|
+
runtimeFilters: [
|
|
4750
|
+
{
|
|
4751
|
+
columnName: 'Color',
|
|
4752
|
+
operator: RuntimeFilterOp.IN,
|
|
4753
|
+
values: ['red'],
|
|
4754
|
+
},
|
|
4755
|
+
],
|
|
4756
|
+
});
|
|
4757
|
+
// `runtimeFilters: []` is the shape the customer reported as not
|
|
4758
|
+
// resetting anything.
|
|
4759
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4760
|
+
preRenderId: 'params-empty-array',
|
|
4761
|
+
liveboardId: 'original-lb',
|
|
4762
|
+
runtimeFilters: [],
|
|
4763
|
+
});
|
|
4764
|
+
embed2.showPreRender();
|
|
4765
|
+
await executeAfterWait(() => {
|
|
4766
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
|
|
4767
|
+
});
|
|
4768
|
+
});
|
|
4769
|
+
test('should mark the params empty when no config in the chain has filters', async () => {
|
|
4770
|
+
await setupPreRenderTest('params-no-filters', { liveboardId: 'original-lb' });
|
|
4771
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4772
|
+
preRenderId: 'params-no-filters',
|
|
4773
|
+
liveboardId: 'updated-lb',
|
|
4774
|
+
});
|
|
4775
|
+
embed2.showPreRender();
|
|
4776
|
+
await executeAfterWait(() => {
|
|
4777
|
+
const paramsCall = mockProcessTrigger.mock.calls.find((call) => call[1] === HostEvent.UpdateEmbedParams);
|
|
4778
|
+
expect(paramsCall === null || paramsCall === void 0 ? void 0 : paramsCall[3]).not.toHaveProperty('runtimeFilters');
|
|
4779
|
+
expect(paramsCall === null || paramsCall === void 0 ? void 0 : paramsCall[3].runtimeFilterParams).toBe('&');
|
|
4780
|
+
});
|
|
4781
|
+
});
|
|
4782
|
+
test('should state each embed filters as the pre-render is handed along', async () => {
|
|
4783
|
+
await setupPreRenderTest('params-chain', {
|
|
4784
|
+
liveboardId: 'original-lb',
|
|
4785
|
+
runtimeFilters: [
|
|
4786
|
+
{
|
|
4787
|
+
columnName: 'Color',
|
|
4788
|
+
operator: RuntimeFilterOp.IN,
|
|
4789
|
+
values: ['red', 'blue'],
|
|
4790
|
+
},
|
|
4791
|
+
],
|
|
4792
|
+
});
|
|
4793
|
+
// Second in the chain declares none, so it empties the field rather
|
|
4794
|
+
// than letting the creator's filters stand.
|
|
4795
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4796
|
+
preRenderId: 'params-chain',
|
|
4797
|
+
liveboardId: 'second-lb',
|
|
4798
|
+
});
|
|
4799
|
+
await embed2.showPreRender();
|
|
4800
|
+
await executeAfterWait(() => {
|
|
4801
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
|
|
4802
|
+
});
|
|
4803
|
+
mockProcessTrigger.mockClear();
|
|
4804
|
+
// Third declares its own, and states them without reference to either
|
|
4805
|
+
// embed before it.
|
|
4806
|
+
const embed3 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4807
|
+
preRenderId: 'params-chain',
|
|
4808
|
+
liveboardId: 'third-lb',
|
|
4809
|
+
runtimeFilters: [
|
|
4810
|
+
{
|
|
4811
|
+
columnName: 'Region',
|
|
4812
|
+
operator: RuntimeFilterOp.EQ,
|
|
4813
|
+
values: ['North'],
|
|
4814
|
+
},
|
|
4815
|
+
],
|
|
4816
|
+
});
|
|
4817
|
+
await embed3.showPreRender();
|
|
4818
|
+
await executeAfterWait(() => {
|
|
4819
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4820
|
+
runtimeFilterParams: 'col1=Region&op1=EQ&val1=North',
|
|
4821
|
+
}), undefined);
|
|
4822
|
+
});
|
|
4823
|
+
});
|
|
4824
|
+
test('should carry the new config runtime parameters in UpdateEmbedParams', async () => {
|
|
4825
|
+
await setupPreRenderTest('params-parameters', {
|
|
4826
|
+
liveboardId: 'original-lb',
|
|
4827
|
+
runtimeParameters: [{ name: 'Region Param', value: 'East' }],
|
|
4828
|
+
});
|
|
4829
|
+
const runtimeParameters = [{ name: 'Region Param', value: 'West' }];
|
|
4830
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4831
|
+
preRenderId: 'params-parameters',
|
|
4832
|
+
liveboardId: 'original-lb',
|
|
4833
|
+
runtimeParameters,
|
|
4834
|
+
});
|
|
4835
|
+
embed2.showPreRender();
|
|
4836
|
+
await executeAfterWait(() => {
|
|
4837
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4838
|
+
runtimeParameters,
|
|
4839
|
+
runtimeParameterParams: 'param1=Region%20Param¶mVal1=West',
|
|
4840
|
+
}), undefined);
|
|
4841
|
+
// A parameter always carries a value, so the payload says
|
|
4842
|
+
// everything there is to say — no follow-up event.
|
|
4843
|
+
const parameterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === HostEvent.UpdateParameters);
|
|
4844
|
+
expect(parameterCalls).toHaveLength(0);
|
|
4845
|
+
});
|
|
4846
|
+
});
|
|
4847
|
+
test('should mark the params empty when the config declares no parameters', async () => {
|
|
4848
|
+
await setupPreRenderTest('params-clear-parameters', {
|
|
4849
|
+
liveboardId: 'original-lb',
|
|
4850
|
+
runtimeParameters: [{ name: 'Region Param', value: 'East' }],
|
|
4851
|
+
});
|
|
4852
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4853
|
+
preRenderId: 'params-clear-parameters',
|
|
4854
|
+
liveboardId: 'original-lb',
|
|
4855
|
+
});
|
|
4856
|
+
embed2.showPreRender();
|
|
4857
|
+
await executeAfterWait(() => {
|
|
4858
|
+
// Same gate as the filters: the container only reads this field
|
|
4859
|
+
// when it is truthy, so null would leave 'East' standing.
|
|
4860
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeParameterParams: '&' }), undefined);
|
|
4861
|
+
});
|
|
4862
|
+
});
|
|
4863
|
+
test('should keep an empty string parameter value distinct from having none', async () => {
|
|
4864
|
+
await setupPreRenderTest('params-empty-value', { liveboardId: 'original-lb' });
|
|
4865
|
+
// `paramVal1=` is that parameter's value, not an absence — so it must
|
|
4866
|
+
// not collapse to the empty marker.
|
|
4867
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4868
|
+
preRenderId: 'params-empty-value',
|
|
4869
|
+
liveboardId: 'original-lb',
|
|
4870
|
+
runtimeParameters: [{ name: 'Region Param', value: '' }],
|
|
4871
|
+
});
|
|
4872
|
+
embed2.showPreRender();
|
|
4873
|
+
await executeAfterWait(() => {
|
|
4874
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
4875
|
+
runtimeParameterParams: 'param1=Region%20Param¶mVal1=',
|
|
4876
|
+
}), undefined);
|
|
4877
|
+
});
|
|
4878
|
+
});
|
|
4879
|
+
test('should hand the pre-render over to the embed being shown', async () => {
|
|
4880
|
+
const embed1 = await setupPreRenderTest('take-over-state', { liveboardId: 'original-lb' });
|
|
4881
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4882
|
+
preRenderId: 'take-over-state',
|
|
4883
|
+
liveboardId: 'second-lb',
|
|
4884
|
+
});
|
|
4885
|
+
await embed2.showPreRender();
|
|
4886
|
+
// It connected to embed1's pre-render and is now what the wrapper
|
|
4887
|
+
// points at, so getPreRenderObj() means "what is showing".
|
|
4888
|
+
expect(embed2.getPreRenderObj()).toBe(embed2);
|
|
4889
|
+
expect(embed1.getPreRenderObj()).toBe(embed2);
|
|
4890
|
+
});
|
|
4891
|
+
test('should not strand callbacks when the container loads after the shown embed was hidden', async () => {
|
|
4892
|
+
// The creator is subscribed but the container has NOT announced itself
|
|
4893
|
+
// yet, which is the state a real pre-render starts in.
|
|
4894
|
+
const embed1 = await setupPreRenderTest('loaded-after-hide', { liveboardId: 'original-lb' });
|
|
4895
|
+
embed1.isEmbedContainerLoaded = false;
|
|
4896
|
+
// Second embed shows, takes the pre-render over, then is hidden — which
|
|
4897
|
+
// unsubscribes it, so it will never hear EmbedListenerReady itself.
|
|
4898
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4899
|
+
preRenderId: 'loaded-after-hide',
|
|
4900
|
+
liveboardId: 'second-lb',
|
|
4901
|
+
});
|
|
4902
|
+
await embed2.showPreRender();
|
|
4903
|
+
embed2.hidePreRender();
|
|
4904
|
+
expect(embed2.isEmbedContainerLoaded).toBe(false);
|
|
4905
|
+
// Container comes up and the creator hears it.
|
|
4906
|
+
embed1.createEmbedContainerHandler(EmbedEvent.EmbedListenerReady)();
|
|
4907
|
+
mockProcessTrigger.mockClear();
|
|
4908
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
4909
|
+
// A third embed reads the state off embed2, which owns the wrapper and
|
|
4910
|
+
// never learned the container was up. Reading a per-instance snapshot
|
|
4911
|
+
// here leaves UpdateEmbedParams queued forever and the pre-render stuck
|
|
4912
|
+
// on the previous liveboard.
|
|
4913
|
+
const embed3 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4914
|
+
preRenderId: 'loaded-after-hide',
|
|
4915
|
+
liveboardId: 'third-lb',
|
|
4916
|
+
});
|
|
4917
|
+
await embed3.showPreRender();
|
|
4918
|
+
expect(embed3.isEmbedContainerLoaded).toBe(true);
|
|
4919
|
+
await executeAfterWait(() => {
|
|
4920
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4921
|
+
expect(eventTypes).toContain(HostEvent.UpdateEmbedParams);
|
|
4922
|
+
}, 300);
|
|
4923
|
+
});
|
|
4924
|
+
test('should not reconcile runtime filters unless the view config opts in', async () => {
|
|
4925
|
+
await setupPreRenderTest('reconcile-flag-off', {
|
|
4926
|
+
liveboardId: 'original-lb',
|
|
4927
|
+
runtimeFilters: [
|
|
4928
|
+
{
|
|
4929
|
+
columnName: 'Color',
|
|
4930
|
+
operator: RuntimeFilterOp.IN,
|
|
4931
|
+
values: ['red', 'blue'],
|
|
4932
|
+
},
|
|
4933
|
+
],
|
|
4934
|
+
});
|
|
4935
|
+
// Same shape as the clear-filters case above, minus the flag: the
|
|
4936
|
+
// previous config left filters on the shared pre-render and this one
|
|
4937
|
+
// declares none. Without preRenderConfig.reconcileRuntimeParams the SDK
|
|
4938
|
+
// leaves that to the container, so no UpdateRuntimeFilters goes out.
|
|
4939
|
+
const embed2 = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4940
|
+
preRenderId: 'reconcile-flag-off',
|
|
4941
|
+
liveboardId: 'original-lb',
|
|
4942
|
+
});
|
|
4943
|
+
embed2.showPreRender();
|
|
4944
|
+
await executeAfterWait(() => {
|
|
4945
|
+
const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
|
|
4946
|
+
expect(eventTypes).toContain(HostEvent.UpdateEmbedParams);
|
|
4947
|
+
expect(eventTypes).not.toContain(HostEvent.UpdateRuntimeFilters);
|
|
4948
|
+
});
|
|
4949
|
+
});
|
|
4635
4950
|
test('should handle error when getUpdateEmbedParamsObject fails during showPreRender', async () => {
|
|
4636
4951
|
await setupPreRenderTest('error-test', { liveboardId: 'original-lb' });
|
|
4637
4952
|
const handleErrorSpy = jest.spyOn(LiveboardEmbed.prototype, 'handleError');
|
|
@@ -4991,7 +5306,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4991
5306
|
expect(hostElement.querySelector(`#${placeHolderId}`)).toBe(staleNestedPlaceholder);
|
|
4992
5307
|
// Before the fix this threw NotFoundError.
|
|
4993
5308
|
await expect(embed.showPreRender()).resolves.toBeDefined();
|
|
4994
|
-
// The stale nested placeholder is gone; the fresh one is a direct
|
|
5309
|
+
// The stale nested placeholder is gone; the fresh one is a direct
|
|
5310
|
+
// child.
|
|
4995
5311
|
expect(staleNestedPlaceholder.isConnected).toBe(false);
|
|
4996
5312
|
const currentPlaceholder = embed.getPreRenderPlaceHolderElement();
|
|
4997
5313
|
expect(currentPlaceholder.parentElement).toBe(hostElement);
|
|
@@ -5005,7 +5321,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
5005
5321
|
const tabsIsTyped = false;
|
|
5006
5322
|
const tabsHasContractFields = true;
|
|
5007
5323
|
const probeUnknownField = (r) =>
|
|
5008
|
-
// @ts-expect-error — field not on the GetTabs contract (was
|
|
5324
|
+
// @ts-expect-error — field not on the GetTabs contract (was
|
|
5325
|
+
// silent when `any`)
|
|
5009
5326
|
r.tabCount;
|
|
5010
5327
|
void probeUnknownField;
|
|
5011
5328
|
const reload = () => searchEmbed.trigger(HostEvent.Reload);
|
|
@@ -5015,4 +5332,135 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
5015
5332
|
});
|
|
5016
5333
|
});
|
|
5017
5334
|
});
|
|
5335
|
+
describe('excludeConfigFromURL', () => {
|
|
5336
|
+
const lbConfig = {
|
|
5337
|
+
liveboardId,
|
|
5338
|
+
hiddenActions: [Action.Download],
|
|
5339
|
+
additionalFlags: { internalBlinkFlag: true },
|
|
5340
|
+
liveboardV2: true,
|
|
5341
|
+
};
|
|
5342
|
+
const withPostMessage = (viewConfig) => ({
|
|
5343
|
+
...viewConfig,
|
|
5344
|
+
additionalFlags: { ...viewConfig.additionalFlags, excludeConfigFromURL: true },
|
|
5345
|
+
});
|
|
5346
|
+
const renderAndGetSrc = async (viewConfig) => {
|
|
5347
|
+
const embed = new LiveboardEmbed(getRootEl(), { ...defaultViewConfig, ...viewConfig });
|
|
5348
|
+
await embed.render();
|
|
5349
|
+
await waitFor(() => !!getIFrameEl());
|
|
5350
|
+
return { embed, src: getIFrameSrc() };
|
|
5351
|
+
};
|
|
5352
|
+
const signalFrameReady = () => {
|
|
5353
|
+
postMessageToParent(getIFrameEl().contentWindow, {
|
|
5354
|
+
type: EmbedEvent.EmbedListenerReady,
|
|
5355
|
+
});
|
|
5356
|
+
};
|
|
5357
|
+
beforeEach(() => {
|
|
5358
|
+
document.body.innerHTML = getDocumentBody();
|
|
5359
|
+
mockProcessTrigger.mockReset();
|
|
5360
|
+
mockProcessTrigger.mockResolvedValue({});
|
|
5361
|
+
init({
|
|
5362
|
+
thoughtSpotHost,
|
|
5363
|
+
authType: AuthType.None,
|
|
5364
|
+
});
|
|
5365
|
+
});
|
|
5366
|
+
test('leaves the URL untouched when the flag is not set', async () => {
|
|
5367
|
+
const { src } = await renderAndGetSrc(lbConfig);
|
|
5368
|
+
expect(src).toContain('hideAction=');
|
|
5369
|
+
expect(src).toContain('internalBlinkFlag=true');
|
|
5370
|
+
expect(src).toContain('isPinboardV2Enabled=true');
|
|
5371
|
+
});
|
|
5372
|
+
test('keeps only the bootstrap params on the URL when the flag is set', async () => {
|
|
5373
|
+
const { src } = await renderAndGetSrc(withPostMessage(lbConfig));
|
|
5374
|
+
// Boot and auth handshake stays on the URL.
|
|
5375
|
+
expect(src).toContain('hostAppUrl=');
|
|
5376
|
+
expect(src).toContain(`authType=${AuthType.None}`);
|
|
5377
|
+
expect(src).toContain(`sdkVersion=${version}`);
|
|
5378
|
+
expect(src).toContain('blockNonEmbedFullAppAccess=true');
|
|
5379
|
+
expect(src).toContain('viewPortHeight=');
|
|
5380
|
+
// View configuration and internal flags do not.
|
|
5381
|
+
expect(src).not.toContain('hideAction=');
|
|
5382
|
+
expect(src).not.toContain('internalBlinkFlag');
|
|
5383
|
+
expect(src).not.toContain('isPinboardV2Enabled');
|
|
5384
|
+
expect(src).not.toContain('enableDataPanelV2');
|
|
5385
|
+
});
|
|
5386
|
+
test('strips a non-bootstrap additionalFlag from the URL when the flag is set', async () => {
|
|
5387
|
+
const { src } = await renderAndGetSrc({
|
|
5388
|
+
...lbConfig,
|
|
5389
|
+
additionalFlags: {
|
|
5390
|
+
internalBlinkFlag: true,
|
|
5391
|
+
someCustomFlag: 'abc',
|
|
5392
|
+
excludeConfigFromURL: true,
|
|
5393
|
+
},
|
|
5394
|
+
});
|
|
5395
|
+
expect(src).not.toContain('internalBlinkFlag');
|
|
5396
|
+
expect(src).not.toContain('someCustomFlag');
|
|
5397
|
+
});
|
|
5398
|
+
test('keeps an additionalFlag that overrides a bootstrap param on the URL', async () => {
|
|
5399
|
+
const { src } = await renderAndGetSrc({
|
|
5400
|
+
...lbConfig,
|
|
5401
|
+
additionalFlags: { [Param.OverrideOrgId]: 42, excludeConfigFromURL: true },
|
|
5402
|
+
});
|
|
5403
|
+
expect(src).toContain(`${Param.OverrideOrgId}=42`);
|
|
5404
|
+
});
|
|
5405
|
+
test('keeps the deep-link route on the URL when the flag is set', async () => {
|
|
5406
|
+
const { src } = await renderAndGetSrc(withPostMessage(lbConfig));
|
|
5407
|
+
expect(src).toContain(`/embed/viz/${liveboardId}`);
|
|
5408
|
+
});
|
|
5409
|
+
test('sends the full config over UpdateEmbedParams once the frame is ready', async () => {
|
|
5410
|
+
await renderAndGetSrc(withPostMessage(lbConfig));
|
|
5411
|
+
signalFrameReady();
|
|
5412
|
+
await executeAfterWait(() => {
|
|
5413
|
+
expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
|
|
5414
|
+
liveboardId,
|
|
5415
|
+
hiddenActions: [Action.Download],
|
|
5416
|
+
internalBlinkFlag: true,
|
|
5417
|
+
[Param.HideActions]: expect.arrayContaining([Action.Download]),
|
|
5418
|
+
}), undefined);
|
|
5419
|
+
});
|
|
5420
|
+
});
|
|
5421
|
+
test('sends UpdateEmbedParams again every time the frame signals ready', async () => {
|
|
5422
|
+
await renderAndGetSrc(withPostMessage(lbConfig));
|
|
5423
|
+
signalFrameReady();
|
|
5424
|
+
signalFrameReady();
|
|
5425
|
+
await executeAfterWait(() => {
|
|
5426
|
+
const updateCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === HostEvent.UpdateEmbedParams);
|
|
5427
|
+
expect(updateCalls).toHaveLength(2);
|
|
5428
|
+
});
|
|
5429
|
+
});
|
|
5430
|
+
test('does not send UpdateEmbedParams when the flag is not set', async () => {
|
|
5431
|
+
await renderAndGetSrc(lbConfig);
|
|
5432
|
+
signalFrameReady();
|
|
5433
|
+
await executeAfterWait(() => {
|
|
5434
|
+
const updateCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === HostEvent.UpdateEmbedParams);
|
|
5435
|
+
expect(updateCalls).toHaveLength(0);
|
|
5436
|
+
});
|
|
5437
|
+
});
|
|
5438
|
+
test('does not double-send for a pre-rendered embed that is shown', async () => {
|
|
5439
|
+
mockMessageChannel();
|
|
5440
|
+
window.ResizeObserver =
|
|
5441
|
+
window.ResizeObserver ||
|
|
5442
|
+
jest.fn().mockImplementation(() => ({
|
|
5443
|
+
disconnect: jest.fn(),
|
|
5444
|
+
observe: jest.fn(),
|
|
5445
|
+
unobserve: jest.fn(),
|
|
5446
|
+
}));
|
|
5447
|
+
const embed = new LiveboardEmbed(getRootEl(), {
|
|
5448
|
+
...defaultViewConfig,
|
|
5449
|
+
...withPostMessage(lbConfig),
|
|
5450
|
+
preRenderId: 'send-config-post-message',
|
|
5451
|
+
});
|
|
5452
|
+
await embed.preRender();
|
|
5453
|
+
await waitFor(() => !!getIFrameEl());
|
|
5454
|
+
signalFrameReady();
|
|
5455
|
+
await executeAfterWait(() => {
|
|
5456
|
+
expect(embed.isEmbedContainerLoaded).toBe(true);
|
|
5457
|
+
});
|
|
5458
|
+
mockProcessTrigger.mockClear();
|
|
5459
|
+
await embed.showPreRender();
|
|
5460
|
+
await executeAfterWait(() => {
|
|
5461
|
+
const updateCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === HostEvent.UpdateEmbedParams);
|
|
5462
|
+
expect(updateCalls).toHaveLength(1);
|
|
5463
|
+
});
|
|
5464
|
+
});
|
|
5465
|
+
});
|
|
5018
5466
|
//# sourceMappingURL=ts-embed.spec.js.map
|