@qualified-salesforce/web 0.0.1-oidc-bootstrap
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/41842993ec71d6628e4949e9a22b146b.svg +3 -0
- package/7271f3433ed82fc7f56adcd9e30275f4.svg +17 -0
- package/LICENSE.txt +82 -0
- package/components/helpers/entriesStringValidations.js +69 -0
- package/components/helpers/languages.js +32 -0
- package/components/shared/assertUnreachable.js +5 -0
- package/components/shared/controls/imageCropperHelpers.js +43 -0
- package/components/shared/meetingLoadingProgressSpec.js +116 -0
- package/constants.generated.js +9883 -0
- package/css/widget/multimodal_v2/host.split-css.css +162 -0
- package/css/widget/multimodal_v2/index.split-css.panda.css +5240 -0
- package/css/widget/widget.split-css.css +100 -0
- package/fonts/inter/Inter-Black.woff +0 -0
- package/fonts/inter/Inter-Black.woff2 +0 -0
- package/fonts/inter/Inter-BlackItalic.woff +0 -0
- package/fonts/inter/Inter-BlackItalic.woff2 +0 -0
- package/fonts/inter/Inter-Bold.woff +0 -0
- package/fonts/inter/Inter-Bold.woff2 +0 -0
- package/fonts/inter/Inter-BoldItalic.woff +0 -0
- package/fonts/inter/Inter-BoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBold.woff +0 -0
- package/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLight.woff +0 -0
- package/fonts/inter/Inter-ExtraLight.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Italic.woff +0 -0
- package/fonts/inter/Inter-Italic.woff2 +0 -0
- package/fonts/inter/Inter-Light.woff +0 -0
- package/fonts/inter/Inter-Light.woff2 +0 -0
- package/fonts/inter/Inter-LightItalic.woff +0 -0
- package/fonts/inter/Inter-LightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Medium.woff +0 -0
- package/fonts/inter/Inter-Medium.woff2 +0 -0
- package/fonts/inter/Inter-MediumItalic.woff +0 -0
- package/fonts/inter/Inter-MediumItalic.woff2 +0 -0
- package/fonts/inter/Inter-Regular.woff +0 -0
- package/fonts/inter/Inter-Regular.woff2 +0 -0
- package/fonts/inter/Inter-SemiBold.woff +0 -0
- package/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-Thin.woff +0 -0
- package/fonts/inter/Inter-Thin.woff2 +0 -0
- package/fonts/inter/Inter-ThinItalic.woff +0 -0
- package/fonts/inter/Inter-ThinItalic.woff2 +0 -0
- package/fonts/inter/Inter-italic.var.woff2 +0 -0
- package/fonts/inter/Inter-roman.var.woff2 +0 -0
- package/images/close.js +63 -0
- package/images/logo.js +22 -0
- package/js/4101.js +19721 -0
- package/js/daily-esm.js +9948 -0
- package/js/date-fns.js +427 -0
- package/js/multimodal_v2.js +1653 -0
- package/js/runtime.js +109 -0
- package/media/Inter-Black.796be8d8bf.woff2 +0 -0
- package/media/Inter-Black.b254104c56.woff +0 -0
- package/media/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/media/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/media/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/media/Inter-Bold.b1234477a5.woff +0 -0
- package/media/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/media/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/media/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/media/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/media/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/media/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/media/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/media/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/media/Inter-Italic.9beab78452.woff +0 -0
- package/media/Inter-Italic.d593a8df79.woff2 +0 -0
- package/media/Inter-Light.27083fa637.woff2 +0 -0
- package/media/Inter-Light.91dfddd842.woff +0 -0
- package/media/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/media/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/media/Inter-Medium.dc792b508e.woff2 +0 -0
- package/media/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/media/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/media/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/media/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/media/Inter-Regular.f356e84aa0.woff +0 -0
- package/media/Inter-SemiBold.55027e4724.woff +0 -0
- package/media/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/media/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/media/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/media/Inter-Thin.16325d9b0f.woff +0 -0
- package/media/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/media/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/media/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/media/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/media/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/package.json +20 -0
- package/packs/widget/api/docking/docking_host.js +97 -0
- package/packs/widget/api/docking/index.js +294 -0
- package/packs/widget/api/docking/shared.js +164 -0
- package/packs/widget/api/docking/viewport_lock.js +488 -0
- package/packs/widget/api/docking/viewport_resize.js +1203 -0
- package/packs/widget/esm/fonts/Inter-Black.796be8d8bf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Black.b254104c56.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.b1234477a5.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.9beab78452.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.d593a8df79.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.27083fa637.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.91dfddd842.woff +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.dc792b508e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f356e84aa0.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.55027e4724.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.16325d9b0f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/packs/widget/esm/fonts/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/packs/widget/esm/index.js +183 -0
- package/packs/widget/esm/qualified.css +5502 -0
- package/routes/app/offers/scripts/OfferMainScript.js +154 -0
- package/routes/app/offers/scripts/constants.js +71 -0
- package/routes/app/offers/scripts/main/ButtonManager.js +65 -0
- package/routes/app/offers/scripts/main/FormManager.js +325 -0
- package/routes/app/offers/scripts/main/MainContext.js +19 -0
- package/routes/app/offers/scripts/main/OfferManager.js +91 -0
- package/routes/app/offers/scripts/main/TriggerManager.js +125 -0
- package/routes/app/offers/scripts/rendering/ContentManager.js +53 -0
- package/routes/app/offers/scripts/rendering/LocationManager.js +83 -0
- package/routes/app/offers/scripts/rendering/RenderedOffer.js +188 -0
- package/routes/app/offers/scripts/rendering/Renderer.js +69 -0
- package/routes/app/offers/scripts/rendering/RenderingInitializer.js +62 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManager.js +31 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerFooter.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerHeader.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerModal.js +117 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerSidebar.js +75 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationResult.js +43 -0
- package/routes/app/offers/scripts/rendering/animations/Animator.js +78 -0
- package/routes/app/offers/scripts/rendering/animations/BaseAnimationManager.js +25 -0
- package/routes/app/offers/scripts/rendering/lib/BaseComponent.js +106 -0
- package/routes/app/offers/scripts/rendering/lib/FormComponent.js +134 -0
- package/routes/app/offers/scripts/rendering/lib/OfferComponent.js +144 -0
- package/routes/app/offers/scripts/rendering/lib/ScrollbarWidth.js +27 -0
- package/routes/app/offers/scripts/rendering/lib/decorators.js +20 -0
- package/routes/app/offers/scripts/rendering/locations/CSSVarsManager.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/ElementResizeObserver.js +49 -0
- package/routes/app/offers/scripts/rendering/locations/footer.js +53 -0
- package/routes/app/offers/scripts/rendering/locations/header/AsyncBatchProcessor.js +70 -0
- package/routes/app/offers/scripts/rendering/locations/header/CSSTransitionObserver.js +182 -0
- package/routes/app/offers/scripts/rendering/locations/header/ElementStyleChangeObserver.js +138 -0
- package/routes/app/offers/scripts/rendering/locations/header/ExternalStyleManager.js +110 -0
- package/routes/app/offers/scripts/rendering/locations/header/Header.js +353 -0
- package/routes/app/offers/scripts/rendering/locations/header/InlineStyleManager.js +105 -0
- package/routes/app/offers/scripts/rendering/locations/header/MatchingElementsObserver.js +107 -0
- package/routes/app/offers/scripts/rendering/locations/header/NewElementsObserver.js +129 -0
- package/routes/app/offers/scripts/rendering/locations/header/RuleWrapper.js +46 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObservable.js +23 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObserver.js +61 -0
- package/routes/app/offers/scripts/rendering/locations/header/ShiftedElementsManager.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementManager.js +37 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementWrapper.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectorValue.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectors.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/StyleSelectorObserver.js +294 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/constants.js +21 -0
- package/routes/app/offers/scripts/rendering/locations/header/WindowResizeObserver.js +43 -0
- package/routes/app/offers/scripts/rendering/locations/header/utils.js +25 -0
- package/routes/app/offers/scripts/rendering/locations/popup.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/sidebar.js +21 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonModal.js +114 -0
- package/routes/app/offers/scripts/rendering/variations/FormBanner.js +214 -0
- package/routes/app/offers/scripts/rendering/variations/FormModal.js +325 -0
- package/routes/app/offers/scripts/rendering/variations/LinkBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/components/Body.js +29 -0
- package/routes/app/offers/scripts/rendering/variations/components/Button.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/DismissButton.js +39 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageBanner.js +110 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageModal.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/Headline.js +94 -0
- package/routes/app/offers/scripts/rendering/variations/components/MultiFieldForm.js +302 -0
- package/routes/app/offers/scripts/rendering/variations/components/Tooltip.js +74 -0
- package/routes/app/offers/scripts/rendering/variations/icons.js +15 -0
- package/routes/app/offers/scripts/utils.js +115 -0
- package/routes/app/offers/utils/HTMLUtils.js +10 -0
- package/routes/app/offers/utils/createTypeGuard.js +32 -0
- package/routes/app/offers/utils/promise-utils.js +22 -0
- package/routes/app/websiteBuilder/stores/storeHelpers.js +18 -0
- package/sounds/message-initial.mp3 +0 -0
- package/sounds/message-received.mp3 +0 -0
- package/sounds/message-sent.mp3 +0 -0
- package/src/arrays.js +15 -0
- package/src/audio.js +106 -0
- package/src/bounded-set.js +16 -0
- package/src/bounding_box_observer.js +129 -0
- package/src/decorators.js +29 -0
- package/src/dom.js +128 -0
- package/src/dom_roots.js +26 -0
- package/src/embedded_forms/EmbeddedForm.js +638 -0
- package/src/embedded_forms/QualifiedEmbeddedForm.js +51 -0
- package/src/embedded_forms/QualifiedFormField.js +137 -0
- package/src/embedded_forms/utils.js +17 -0
- package/src/graphql-types.js +1686 -0
- package/src/iframes.js +86 -0
- package/src/localstorage.js +43 -0
- package/src/mirror/Shipper.js +133 -0
- package/src/mirror/constants.generated.js +13 -0
- package/src/mirror/constants.js +238 -0
- package/src/mirror/shipper/ChangeQueue.js +155 -0
- package/src/mirror/shipper/DOMSerializer.js +392 -0
- package/src/mirror/shipper/observers.js +441 -0
- package/src/mirror/shipper/utils.js +98 -0
- package/src/mixins/disposable.js +125 -0
- package/src/mixins/injectable.js +37 -0
- package/src/personalizations/personalization-manager.js +110 -0
- package/src/personalizations/strategies/node-freezing-strategy.js +174 -0
- package/src/personalizations/utils.js +187 -0
- package/src/promises.js +107 -0
- package/src/proxy.js +144 -0
- package/src/qualified_root.js +35 -0
- package/src/query_params.js +55 -0
- package/src/shadow-dom-helper.js +63 -0
- package/src/singleton_host.js +39 -0
- package/src/smart_website/trigger.js +49 -0
- package/src/smart_website/utils.js +149 -0
- package/src/string.js +53 -0
- package/src/timezone.js +57 -0
- package/src/timing.js +49 -0
- package/src/type-utils.js +76 -0
- package/src/url-utils.js +102 -0
- package/src/url.js +50 -0
- package/src/utils.js +72 -0
- package/src/validation.js.js +29 -0
- package/src/validation_ts.js +6 -0
- package/vendor/actioncable/adapters.js +6 -0
- package/vendor/actioncable/connection.js +204 -0
- package/vendor/actioncable/connection_monitor.js +129 -0
- package/vendor/actioncable/consumer.js +91 -0
- package/vendor/actioncable/index.js +34 -0
- package/vendor/actioncable/internal.js +22 -0
- package/vendor/actioncable/logger.js +28 -0
- package/vendor/actioncable/subscription.js +93 -0
- package/vendor/actioncable/subscriptions.js +89 -0
- package/vendor/open-telemetry-idgenerator.js +43 -0
- package/widget/analytics/facebook_tracker.js +8 -0
- package/widget/analytics/google_analytics_tracker.js +83 -0
- package/widget/analytics/google_tag_manager_tracker.js +22 -0
- package/widget/analytics.js +58 -0
- package/widget/api_handler/api_handler.js +730 -0
- package/widget/api_handler/base_api_handler.js +249 -0
- package/widget/booker_intent_tracker.js +391 -0
- package/widget/booker_outcome_tracker.js +329 -0
- package/widget/capture_widget_exceptions.js +150 -0
- package/widget/channel.js +282 -0
- package/widget/composite_experience_adapter.js +101 -0
- package/widget/constants.generated.js +350 -0
- package/widget/constants.js +21 -0
- package/widget/container.js +193 -0
- package/widget/content_activity_emitter.js +36 -0
- package/widget/data360_visitor.js +67 -0
- package/widget/date_provider.js +11 -0
- package/widget/debug_mode_state.js +175 -0
- package/widget/dummy_module.js +9 -0
- package/widget/eloqua_visitor.js +17 -0
- package/widget/form_cta_booker_intent.js +246 -0
- package/widget/hubspot_visitor.js +39 -0
- package/widget/inline_meeting_booker_page.js +90 -0
- package/widget/local_state/abstract_local_state.js +38 -0
- package/widget/local_state/debug_state/abstract_debug_flow.js +29 -0
- package/widget/local_state/debug_state/custom_form_flow.js +14 -0
- package/widget/local_state/debug_state/hubspot_form_flow.js +19 -0
- package/widget/local_state/debug_state/hubspot_v4_form_flow.js +19 -0
- package/widget/local_state/debug_state/marketo_form_flow.js +20 -0
- package/widget/local_state/debug_state/pardot_form_flow.js +18 -0
- package/widget/local_state/debug_state.js +362 -0
- package/widget/local_state/trace_state.js +20 -0
- package/widget/location_provider.js +9 -0
- package/widget/marketo_visitor.js +39 -0
- package/widget/meetings/tracing/buttons_forms_triggering_tracer.js +124 -0
- package/widget/meetings/tracing/spans/button_spans.js +18 -0
- package/widget/meetings/tracing/spans/form_spans.js +11 -0
- package/widget/multimodal_v2/assets_preloader.js +97 -0
- package/widget/multimodal_v2/components/AppLayout.js +93 -0
- package/widget/multimodal_v2/components/CursorOverlay.js +93 -0
- package/widget/multimodal_v2/components/PointerRectOverlay.js +74 -0
- package/widget/multimodal_v2/components/app/Artifact.js +109 -0
- package/widget/multimodal_v2/components/app/Background.js +27 -0
- package/widget/multimodal_v2/components/app/CalendarLoadingContent.js +255 -0
- package/widget/multimodal_v2/components/app/Chat.js +39 -0
- package/widget/multimodal_v2/components/app/CookieConsentModal.js +149 -0
- package/widget/multimodal_v2/components/app/Foreground.js +48 -0
- package/widget/multimodal_v2/components/app/HiddenInput.js +41 -0
- package/widget/multimodal_v2/components/app/Input.js +72 -0
- package/widget/multimodal_v2/components/app/LightboxExperience.js +769 -0
- package/widget/multimodal_v2/components/app/LoadingOverlay.js +97 -0
- package/widget/multimodal_v2/components/app/Main.js +985 -0
- package/widget/multimodal_v2/components/app/MessengerButton.js +160 -0
- package/widget/multimodal_v2/components/app/Multimodal.js +17 -0
- package/widget/multimodal_v2/components/app/OverlayControls.js +79 -0
- package/widget/multimodal_v2/components/app/Preview.js +32 -0
- package/widget/multimodal_v2/components/app/PrivacyDisclosure.js +57 -0
- package/widget/multimodal_v2/components/app/RotateDeviceOverlay.js +70 -0
- package/widget/multimodal_v2/components/app/Toolbar.js +156 -0
- package/widget/multimodal_v2/components/chat/ChatComposer.js +129 -0
- package/widget/multimodal_v2/components/chat/ChatInputForm.js +398 -0
- package/widget/multimodal_v2/components/chat/ColdStartQuestions.js +354 -0
- package/widget/multimodal_v2/components/chat/ComposerErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/chat/PostCallSurvey.js +359 -0
- package/widget/multimodal_v2/components/chat/preview/FieldRequestRenderer.js +41 -0
- package/widget/multimodal_v2/components/chat/preview/PreviewMessageRenderer.js +60 -0
- package/widget/multimodal_v2/components/chat/preview/SharedOfferRenderer.js +143 -0
- package/widget/multimodal_v2/components/chat/preview/TextRenderer.js +27 -0
- package/widget/multimodal_v2/components/chat/preview/TimelinePreview.js +254 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventOfferRenderer.js +103 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventPickRenderer.js +148 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldEntryRenderer.js +84 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldRequestRenderer.js +56 -0
- package/widget/multimodal_v2/components/chat/timeline/InlinePrivacyDisclosure.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/LinkPreviewCard.js +70 -0
- package/widget/multimodal_v2/components/chat/timeline/MessageEntry.js +88 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentContentRenderer.js +30 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentDeckRenderer.js +279 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentVideoRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/ShareContentRenderer.js +59 -0
- package/widget/multimodal_v2/components/chat/timeline/SharedOfferRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/SystemRenderer.js +82 -0
- package/widget/multimodal_v2/components/chat/timeline/TextRenderer.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/Timeline.js +158 -0
- package/widget/multimodal_v2/components/debug/DebugMultimodalPanel.js +327 -0
- package/widget/multimodal_v2/components/decks/index.js +160 -0
- package/widget/multimodal_v2/components/field_request/BooleanField.js +77 -0
- package/widget/multimodal_v2/components/field_request/FieldComponents.js +69 -0
- package/widget/multimodal_v2/components/field_request/Form.js +87 -0
- package/widget/multimodal_v2/components/field_request/MultiPicklistField.js +240 -0
- package/widget/multimodal_v2/components/field_request/PicklistField.js +166 -0
- package/widget/multimodal_v2/components/field_request/SingleLineInputField.js +69 -0
- package/widget/multimodal_v2/components/field_request/TextField.js +37 -0
- package/widget/multimodal_v2/components/field_request/index.js +170 -0
- package/widget/multimodal_v2/components/helpers/AutoScroll.js +37 -0
- package/widget/multimodal_v2/components/helpers/ErrorBoundary.js +53 -0
- package/widget/multimodal_v2/components/helpers/FocusTrapDialog.js +26 -0
- package/widget/multimodal_v2/components/helpers/ImpressionTracker.js +94 -0
- package/widget/multimodal_v2/components/helpers/ListRenderer.js +37 -0
- package/widget/multimodal_v2/components/helpers/Localization.js +76 -0
- package/widget/multimodal_v2/components/helpers/Persisted.js +166 -0
- package/widget/multimodal_v2/components/helpers/RichText.js +358 -0
- package/widget/multimodal_v2/components/helpers/ScreenReaderHeading.js +17 -0
- package/widget/multimodal_v2/components/helpers/Thumbnail.js +190 -0
- package/widget/multimodal_v2/components/helpers/VisuallyHidden.js +41 -0
- package/widget/multimodal_v2/components/helpers/content_click_payloads.js +58 -0
- package/widget/multimodal_v2/components/helpers/useDraggable.js +103 -0
- package/widget/multimodal_v2/components/helpers/useTextOverflow.js +44 -0
- package/widget/multimodal_v2/components/lightbox_gather/index.js +741 -0
- package/widget/multimodal_v2/components/meetings/ArtifactEntryPoint.js +252 -0
- package/widget/multimodal_v2/components/meetings/MeetingAdditionalAttendees.js +325 -0
- package/widget/multimodal_v2/components/meetings/MeetingBookerEntry.js +100 -0
- package/widget/multimodal_v2/components/meetings/MeetingDetailsCard.js +99 -0
- package/widget/multimodal_v2/components/meetings/MeetingErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferEmailStep.js +239 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferFooter.js +104 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferSelectionStep.js +60 -0
- package/widget/multimodal_v2/components/meetings/MeetingRepHeader.js +222 -0
- package/widget/multimodal_v2/components/meetings/MeetingStepShell.js +92 -0
- package/widget/multimodal_v2/components/meetings/MeetingSummaryRail.js +515 -0
- package/widget/multimodal_v2/components/meetings/MeetingTimeSelector.js +603 -0
- package/widget/multimodal_v2/components/meetings/MonthDatePicker.js +422 -0
- package/widget/multimodal_v2/components/meetings/NavigationButtons.js +76 -0
- package/widget/multimodal_v2/components/meetings/TimeSlotHeader.js +357 -0
- package/widget/multimodal_v2/components/meetings/WeekViewHeader.js +20 -0
- package/widget/multimodal_v2/components/meetings/constants.js +7 -0
- package/widget/multimodal_v2/components/meetings/index.js +47 -0
- package/widget/multimodal_v2/components/meetings/utils.js +328 -0
- package/widget/multimodal_v2/components/multimodal/Audio.js +28 -0
- package/widget/multimodal_v2/components/multimodal/Controls.js +188 -0
- package/widget/multimodal_v2/components/multimodal/LiveVideo.js +63 -0
- package/widget/multimodal_v2/components/multimodal/MultiModalComponent.js +424 -0
- package/widget/multimodal_v2/components/multimodal/MultimodalAvatar.js +36 -0
- package/widget/multimodal_v2/components/multimodal/OrbAvatar.js +326 -0
- package/widget/multimodal_v2/components/multimodal/Status.js +220 -0
- package/widget/multimodal_v2/components/multimodal/VideoAvatar.js +24 -0
- package/widget/multimodal_v2/components/multimodal/VideoPreview.js +114 -0
- package/widget/multimodal_v2/components/multimodal/useAudioLevelMonitoring.js +96 -0
- package/widget/multimodal_v2/components/multimodal/useMultimodal.js +434 -0
- package/widget/multimodal_v2/components/presentations/index.js +372 -0
- package/widget/multimodal_v2/components/shared/Avatar.js +92 -0
- package/widget/multimodal_v2/components/shared/AvatarGroup.js +135 -0
- package/widget/multimodal_v2/components/shared/Button.js +245 -0
- package/widget/multimodal_v2/components/shared/ButtonGroup.js +133 -0
- package/widget/multimodal_v2/components/shared/ComposerForm.js +98 -0
- package/widget/multimodal_v2/components/shared/SpeakingIndicator.js +239 -0
- package/widget/multimodal_v2/components/shared/ThinkingAnimation.js +165 -0
- package/widget/multimodal_v2/components/shared/Tooltip.js +266 -0
- package/widget/multimodal_v2/components/shared/controls/Dropdown.js +79 -0
- package/widget/multimodal_v2/components/shared/controls/PillToggle.js +142 -0
- package/widget/multimodal_v2/components/shared/controls/TextArea.js +114 -0
- package/widget/multimodal_v2/components/shared/toolCallLabels.js +12 -0
- package/widget/multimodal_v2/components/slides/SlidesThumbnail.js +47 -0
- package/widget/multimodal_v2/components/slides/index.js +61 -0
- package/widget/multimodal_v2/constants.js +88 -0
- package/widget/multimodal_v2/host.split-css.js +2 -0
- package/widget/multimodal_v2/host.string.js +96 -0
- package/widget/multimodal_v2/images/icons.js +582 -0
- package/widget/multimodal_v2/images/posters/piper_low_res.jpg +0 -0
- package/widget/multimodal_v2/index.js +23 -0
- package/widget/multimodal_v2/index.panda.js +28 -0
- package/widget/multimodal_v2/index.split-css.panda.js +2 -0
- package/widget/multimodal_v2/inline_meeting_booker.js +182 -0
- package/widget/multimodal_v2/locales/cs.js +196 -0
- package/widget/multimodal_v2/locales/da.js +196 -0
- package/widget/multimodal_v2/locales/de.js +196 -0
- package/widget/multimodal_v2/locales/en.js +196 -0
- package/widget/multimodal_v2/locales/en_AU.js +197 -0
- package/widget/multimodal_v2/locales/en_GB.js +197 -0
- package/widget/multimodal_v2/locales/es.js +197 -0
- package/widget/multimodal_v2/locales/es_LA.js +196 -0
- package/widget/multimodal_v2/locales/fi.js +196 -0
- package/widget/multimodal_v2/locales/fr.js +197 -0
- package/widget/multimodal_v2/locales/fr_CA.js +196 -0
- package/widget/multimodal_v2/locales/id.js +196 -0
- package/widget/multimodal_v2/locales/index.js +48 -0
- package/widget/multimodal_v2/locales/it.js +196 -0
- package/widget/multimodal_v2/locales/ja.js +196 -0
- package/widget/multimodal_v2/locales/ko.js +196 -0
- package/widget/multimodal_v2/locales/nb.js +196 -0
- package/widget/multimodal_v2/locales/nl.js +196 -0
- package/widget/multimodal_v2/locales/pl.js +196 -0
- package/widget/multimodal_v2/locales/pt_BR.js +196 -0
- package/widget/multimodal_v2/locales/ru.js +196 -0
- package/widget/multimodal_v2/locales/sv.js +196 -0
- package/widget/multimodal_v2/locales/th.js +196 -0
- package/widget/multimodal_v2/locales/tr.js +196 -0
- package/widget/multimodal_v2/locales/vi.js +196 -0
- package/widget/multimodal_v2/locales/zh_CN.js +196 -0
- package/widget/multimodal_v2/locales/zh_TW.js +196 -0
- package/widget/multimodal_v2/multimodal.js +633 -0
- package/widget/multimodal_v2/multimodal_channel.js +195 -0
- package/widget/multimodal_v2/signals/active_conversation_signal.js +33 -0
- package/widget/multimodal_v2/signals/allowed_conversation_mode_signal.js +38 -0
- package/widget/multimodal_v2/signals/artifact_signal.js +22 -0
- package/widget/multimodal_v2/signals/layout_signal.js +98 -0
- package/widget/multimodal_v2/signals/messages_signal.js +207 -0
- package/widget/multimodal_v2/signals/ui_state_signal.js +128 -0
- package/widget/multimodal_v2/stable_bundle_src.js +44 -0
- package/widget/multimodal_v2/stores/ai_conversation_store.js +221 -0
- package/widget/multimodal_v2/stores/artifact_store.js +205 -0
- package/widget/multimodal_v2/stores/base_store.js +16 -0
- package/widget/multimodal_v2/stores/call_store.js +770 -0
- package/widget/multimodal_v2/stores/call_ui_adapter.js +225 -0
- package/widget/multimodal_v2/stores/debug_multimodal_scenario_store.js +471 -0
- package/widget/multimodal_v2/stores/decks_store.js +285 -0
- package/widget/multimodal_v2/stores/device_store.js +63 -0
- package/widget/multimodal_v2/stores/docking_store.js +62 -0
- package/widget/multimodal_v2/stores/field_request_store.js +326 -0
- package/widget/multimodal_v2/stores/meeting_store.js +477 -0
- package/widget/multimodal_v2/stores/participant_store.js +73 -0
- package/widget/multimodal_v2/stores/post_call_survey_store.js +160 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store.js +163 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store_v2.js +511 -0
- package/widget/multimodal_v2/stores/presentations_store.js +111 -0
- package/widget/multimodal_v2/stores/root_store.js +1919 -0
- package/widget/multimodal_v2/stores/screen_share_store.js +217 -0
- package/widget/multimodal_v2/stores/slides_store.js +21 -0
- package/widget/multimodal_v2/stores/translation_store.js +185 -0
- package/widget/multimodal_v2/stores/ui_store.js +496 -0
- package/widget/multimodal_v2/stores/waiting_store.js +159 -0
- package/widget/multimodal_v2/stores/website_navigation_store.js +767 -0
- package/widget/multimodal_v2/styled-system/css/conditions.js +34 -0
- package/widget/multimodal_v2/styled-system/css/css.js +48 -0
- package/widget/multimodal_v2/styled-system/css/cva.js +96 -0
- package/widget/multimodal_v2/styled-system/css/cx.js +13 -0
- package/widget/multimodal_v2/styled-system/css/index.js +15 -0
- package/widget/multimodal_v2/styled-system/css/sva.js +69 -0
- package/widget/multimodal_v2/styled-system/helpers.js +384 -0
- package/widget/multimodal_v2/styled-system/jsx/create-style-context.js +96 -0
- package/widget/multimodal_v2/styled-system/jsx/factory-helper.js +19 -0
- package/widget/multimodal_v2/styled-system/jsx/factory.js +111 -0
- package/widget/multimodal_v2/styled-system/jsx/index.js +12 -0
- package/widget/multimodal_v2/styled-system/jsx/is-valid-prop.js +22 -0
- package/widget/multimodal_v2/types.js +105 -0
- package/widget/multimodal_v2/utils/auto_scroller.js +157 -0
- package/widget/multimodal_v2/utils/flip_animation.js +124 -0
- package/widget/multimodal_v2/utils/focus_gate.js +237 -0
- package/widget/multimodal_v2/utils/locale.js +16 -0
- package/widget/multimodal_v2/utils/media_queries.js +30 -0
- package/widget/multimodal_v2/utils/multimodal_cache.js +19 -0
- package/widget/multimodal_v2/utils/mutation_effect.js +14 -0
- package/widget/multimodal_v2/utils/navigation_interceptor.js +205 -0
- package/widget/multimodal_v2/utils/navigation_strategies/dom_swap.js +393 -0
- package/widget/multimodal_v2/utils/navigation_strategies/index.js +12 -0
- package/widget/multimodal_v2/utils/navigation_strategies/lwr.js +61 -0
- package/widget/multimodal_v2/utils/navigation_strategies/navigation_utils.js +46 -0
- package/widget/multimodal_v2/utils/navigation_strategies/next_js.js +24 -0
- package/widget/multimodal_v2/utils/navigation_strategies/wouter_v3.js +15 -0
- package/widget/multimodal_v2/utils/objects_map.js +38 -0
- package/widget/multimodal_v2/utils/perceived_voice_turn_tracker.js +345 -0
- package/widget/multimodal_v2/utils/sanitize_html.js +132 -0
- package/widget/multimodal_v2/utils/signals.js +97 -0
- package/widget/multimodal_v2/utils/slide_zoom.js +114 -0
- package/widget/multimodal_v2/utils/theme_styles.js +137 -0
- package/widget/multimodal_v2/utils/url_observer.js +52 -0
- package/widget/multimodal_v2/utils/voice_onset_detector.js +127 -0
- package/widget/page_mirror.js +89 -0
- package/widget/page_view_activity_emitter.js +71 -0
- package/widget/pardot_visitor.js +137 -0
- package/widget/personalization_observer.js +96 -0
- package/widget/personalizations_config.js +160 -0
- package/widget/qualified_form/constants.js +23 -0
- package/widget/qualified_form/phone_utils.js +38 -0
- package/widget/qualified_form/qualified_form_action.js +91 -0
- package/widget/qualified_form/qualified_form_action_orchestrator.js +21 -0
- package/widget/qualified_form/qualified_form_api.js +471 -0
- package/widget/scroll_disabler.js +109 -0
- package/widget/server-logger.js +156 -0
- package/widget/smart_website_config.js +112 -0
- package/widget/telemetry/context.js +75 -0
- package/widget/telemetry/index.js +16 -0
- package/widget/telemetry/messenger_uptime.js +80 -0
- package/widget/telemetry/metrics.js +120 -0
- package/widget/telemetry/span.js +82 -0
- package/widget/telemetry/telemetry.js +180 -0
- package/widget/telemetry/tracer.js +41 -0
- package/widget/telemetry/tracing_store.js +310 -0
- package/widget/tracker.js +916 -0
- package/widget/utils/native_globals.js +129 -0
- package/widget/v1_adapter.js +50 -0
- package/widget/v2_adapter.js +368 -0
- package/widget/visitor/base_visitor_state.js +11 -0
- package/widget/visitor/cookie_visitor_state.js +128 -0
- package/widget/visitor/in_memory_visitor_state.js +29 -0
- package/widget/visitor/visitor_state.js +384 -0
- package/widget/visitor.js +356 -0
- package/widget/widget/linked_widget_v2.js +227 -0
- package/widget/widget/page_mirror_factory.js +22 -0
- package/widget/widget/sentry.js +130 -0
- package/widget/widget/widget.js +1698 -0
- package/widget/widget.split-css.js +2 -0
- package/widget/widget_bootstrap.js +97 -0
- package/widget/widget_object.js +73 -0
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../../../../js/runtime.js";
|
|
2
|
+
import "../../../utils/native_globals.js";
|
|
3
|
+
|
|
4
|
+
/* provided dependency */ var dom_swap_setTimeout = __webpack_require__(68034).pS;
|
|
5
|
+
/**
|
|
6
|
+
* DOM swap strategy.
|
|
7
|
+
* For traditional server-rendered pages. Fetches HTML, swaps body, runs scripts.
|
|
8
|
+
*/ const domSwapStrategy = {
|
|
9
|
+
needsInterceptor: true,
|
|
10
|
+
isApplicable: ()=>true,
|
|
11
|
+
navigate: async (url)=>navigateToUrlDomOnly(url.href)
|
|
12
|
+
};
|
|
13
|
+
/* export default */ const dom_swap = (domSwapStrategy);
|
|
14
|
+
/*
|
|
15
|
+
* ---------------------------------------------------------
|
|
16
|
+
* DOM swap implementation helpers
|
|
17
|
+
* This code is temporarily copied over from v1 multimodal widget to unblock
|
|
18
|
+
* trusted testers from using the v2 multimodal widget.
|
|
19
|
+
* ---------------------------------------------------------
|
|
20
|
+
*/ // Track what stylesheets or other elements we've injected
|
|
21
|
+
const MANAGED_ATTR = "data-qualified-x-managed";
|
|
22
|
+
let currentFetchController = null;
|
|
23
|
+
function isExecutableScript(el) {
|
|
24
|
+
const type = (el.getAttribute("type") || "").trim().toLowerCase();
|
|
25
|
+
return !type || type === "text/javascript" || type === "application/javascript" || type === "text/ecmascript" || type === "application/ecmascript" || type === "module";
|
|
26
|
+
}
|
|
27
|
+
function copyScriptAttrs(from, to, param) {
|
|
28
|
+
let { baseHref } = param;
|
|
29
|
+
for (const { name, value } of [
|
|
30
|
+
...from.attributes
|
|
31
|
+
]){
|
|
32
|
+
if (name.toLowerCase() !== "src") {
|
|
33
|
+
to.setAttribute(name, value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const src = from.getAttribute("src");
|
|
37
|
+
if (src) to.src = new URL(src, baseHref).href;
|
|
38
|
+
// Preserve execution semantics
|
|
39
|
+
const isModule = (to.getAttribute("type") || "").trim() === "module";
|
|
40
|
+
if (!isModule) {
|
|
41
|
+
// classic scripts execute in insertion order if async is false
|
|
42
|
+
if (!to.hasAttribute("async")) to.async = false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function loadMissingStylesheets(newDoc, baseUrl) {
|
|
46
|
+
const addedLoads = [];
|
|
47
|
+
// All stylesheets in new document
|
|
48
|
+
const newLinks = [
|
|
49
|
+
...newDoc.head.querySelectorAll('link[rel~="stylesheet"][href]')
|
|
50
|
+
];
|
|
51
|
+
// What the current page already has (full absolute URLs)
|
|
52
|
+
const existingHrefs = new Set([
|
|
53
|
+
...document.head.querySelectorAll('link[rel~="stylesheet"][href]')
|
|
54
|
+
].map((l)=>l.href));
|
|
55
|
+
// Add any missing <link rel="stylesheet"> tags and accumulate load promises.
|
|
56
|
+
for (const el of newLinks){
|
|
57
|
+
const href = el.getAttribute("href");
|
|
58
|
+
if (href) {
|
|
59
|
+
const absHref = new URL(href, baseUrl).href;
|
|
60
|
+
if (!existingHrefs.has(absHref)) {
|
|
61
|
+
const link = document.createElement("link");
|
|
62
|
+
link.rel = el.rel || "stylesheet";
|
|
63
|
+
link.href = absHref;
|
|
64
|
+
// copy a few useful attributes verbatim
|
|
65
|
+
for (const attr of [
|
|
66
|
+
"media",
|
|
67
|
+
"integrity",
|
|
68
|
+
"crossorigin",
|
|
69
|
+
"referrerpolicy",
|
|
70
|
+
"title",
|
|
71
|
+
"disabled"
|
|
72
|
+
]){
|
|
73
|
+
const val = el.getAttribute(attr);
|
|
74
|
+
if (val !== null) {
|
|
75
|
+
link.setAttribute(attr, val);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
link.setAttribute(MANAGED_ATTR, ""); // mark so we can clean it later if needed
|
|
79
|
+
addedLoads.push(new Promise((resolve)=>{
|
|
80
|
+
link.addEventListener("load", resolve, {
|
|
81
|
+
once: true
|
|
82
|
+
});
|
|
83
|
+
link.addEventListener("error", resolve, {
|
|
84
|
+
once: true
|
|
85
|
+
}); // don't block on errors
|
|
86
|
+
}));
|
|
87
|
+
document.head.appendChild(link);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Inline <style> tags
|
|
92
|
+
for (const el of newDoc.head.querySelectorAll("style")){
|
|
93
|
+
const dataKey = el.getAttribute("data-key");
|
|
94
|
+
const key = el.id || dataKey;
|
|
95
|
+
if (key) {
|
|
96
|
+
// only copy ones we can dedupe safely
|
|
97
|
+
const styleDataKey = el.getAttribute("data-key");
|
|
98
|
+
let selector;
|
|
99
|
+
if (el.id) {
|
|
100
|
+
selector = "style#" + CSS.escape(el.id);
|
|
101
|
+
} else if (styleDataKey) {
|
|
102
|
+
selector = 'style[data-key="' + CSS.escape(styleDataKey) + '"]';
|
|
103
|
+
}
|
|
104
|
+
if (selector && !document.head.querySelector(selector)) {
|
|
105
|
+
const style = document.createElement("style");
|
|
106
|
+
if (el.id) {
|
|
107
|
+
style.id = el.id;
|
|
108
|
+
}
|
|
109
|
+
if (styleDataKey !== null) {
|
|
110
|
+
style.setAttribute("data-key", styleDataKey);
|
|
111
|
+
}
|
|
112
|
+
style.setAttribute(MANAGED_ATTR, "");
|
|
113
|
+
style.textContent = el.textContent;
|
|
114
|
+
document.head.appendChild(style);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Remove previously managed styles that the new page doesn't want
|
|
119
|
+
const desired = new Set(newLinks.reduce((acc, el)=>{
|
|
120
|
+
const href = el.getAttribute("href");
|
|
121
|
+
if (href) {
|
|
122
|
+
acc.push(new URL(href, baseUrl).href);
|
|
123
|
+
}
|
|
124
|
+
return acc;
|
|
125
|
+
}, []));
|
|
126
|
+
for (const link of document.head.querySelectorAll('link[rel~="stylesheet"][href][' + MANAGED_ATTR + "]")){
|
|
127
|
+
const href = link.getAttribute("href");
|
|
128
|
+
if (href !== null && !desired.has(href)) {
|
|
129
|
+
link.remove();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return Promise.all(addedLoads);
|
|
133
|
+
}
|
|
134
|
+
async function prepareHeadScripts(newDoc, baseHref) {
|
|
135
|
+
// Remove our previously managed head scripts
|
|
136
|
+
for (const s of document.head.querySelectorAll("script[" + MANAGED_ATTR + "]"))s.remove();
|
|
137
|
+
const incoming = [
|
|
138
|
+
...newDoc.head.querySelectorAll("script")
|
|
139
|
+
];
|
|
140
|
+
// Intentionally do not dedupe external scripts; re-execute all on each navigation
|
|
141
|
+
// Defer inline head scripts until after body swap so they can see the new DOM
|
|
142
|
+
const deferredInline = [];
|
|
143
|
+
await incoming.reduce(async (prev, old)=>{
|
|
144
|
+
await prev;
|
|
145
|
+
if (!isExecutableScript(old)) return;
|
|
146
|
+
const s = document.createElement("script");
|
|
147
|
+
copyScriptAttrs(old, s, {
|
|
148
|
+
baseHref
|
|
149
|
+
});
|
|
150
|
+
s.setAttribute(MANAGED_ATTR, "");
|
|
151
|
+
if (s.src) {
|
|
152
|
+
await new Promise((resolve)=>{
|
|
153
|
+
s.addEventListener("load", resolve, {
|
|
154
|
+
once: true
|
|
155
|
+
});
|
|
156
|
+
s.addEventListener("error", resolve, {
|
|
157
|
+
once: true
|
|
158
|
+
});
|
|
159
|
+
document.head.appendChild(s);
|
|
160
|
+
});
|
|
161
|
+
} else {
|
|
162
|
+
// Dedupe inline head scripts by id or data-key if present
|
|
163
|
+
const dataKey = old.getAttribute("data-key");
|
|
164
|
+
const key = old.id || dataKey;
|
|
165
|
+
if (key) {
|
|
166
|
+
let selector = null;
|
|
167
|
+
if (old.id) selector = "script#" + CSS.escape(old.id);
|
|
168
|
+
else if (dataKey) selector = 'script[data-key="' + CSS.escape(dataKey) + '"]';
|
|
169
|
+
if (selector && document.head.querySelector(selector)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Defer execution until after body swap
|
|
174
|
+
deferredInline.push(old);
|
|
175
|
+
}
|
|
176
|
+
}, Promise.resolve());
|
|
177
|
+
// Return a runner that executes deferred inline head scripts in order
|
|
178
|
+
return async function runPreparedHeadInlineScripts() {
|
|
179
|
+
for (const old of deferredInline){
|
|
180
|
+
const s = document.createElement("script");
|
|
181
|
+
copyScriptAttrs(old, s, {
|
|
182
|
+
baseHref
|
|
183
|
+
});
|
|
184
|
+
s.setAttribute(MANAGED_ATTR, "");
|
|
185
|
+
// For classic scripts, wrap in an IIFE to avoid duplicate top-level const/let
|
|
186
|
+
// declaration errors across soft navigations. Module scripts already have
|
|
187
|
+
// their own scope and must keep import/export at the top level, so they
|
|
188
|
+
// must not be wrapped.
|
|
189
|
+
const code = old.textContent || "";
|
|
190
|
+
const isModule = (old.type || "").trim().toLowerCase() === "module";
|
|
191
|
+
s.textContent = isModule ? code : "(function(){\n" + code + "\n})();";
|
|
192
|
+
document.head.appendChild(s);
|
|
193
|
+
// inline executes immediately on insertion
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
async function executeBodyScripts(root, baseHref) {
|
|
198
|
+
const scripts = [
|
|
199
|
+
...root.querySelectorAll("script")
|
|
200
|
+
];
|
|
201
|
+
const waitForScript = (el, timeoutMs)=>{
|
|
202
|
+
if (timeoutMs === void 0) timeoutMs = 2e3;
|
|
203
|
+
return new Promise((resolve)=>{
|
|
204
|
+
const done = ()=>{
|
|
205
|
+
el.removeEventListener("load", done);
|
|
206
|
+
el.removeEventListener("error", done);
|
|
207
|
+
resolve();
|
|
208
|
+
};
|
|
209
|
+
el.addEventListener("load", done, {
|
|
210
|
+
once: true
|
|
211
|
+
});
|
|
212
|
+
el.addEventListener("error", done, {
|
|
213
|
+
once: true
|
|
214
|
+
});
|
|
215
|
+
// Ensure we never hang indefinitely on a stalled network request
|
|
216
|
+
dom_swap_setTimeout(done, timeoutMs);
|
|
217
|
+
});
|
|
218
|
+
};
|
|
219
|
+
for (const old of scripts){
|
|
220
|
+
const executable = isExecutableScript(old);
|
|
221
|
+
if (executable) {
|
|
222
|
+
const s = document.createElement("script");
|
|
223
|
+
copyScriptAttrs(old, s, {
|
|
224
|
+
baseHref
|
|
225
|
+
});
|
|
226
|
+
if (s.src) {
|
|
227
|
+
const completion = waitForScript(s, 2e3);
|
|
228
|
+
old.replaceWith(s); // insertion triggers fetch + exec
|
|
229
|
+
// eslint-disable-next-line no-await-in-loop -- Scripts must execute sequentially to preserve order
|
|
230
|
+
await completion;
|
|
231
|
+
} else {
|
|
232
|
+
// Wrap inline body scripts in an IIFE to avoid duplicate top-level const/let errors
|
|
233
|
+
// across soft navigations while still executing DOM-affecting code.
|
|
234
|
+
const code = old.textContent || "";
|
|
235
|
+
s.textContent = "(function(){\n" + code + "\n})();";
|
|
236
|
+
old.replaceWith(s); // executes inline immediately
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
// WordPress websites with lazy loaded images can get stuck after navigation. This is a hack to fix that.
|
|
243
|
+
// Heuristics:
|
|
244
|
+
// - Has data-lazy-* attributes (WordPress/VC convention)
|
|
245
|
+
// - CurrentSrc/src is a data: placeholder
|
|
246
|
+
function fixStuckLazyImage(img) {
|
|
247
|
+
try {
|
|
248
|
+
const cur = (img.currentSrc || img.src || "").trim();
|
|
249
|
+
const isPlaceholder = cur.startsWith("data:");
|
|
250
|
+
// If nothing suggests it's stuck, skip
|
|
251
|
+
if (!isPlaceholder) return;
|
|
252
|
+
const lazySrc = img.getAttribute("data-lazy-src") || img.getAttribute("data-src");
|
|
253
|
+
const lazySrcset = img.getAttribute("data-lazy-srcset") || img.getAttribute("data-srcset");
|
|
254
|
+
const lazySizes = img.getAttribute("data-lazy-sizes");
|
|
255
|
+
// If there are no lazy attributes, nothing to promote
|
|
256
|
+
if (!lazySrc && !lazySrcset && !lazySizes) return;
|
|
257
|
+
// Promote lazy attrs to real attrs
|
|
258
|
+
if (lazySrc) img.src = new URL(lazySrc, document.baseURI).href;
|
|
259
|
+
if (lazySrcset) img.srcset = lazySrcset;
|
|
260
|
+
if (lazySizes) img.sizes = lazySizes;
|
|
261
|
+
// Remove attributes that keep CSS hiding rules active
|
|
262
|
+
if (img.hasAttribute("data-lazy-src")) img.removeAttribute("data-lazy-src");
|
|
263
|
+
if (img.hasAttribute("data-lazy-srcset")) img.removeAttribute("data-lazy-srcset");
|
|
264
|
+
if (img.hasAttribute("data-lazy-sizes")) img.removeAttribute("data-lazy-sizes");
|
|
265
|
+
if (img.hasAttribute("data-src")) img.removeAttribute("data-src");
|
|
266
|
+
if (img.hasAttribute("data-srcset")) img.removeAttribute("data-srcset");
|
|
267
|
+
} catch (unused) {
|
|
268
|
+
// ignore failures
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// WordPress websites with lazy loaded images can get stuck after navigation. This is a hack to fix that.
|
|
272
|
+
// Example: https://www.litmos.com/explore/lms-101-guide
|
|
273
|
+
function rehydrateStuckLazyImages() {
|
|
274
|
+
try {
|
|
275
|
+
const imgs = Array.from(document.querySelectorAll("img[data-lazy-src], img[data-lazy-srcset], img[data-lazy-sizes]"));
|
|
276
|
+
imgs.forEach(fixStuckLazyImage);
|
|
277
|
+
} catch (unused) {
|
|
278
|
+
// ignore failures
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Perform navigation that updates URL/title, loads CSS, and swaps the body only.
|
|
282
|
+
// Returns a runner to execute scripts and lifecycle events when you're ready.
|
|
283
|
+
async function navigateDomOnly(url, param) {
|
|
284
|
+
let { history = "none", signal, scroll = "top" } = param === void 0 ? {} : param;
|
|
285
|
+
var _newDoc_head_querySelector, _window_qualified_sentinel, _window_qualified;
|
|
286
|
+
// Abort previous fetch if we're doing a non-Navigation-API nav
|
|
287
|
+
let controller;
|
|
288
|
+
if (!signal) {
|
|
289
|
+
if (currentFetchController) {
|
|
290
|
+
currentFetchController.abort();
|
|
291
|
+
}
|
|
292
|
+
controller = new AbortController();
|
|
293
|
+
currentFetchController = controller;
|
|
294
|
+
signal = controller.signal;
|
|
295
|
+
}
|
|
296
|
+
// Fetch the page (follow redirects); use final response URL for history/base
|
|
297
|
+
const response = await fetch(url, {
|
|
298
|
+
credentials: "same-origin",
|
|
299
|
+
redirect: "follow",
|
|
300
|
+
signal
|
|
301
|
+
});
|
|
302
|
+
if (!response.ok) {
|
|
303
|
+
throw new Error("Fetch failed: " + response.status + " " + response.statusText);
|
|
304
|
+
}
|
|
305
|
+
const html = await response.text();
|
|
306
|
+
const effectiveUrl = response.url || url;
|
|
307
|
+
// Parse the HTML
|
|
308
|
+
const newDoc = new DOMParser().parseFromString(html, "text/html");
|
|
309
|
+
// Compute base href for resolving relative URLs (e.g., <script src> resolution)
|
|
310
|
+
const href = (_newDoc_head_querySelector = newDoc.head.querySelector("base[href]")) == null ? void 0 : _newDoc_head_querySelector.getAttribute("href");
|
|
311
|
+
const baseHref = href ? new URL(href, effectiveUrl).href : effectiveUrl;
|
|
312
|
+
// Update URL/title if this path is managing history itself (fallback mode)
|
|
313
|
+
if (history === "push") {
|
|
314
|
+
window.history.pushState({
|
|
315
|
+
__live: true
|
|
316
|
+
}, "", effectiveUrl);
|
|
317
|
+
} else if (history === "replace") {
|
|
318
|
+
window.history.replaceState({
|
|
319
|
+
__live: true
|
|
320
|
+
}, "", effectiveUrl);
|
|
321
|
+
}
|
|
322
|
+
if (newDoc.title) {
|
|
323
|
+
document.title = newDoc.title;
|
|
324
|
+
}
|
|
325
|
+
// Insert any missing stylesheets from the new <head> into our <head>. Wait so we don't FOUC.
|
|
326
|
+
await loadMissingStylesheets(newDoc, effectiveUrl);
|
|
327
|
+
// Scroll to top of the page before replacing body so we don't FOUC
|
|
328
|
+
if (scroll === "top") {
|
|
329
|
+
window.scrollTo(0, 0);
|
|
330
|
+
}
|
|
331
|
+
(_window_qualified = window.qualified) == null ? void 0 : (_window_qualified_sentinel = _window_qualified.sentinel) == null ? void 0 : _window_qualified_sentinel.abort();
|
|
332
|
+
const offerHosts = Array.from(document.body.querySelectorAll("[id^='_qualified-offer-host']"));
|
|
333
|
+
for (const el of offerHosts)el.remove();
|
|
334
|
+
// Use the NEW body attributes, not the old ones
|
|
335
|
+
const newBodyAttrs = [
|
|
336
|
+
...newDoc.body.attributes
|
|
337
|
+
].map((a)=>[
|
|
338
|
+
a.name,
|
|
339
|
+
a.value
|
|
340
|
+
]);
|
|
341
|
+
document.body.innerHTML = newDoc.body.innerHTML;
|
|
342
|
+
for (const [name, value] of newBodyAttrs){
|
|
343
|
+
document.body.setAttribute(name, value);
|
|
344
|
+
}
|
|
345
|
+
for(let i = offerHosts.length - 1; i >= 0; i--){
|
|
346
|
+
document.body.insertBefore(offerHosts[i], document.body.firstElementChild);
|
|
347
|
+
}
|
|
348
|
+
// Return a runner that, when invoked, loads and executes scripts and fires lifecycle events
|
|
349
|
+
const runScripts = async ()=>{
|
|
350
|
+
// Prepare head scripts and capture a runner for deferred inline head scripts
|
|
351
|
+
const runPreparedHeadInlineScripts = await prepareHeadScripts(newDoc, baseHref);
|
|
352
|
+
// Execute body scripts in DOM order
|
|
353
|
+
await executeBodyScripts(document.body, baseHref);
|
|
354
|
+
// Execute prepared inline head scripts now that the new DOM is in place
|
|
355
|
+
await runPreparedHeadInlineScripts();
|
|
356
|
+
// Lifecycle events (soft navigation)
|
|
357
|
+
try {
|
|
358
|
+
// Fire synthetic DOMContentLoaded so libs relying on it can re-init
|
|
359
|
+
document.dispatchEvent(new Event("DOMContentLoaded", {
|
|
360
|
+
bubbles: true
|
|
361
|
+
}));
|
|
362
|
+
// Also fire load/pageshow for libraries that hook later lifecycle
|
|
363
|
+
window.dispatchEvent(new Event("load"));
|
|
364
|
+
window.dispatchEvent(new Event("pageshow"));
|
|
365
|
+
} catch (unused) {
|
|
366
|
+
// ignore lifecycle dispatch errors
|
|
367
|
+
}
|
|
368
|
+
// Sometimes lazy loaded images get stuck after navigation. This is a hack to fix that.
|
|
369
|
+
// Example: https://www.litmos.com/explore/lms-101-guide
|
|
370
|
+
rehydrateStuckLazyImages();
|
|
371
|
+
// Alert the qualified widget that the page has changed
|
|
372
|
+
// TODO: We should not go through the public API here and utilize the widgetObject patterns
|
|
373
|
+
// instead once we refactor all our stores and state.
|
|
374
|
+
window.qualified("page");
|
|
375
|
+
};
|
|
376
|
+
return {
|
|
377
|
+
runScripts
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Navigate to a URL using soft navigation (DOM-only, no full page reload).
|
|
382
|
+
* Returns a function that, when called, executes scripts and fires lifecycle events.
|
|
383
|
+
*/ async function navigateToUrlDomOnly(url) {
|
|
384
|
+
const { runScripts } = await navigateDomOnly(url, {
|
|
385
|
+
history: "push",
|
|
386
|
+
scroll: "top"
|
|
387
|
+
});
|
|
388
|
+
return runScripts;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
var dom_swap_navigateToUrlDomOnly = /* unused export */ undefined;
|
|
392
|
+
export { dom_swap_navigateToUrlDomOnly as navigateToUrlDomOnly };
|
|
393
|
+
export default dom_swap;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export { default as domSwapStrategy } from "./dom_swap.js";
|
|
9
|
+
export { findElementWithText, isSameOrigin } from "./navigation_utils.js";
|
|
10
|
+
export { lwrStrategy } from "./lwr.js";
|
|
11
|
+
export { nextJsStrategy } from "./next_js.js";
|
|
12
|
+
export { wouterV3Strategy } from "./wouter_v3.js";
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* For Salesforce Lightning Web Runtime (LWR) sites — e.g. Experience Cloud /
|
|
3
|
+
* Communities sites built on the `webruntime` framework.
|
|
4
|
+
*
|
|
5
|
+
* LWR's `webruntime/clientHook` installs a window-level "click" listener that:
|
|
6
|
+
* - Finds the nearest `<a>` in `event.composedPath()`.
|
|
7
|
+
* - If `routingService.router.matchRoute(href)` succeeds, calls
|
|
8
|
+
* `event.preventDefault()` and dispatches
|
|
9
|
+
* `routingService.navigate({ type: "standard__webPage", attributes: { url } })`.
|
|
10
|
+
*
|
|
11
|
+
* We trigger that flow by synthesizing a click on a temporary anchor.
|
|
12
|
+
*
|
|
13
|
+
* We use `dispatchEvent(new MouseEvent(...))` rather than `.click()` so that
|
|
14
|
+
* if LWR doesn't accept the navigation (e.g. unknown route), the browser
|
|
15
|
+
* does NOT silently fire its default action and trigger a hard reload —
|
|
16
|
+
* we throw so the caller's fallback (e.g. `window.location.href = url`)
|
|
17
|
+
* handles it explicitly.
|
|
18
|
+
*
|
|
19
|
+
* Going through the LWR router (instead of DOM-swapping the new page) also
|
|
20
|
+
* avoids re-executing LWR's bootstrap scripts, which is what produces
|
|
21
|
+
* `Cannot redefine property: originalDomApis` and
|
|
22
|
+
* `Cannot add property bootstrapModule, object is not extensible` —
|
|
23
|
+
* `window.LWR` is `Object.freeze`d on first load and synthetic-shadow
|
|
24
|
+
* registers globals as non-configurable.
|
|
25
|
+
*/ const lwrStrategy = {
|
|
26
|
+
needsInterceptor: false,
|
|
27
|
+
isApplicable: ()=>isLwrApp(),
|
|
28
|
+
navigate: async (url)=>{
|
|
29
|
+
const a = document.createElement("a");
|
|
30
|
+
// Pass the path/query/hash through as-is and let LWR's router decide
|
|
31
|
+
// what to do with the fragment. We previously tried to strip and
|
|
32
|
+
// re-apply the hash, but `routingService.navigate()` is async — setting
|
|
33
|
+
// `window.location.hash` afterwards races with LWR's own URL updates and
|
|
34
|
+
// can produce duplicate history entries — so the "do less" version is
|
|
35
|
+
// safer until we have a concrete repro of fragment handling actually
|
|
36
|
+
// breaking on a real LWR site.
|
|
37
|
+
a.setAttribute("href", url.pathname + url.search + url.hash);
|
|
38
|
+
a.style.display = "none";
|
|
39
|
+
document.body.appendChild(a);
|
|
40
|
+
try {
|
|
41
|
+
const event = new MouseEvent("click", {
|
|
42
|
+
bubbles: true,
|
|
43
|
+
cancelable: true,
|
|
44
|
+
composed: true
|
|
45
|
+
});
|
|
46
|
+
a.dispatchEvent(event);
|
|
47
|
+
if (!event.defaultPrevented) {
|
|
48
|
+
throw new Error("LWR router did not handle navigation to " + url.href);
|
|
49
|
+
}
|
|
50
|
+
} finally{
|
|
51
|
+
a.remove();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
function isLwrApp() {
|
|
56
|
+
return Boolean(window.LWR && typeof window.LWR.define === "function");
|
|
57
|
+
}
|
|
58
|
+
/* export default */ const lwr = (lwrStrategy);
|
|
59
|
+
|
|
60
|
+
export { lwr as lwrStrategy };
|
|
61
|
+
export default lwr;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../../../../js/runtime.js";
|
|
2
|
+
import "../../../utils/native_globals.js";
|
|
3
|
+
|
|
4
|
+
/* provided dependency */ var navigation_utils_setTimeout = __webpack_require__(68034).pS;
|
|
5
|
+
const isSameOrigin = (url)=>{
|
|
6
|
+
return url.origin === window.location.origin;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Helper function to find an element containing the specified text, with retries.
|
|
10
|
+
*/ async function findElementWithText(text, options) {
|
|
11
|
+
if (options === void 0) options = {};
|
|
12
|
+
const { maxAttempts = 3, delayMs = 500 } = options;
|
|
13
|
+
// Search for the text in headings (h1-h6), paragraphs, and list items
|
|
14
|
+
const selectors = [
|
|
15
|
+
"h1",
|
|
16
|
+
"h2",
|
|
17
|
+
"h3",
|
|
18
|
+
"h4",
|
|
19
|
+
"h5",
|
|
20
|
+
"h6",
|
|
21
|
+
"p",
|
|
22
|
+
"li"
|
|
23
|
+
];
|
|
24
|
+
const tryFindOnce = ()=>{
|
|
25
|
+
for (const selector of selectors){
|
|
26
|
+
const elements = document.querySelectorAll(selector);
|
|
27
|
+
for (const element of elements){
|
|
28
|
+
var _element_textContent;
|
|
29
|
+
if ((_element_textContent = element.textContent) == null ? void 0 : _element_textContent.includes(text)) {
|
|
30
|
+
return element;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
};
|
|
36
|
+
const sleep = (ms)=>new Promise((resolve)=>navigation_utils_setTimeout(resolve, ms));
|
|
37
|
+
async function attempt(remaining) {
|
|
38
|
+
const found = tryFindOnce();
|
|
39
|
+
if (found || remaining <= 1) return found;
|
|
40
|
+
await sleep(delayMs);
|
|
41
|
+
return attempt(remaining - 1);
|
|
42
|
+
}
|
|
43
|
+
return attempt(maxAttempts);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { findElementWithText, isSameOrigin };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* For Next.js sites (pages router). DOM-swapping a Next page produces a
|
|
3
|
+
* broken result: the bundles in `/_next/static/` are module scripts that
|
|
4
|
+
* the browser dedupes by URL, so re-inserting them is a no-op and the app
|
|
5
|
+
* never re-bootstraps. The React root we replaced via `body.innerHTML` is
|
|
6
|
+
* gone, `__NEXT_DATA__` is stale relative to what booted on first load,
|
|
7
|
+
* and the page renders without text/nav/hydration.
|
|
8
|
+
*
|
|
9
|
+
* When the current page is the same Next app, `window.next.router.push`
|
|
10
|
+
* navigates client-side cleanly without tearing down the widget.
|
|
11
|
+
*/ const nextJsStrategy = {
|
|
12
|
+
needsInterceptor: false,
|
|
13
|
+
isApplicable: ()=>{
|
|
14
|
+
var _window_next_router, _window_next;
|
|
15
|
+
return typeof ((_window_next = window.next) == null ? void 0 : (_window_next_router = _window_next.router) == null ? void 0 : _window_next_router.push) === "function";
|
|
16
|
+
},
|
|
17
|
+
navigate: async (url)=>{
|
|
18
|
+
await window.next.router.push(url.pathname + url.search + url.hash);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/* export default */ const next_js = (nextJsStrategy);
|
|
22
|
+
|
|
23
|
+
export { next_js as nextJsStrategy };
|
|
24
|
+
export default next_js;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* For SPAs using wouter - pushes to history and wouter handles the rest.
|
|
3
|
+
* Example: saastrannual2026.com
|
|
4
|
+
*/ const WOUTER_V3_SYMBOL = Symbol.for("wouter_v3");
|
|
5
|
+
const wouterV3Strategy = {
|
|
6
|
+
needsInterceptor: false,
|
|
7
|
+
isApplicable: ()=>Boolean(window[WOUTER_V3_SYMBOL]),
|
|
8
|
+
navigate: async (url)=>{
|
|
9
|
+
window.history.pushState(null, "", url.pathname + url.search + url.hash);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/* export default */ const wouter_v3 = (wouterV3Strategy);
|
|
13
|
+
|
|
14
|
+
export { wouter_v3 as wouterV3Strategy };
|
|
15
|
+
export default wouter_v3;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
class ObjectsMap {
|
|
2
|
+
getOrSet(objects, factory) {
|
|
3
|
+
const key = this.getKey(objects);
|
|
4
|
+
let value = this.map.get(key);
|
|
5
|
+
if (!value) {
|
|
6
|
+
value = factory(objects);
|
|
7
|
+
this.map.set(key, value);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
getKey(objects) {
|
|
12
|
+
this.buffer.length = objects.length;
|
|
13
|
+
for(let i = 0; i < objects.length; i++){
|
|
14
|
+
this.buffer[i] = this.getId(objects[i]);
|
|
15
|
+
}
|
|
16
|
+
return this.buffer.sort((a, b)=>a - b).join(",");
|
|
17
|
+
}
|
|
18
|
+
getId(object) {
|
|
19
|
+
if (ObjectsMap.ID_SYMBOL in object) {
|
|
20
|
+
return object[ObjectsMap.ID_SYMBOL];
|
|
21
|
+
}
|
|
22
|
+
// Assign ID atomically by reading current value before incrementing
|
|
23
|
+
const id = ObjectsMap.idCounter;
|
|
24
|
+
ObjectsMap.idCounter = id + 1;
|
|
25
|
+
Object.assign(object, {
|
|
26
|
+
[ObjectsMap.ID_SYMBOL]: id
|
|
27
|
+
});
|
|
28
|
+
return id;
|
|
29
|
+
}
|
|
30
|
+
constructor(){
|
|
31
|
+
this.map = new Map();
|
|
32
|
+
this.buffer = [];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
ObjectsMap.ID_SYMBOL = Symbol("q.utils.objects_map.id");
|
|
36
|
+
ObjectsMap.idCounter = 0;
|
|
37
|
+
|
|
38
|
+
export { ObjectsMap };
|